[med-svn] [jellyfish] 02/05: Imported Upstream version 2.1.4

Andreas Tille tille at debian.org
Sat Oct 4 17:38:56 UTC 2014


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

tille pushed a commit to branch master
in repository jellyfish.

commit 91d6a380c7ce711ffd2f54741c0964d96b7da009
Author: Andreas Tille <tille at debian.org>
Date:   Sat Oct 4 19:07:45 2014 +0200

    Imported Upstream version 2.1.4
---
 .gitignore                                         |    15 +
 CHANGES                                            |    13 +
 Makefile.am                                        |   327 +-
 Makefile.in                                        |  1826 --
 Makefile.simple                                    |    40 +
 README                                             |    22 +-
 README.md                                          |    32 +
 aclocal.m4                                         |  1033 -
 config.guess                                       |  1530 --
 config.h.in                                        |    90 -
 config.sub                                         |  1773 --
 configure                                          | 18209 -----------------
 configure.ac                                       |    64 +-
 depcomp                                            |   708 -
 development.mk                                     |    22 +
 doc/Makefile                                       |    37 +
 doc/UserGuide.lyx                                  |  1515 ++
 doc/generate_options_tex.sh                        |     7 +
 doc/help_parse.rb                                  |   451 +
 doc/help_parse.treetop                             |    52 +
 doc/jellyfish.html                                 |   802 +
 doc/jellyfish.tex                                  |   205 +
 doc/option_to_tex                                  |    35 +
 doc/options.tex                                    |   210 +
 doc/transfile                                      |    19 +
 examples/README                                    |    15 +
 examples/count_in_file/Makefile                    |     7 +
 examples/count_in_file/README                      |    40 +
 examples/count_in_file/count_in_file.cc            |   158 +
 examples/query_per_sequence/Makefile               |    10 +
 examples/query_per_sequence/README                 |    18 +
 examples/query_per_sequence/query_per_sequence.cc  |    86 +
 examples/query_per_sequence/sequence_mers.hpp      |    99 +
 gtest.mk                                           |    49 +-
 .../reversible_hash_function.hpp => header-license |     7 -
 include/jellyfish/allocators_mmap.hpp              |    78 +
 include/jellyfish/atomic_bits_array.hpp            |   202 +
 include/jellyfish/atomic_field.hpp                 |   157 +
 {jellyfish => include/jellyfish}/atomic_gcc.hpp    |     2 +-
 {jellyfish => include/jellyfish}/backtrace.hpp     |     0
 include/jellyfish/binary_dumper.hpp                |   224 +
 include/jellyfish/bloom_common.hpp                 |   129 +
 include/jellyfish/bloom_counter2.hpp               |   221 +
 include/jellyfish/bloom_filter.hpp                 |   164 +
 include/jellyfish/circular_buffer.hpp              |   200 +
 include/jellyfish/compare_and_swap.hpp             |    80 +
 include/jellyfish/cooperative_pool.hpp             |   258 +
 include/jellyfish/cooperative_pool2.hpp            |   283 +
 include/jellyfish/cpp_array.hpp                    |   156 +
 include/jellyfish/divisor.hpp                      |   150 +
 include/jellyfish/dumper.hpp                       |   103 +
 include/jellyfish/err.hpp                          |    99 +
 include/jellyfish/file_header.hpp                  |   112 +
 include/jellyfish/generator_manager.hpp            |   163 +
 include/jellyfish/generic_file_header.hpp          |   255 +
 include/jellyfish/hash_counter.hpp                 |   244 +
 include/jellyfish/int128.hpp                       |   203 +
 include/jellyfish/jellyfish.hpp                    |    37 +
 include/jellyfish/json.h                           |  1855 ++
 include/jellyfish/large_hash_array.hpp             |   994 +
 include/jellyfish/large_hash_iterator.hpp          |   260 +
 include/jellyfish/locks_pthread.hpp                |   211 +
 include/jellyfish/mapped_file.hpp                  |   220 +
 include/jellyfish/mer_dna.hpp                      |   729 +
 include/jellyfish/mer_dna_bloom_counter.hpp        |    50 +
 include/jellyfish/mer_heap.hpp                     |   115 +
 include/jellyfish/mer_iterator.hpp                 |   100 +
 include/jellyfish/mer_overlap_sequence_parser.hpp  |   241 +
 include/jellyfish/mer_qual_iterator.hpp            |   118 +
 include/jellyfish/misc.hpp                         |   247 +
 include/jellyfish/offsets_key_value.hpp            |   277 +
 include/jellyfish/rectangular_binary_matrix.hpp    |   379 +
 .../jellyfish}/simple_circular_buffer.hpp          |    14 +-
 include/jellyfish/sorted_dumper.hpp                |   115 +
 include/jellyfish/stdio_filebuf.hpp                |   170 +
 {jellyfish => include/jellyfish}/storage.hpp       |     4 +-
 include/jellyfish/stream_iterator.hpp              |    90 +
 include/jellyfish/stream_manager.hpp               |   157 +
 include/jellyfish/text_dumper.hpp                  |    88 +
 {jellyfish => include/jellyfish}/thread_exec.hpp   |     2 +
 {jellyfish => include/jellyfish}/time.hpp          |     0
 {jellyfish => include/jellyfish}/token_ring.hpp    |    80 +-
 include/jellyfish/whole_sequence_parser.hpp        |   150 +
 install-sh                                         |   527 -
 jellyfish-1.1.pc.in => jellyfish-2.0.pc.in         |     2 +-
 jellyfish/aligned_values_array.hpp                 |   141 -
 jellyfish/allocators_malloc.hpp                    |    61 -
 jellyfish/allocators_mmap.hpp                      |    64 -
 jellyfish/allocators_shm.hpp                       |    94 -
 jellyfish/capped_integer.hpp                       |    64 -
 jellyfish/circular_buffer.hpp                      |    68 -
 jellyfish/cite_cmdline.hpp                         |   111 -
 jellyfish/compacted_dumper.hpp                     |   171 -
 jellyfish/compacted_hash.hpp                       |   530 -
 jellyfish/concurrent_queues.hpp                    |   160 -
 jellyfish/count_main_cmdline.hpp                   |   684 -
 jellyfish/counter.hpp                              |    52 -
 jellyfish/dbg.cc                                   |     7 -
 jellyfish/direct_indexing_array.hpp                |   151 -
 jellyfish/direct_sorted_dumper.hpp                 |   131 -
 jellyfish/divisor.hpp                              |   135 -
 jellyfish/dna_codes.cc                             |    28 -
 jellyfish/dna_codes.hpp                            |    20 -
 jellyfish/double_fifo_input.hpp                    |   192 -
 jellyfish/dump_fastq_main.cc                       |    71 -
 jellyfish/dump_fastq_main_cmdline.hpp              |   160 -
 jellyfish/dump_main.cc                             |   100 -
 jellyfish/dump_main_cmdline.hpp                    |   151 -
 jellyfish/dumper.hpp                               |    61 -
 jellyfish/eLut.h                                   |    71 -
 jellyfish/err.hpp                                  |   145 -
 jellyfish/fastq_dumper.hpp                         |   131 -
 jellyfish/file_parser.cc                           |    99 -
 jellyfish/file_parser.hpp                          |    92 -
 jellyfish/floats.cc                                |    23 -
 jellyfish/floats.hpp                               |    71 -
 jellyfish/generate_sequence.cc                     |   199 +-
 jellyfish/generate_sequence_cmdline.hpp            |   171 -
 jellyfish/generate_sequence_cmdline.yaggo          |    27 +
 jellyfish/half.cpp                                 |   311 -
 jellyfish/half.h                                   |   766 -
 jellyfish/hash.hpp                                 |   253 -
 jellyfish/hash_fastq_merge.cc                      |    52 -
 jellyfish/hash_fastq_merge_cmdline.hpp             |   171 -
 jellyfish/hash_merge.cc                            |   242 -
 jellyfish/hash_merge_cmdline.hpp                   |   157 -
 jellyfish/heap.hpp                                 |   125 -
 jellyfish/histo_fastq_main.cc                      |    70 -
 jellyfish/histo_fastq_main_cmdline.hpp             |   142 -
 jellyfish/histo_main.cc                            |   132 -
 jellyfish/histo_main_cmdline.hpp                   |   199 -
 jellyfish/invertible_hash_array.hpp                |  1015 -
 jellyfish/locking_hash_counters.hpp                |   372 -
 jellyfish/locks_pthread.hpp                        |   172 -
 jellyfish/mapped_file.cc                           |    25 -
 jellyfish/mapped_file.hpp                          |   181 -
 jellyfish/mer_counter.cc                           |   379 -
 jellyfish/mer_counting.hpp                         |    68 -
 jellyfish/merge_files.cc                           |   151 +
 jellyfish/{err.cc => merge_files.hpp}              |    23 +-
 jellyfish/misc.hpp                                 |   144 -
 jellyfish/noop_dumper.hpp                          |    30 -
 jellyfish/offsets_key_value.hpp                    |   239 -
 jellyfish/parse_dna.cc                             |    59 -
 jellyfish/parse_dna.hpp                            |   194 -
 jellyfish/parse_quake.cc                           |   107 -
 jellyfish/parse_quake.hpp                          |   152 -
 jellyfish/parse_qual_dna.cc                        |    74 -
 jellyfish/parse_qual_dna.hpp                       |   147 -
 jellyfish/parse_read.hpp                           |   105 -
 jellyfish/query_cmdline.hpp                        |   135 -
 jellyfish/query_main.cc                            |    76 -
 jellyfish/randomc.h                                |     4 +-
 jellyfish/raw_dumper.hpp                           |   244 -
 jellyfish/read_parser.cc                           |   108 -
 jellyfish/read_parser.hpp                          |    78 -
 jellyfish/seq_qual_parser.cc                       |   139 -
 jellyfish/seq_qual_parser.hpp                      |    66 -
 jellyfish/sequence_parser.cc                       |   104 -
 jellyfish/sequence_parser.hpp                      |    71 -
 jellyfish/simple_growing_array.hpp                 |    60 -
 jellyfish/sorted_dumper.hpp                        |   166 -
 jellyfish/square_binary_matrix.cc                  |   289 -
 jellyfish/square_binary_matrix.hpp                 |   203 -
 jellyfish/stats_main.cc                            |   121 -
 jellyfish/stats_main_cmdline.hpp                   |   160 -
 jellyfish/storage.cc                               |    51 -
 jellyfish/test_double_fifo_input.cc                |    79 -
 jellyfish/test_read_parser.cc                      |    50 -
 jellyfish/toFloat.h                                | 16391 ---------------
 jellyfish/yaggo.cpp                                |   184 -
 jellyfish/yaggo.hpp                                |   152 -
 {jellyfish => lib}/allocators_mmap.cc              |    76 +-
 {jellyfish => lib}/err.cc                          |     6 +-
 lib/generator_manager.cc                           |   281 +
 lib/int128.cc                                      |    94 +
 lib/jsoncpp.cpp                                    |  4230 ++++
 jellyfish/hash_function.hpp => lib/mer_dna.cc      |    10 +-
 {jellyfish => lib}/misc.cc                         |    40 +
 lib/rectangular_binary_matrix.cc                   |   216 +
 lib/storage.cc                                     |    51 +
 {jellyfish => lib}/thread_exec.cc                  |    12 +-
 {jellyfish => lib}/time.cc                         |     0
 local.mk                                           |     3 +
 ltmain.sh                                          |  9655 ---------
 m4/.gitignore                                      |     4 +
 m4/libtool.m4                                      |  7986 --------
 m4/ltoptions.m4                                    |   384 -
 m4/ltsugar.m4                                      |   123 -
 m4/ltversion.m4                                    |    23 -
 m4/lt~obsolete.m4                                  |    98 -
 missing                                            |   331 -
 sub_commands/bc_main.cc                            |   161 +
 sub_commands/bc_main_cmdline.yaggo                 |    45 +
 jellyfish/cite.cc => sub_commands/cite_main.cc     |    11 +-
 sub_commands/cite_main_cmdline.yaggo               |    12 +
 sub_commands/count_main.cc                         |   354 +
 sub_commands/count_main_cmdline.yaggo              |   102 +
 sub_commands/dump_main.cc                          |    88 +
 sub_commands/dump_main_cmdline.yaggo               |    24 +
 sub_commands/histo_main.cc                         |    90 +
 sub_commands/histo_main_cmdline.yaggo              |    38 +
 sub_commands/info_main.cc                          |    54 +
 sub_commands/info_main_cmdline.yaggo               |    23 +
 {jellyfish => sub_commands}/jellyfish.cc           |    18 +-
 sub_commands/mem_main.cc                           |    54 +
 sub_commands/mem_main_cmdline.yaggo                |   123 +
 .../parse_read.cc => sub_commands/merge_main.cc    |    45 +-
 sub_commands/merge_main_cmdline.yaggo              |    15 +
 sub_commands/query_main.cc                         |   123 +
 sub_commands/query_main_cmdline.yaggo              |    24 +
 sub_commands/stats_main.cc                         |    83 +
 sub_commands/stats_main_cmdline.yaggo              |    28 +
 swig/Readme.md                                     |   154 +
 swig/Tuprules.tup                                  |   120 +
 swig/hash_counter.i                                |    56 +
 swig/hash_set.i                                    |    35 +
 swig/jellyfish.i                                   |    28 +
 swig/mer_dna.i                                     |    99 +
 swig/mer_file.i                                    |   191 +
 swig/perl5/Makefile.PL                             |    20 +
 swig/perl5/Tupfile                                 |    14 +
 swig/perl5/t/test_hash_counter.t                   |    44 +
 swig/perl5/t/test_mer_file.t                       |    51 +
 swig/python/Tupfile                                |    14 +
 swig/python/setup.py                               |    45 +
 swig/python/test_hash_counter.py                   |    39 +
 swig/python/test_mer_file.py                       |    57 +
 swig/ruby/Tupfile                                  |    14 +
 swig/ruby/extconf.rb                               |    12 +
 swig/ruby/test_hash_counter.rb                     |    42 +
 swig/ruby/test_mer_file.rb                         |    57 +
 swig/tests/Tupfile                                 |     6 +
 tests/big.sh                                       |    15 +-
 tests/bloom_counter.sh                             |    47 +
 tests/bloom_filter.sh                              |    23 +
 tests/compat.sh.in                                 |     7 +-
 tests/from_stream.sh                               |     2 +-
 tests/from_stream_fastq.sh                         |     2 +-
 tests/generate_sequence.sh                         |     6 +
 tests/large_key.sh                                 |    18 +
 tests/merge.sh                                     |    36 +-
 tests/min_qual.sh                                  |     2 +-
 tests/multi_file.sh                                |    48 +-
 tests/multi_file_fastq.sh                          |     2 +-
 tests/parallel_direct_indexing.sh                  |     2 +-
 tests/parallel_fastq_direct_indexing.sh            |     2 +-
 tests/parallel_fastq_hashing.sh                    |     2 +-
 tests/parallel_fastq_sequence_hashing.sh           |     2 +-
 tests/parallel_hashing.sh                          |    99 +-
 tests/parsers.sh                                   |     2 +-
 tests/quality_filter.sh                            |    25 +
 tests/raw_hash.sh                                  |     2 +-
 tests/serial_direct_indexing.sh                    |     2 +-
 tests/serial_hashing.sh                            |     2 +-
 tests/small.sh                                     |     2 +-
 tests/subset_hashing.sh                            |    19 +
 unit_tests/Makefile                                |    82 +
 unit_tests/gtest/gtest.h                           | 20061 +++++++++++++++++++
 unit_tests/gtest/include/gtest/gtest-death-test.h  |   283 -
 unit_tests/gtest/include/gtest/gtest-message.h     |   230 -
 unit_tests/gtest/include/gtest/gtest-param-test.h  |  1421 --
 unit_tests/gtest/include/gtest/gtest-printers.h    |   796 -
 unit_tests/gtest/include/gtest/gtest-spi.h         |   232 -
 unit_tests/gtest/include/gtest/gtest-test-part.h   |   176 -
 unit_tests/gtest/include/gtest/gtest-typed-test.h  |   259 -
 unit_tests/gtest/include/gtest/gtest.h             |  2155 --
 unit_tests/gtest/include/gtest/gtest_pred_impl.h   |   358 -
 unit_tests/gtest/include/gtest/gtest_prod.h        |    58 -
 .../gtest/internal/gtest-death-test-internal.h     |   308 -
 .../gtest/include/gtest/internal/gtest-filepath.h  |   210 -
 .../gtest/include/gtest/internal/gtest-internal.h  |  1236 --
 .../include/gtest/internal/gtest-linked_ptr.h      |   233 -
 .../gtest/internal/gtest-param-util-generated.h    |  4822 -----
 .../include/gtest/internal/gtest-param-util.h      |   619 -
 .../gtest/include/gtest/internal/gtest-port.h      |  1785 --
 .../gtest/include/gtest/internal/gtest-string.h    |   360 -
 .../gtest/include/gtest/internal/gtest-tuple.h     |   968 -
 .../gtest/include/gtest/internal/gtest-type-util.h |  3330 ---
 unit_tests/gtest/src/gtest-all.cc                  |  9558 ++++++++-
 unit_tests/gtest/src/gtest-death-test.cc           |  1234 --
 unit_tests/gtest/src/gtest-filepath.cc             |   380 -
 unit_tests/gtest/src/gtest-internal-inl.h          |  1038 -
 unit_tests/gtest/src/gtest-port.cc                 |   752 -
 unit_tests/gtest/src/gtest-printers.cc             |   356 -
 unit_tests/gtest/src/gtest-test-part.cc            |   110 -
 unit_tests/gtest/src/gtest-typed-test.cc           |   110 -
 unit_tests/gtest/src/gtest.cc                      |  4898 -----
 unit_tests/gtest/src/gtest_main.cc                 |     5 +-
 unit_tests/test_allocators_mmap.cc                 |    15 +
 unit_tests/test_atomic_bits_array.cc               |    32 +
 unit_tests/test_cond.cc                            |    80 +
 unit_tests/test_cooperative_pool2.cc               |    89 +
 unit_tests/test_dumpers.cc                         |   144 +
 unit_tests/test_file_header.cc                     |    90 +
 unit_tests/test_generator_manager.cc               |    95 +
 unit_tests/test_hash_counter.cc                    |   104 +
 unit_tests/test_int128.cc                          |    34 +
 unit_tests/test_large_block.cc                     |    33 +
 unit_tests/test_large_hash_array.cc                |   346 +
 unit_tests/test_main.cc                            |    67 +
 unit_tests/test_main.hpp                           |    26 +
 unit_tests/test_main_cmdline.yaggo                 |    10 +
 unit_tests/test_mapped_file.cc                     |    54 +
 unit_tests/test_mer_dna.cc                         |   529 +
 unit_tests/test_mer_dna_bloom_counter.cc           |   150 +
 unit_tests/test_mer_heap.cc                        |    76 +
 unit_tests/test_mer_iterator.cc                    |   181 +
 unit_tests/test_mer_overlap_sequence_parser.cc     |   177 +
 unit_tests/test_misc.cc                            |   110 +
 unit_tests/test_mutex.cc                           |    53 +
 unit_tests/test_offsets_key_value.cc               |   299 +-
 unit_tests/test_packed_key_value_array.cc          |   213 +
 unit_tests/test_rectangular_binary_matrix.cc       |   332 +
 unit_tests/test_simple_circular_buffer.cc          |   105 +-
 unit_tests/test_square_binary_matrix.cc            |    10 +-
 unit_tests/test_stdio_filebuf.cc                   |    55 +
 unit_tests/test_stream_iterator.cc                 |    94 +
 unit_tests/test_text_dumper.cc                     |   115 +
 unit_tests/test_token_ring.cc                      |    44 +
 unit_tests/test_whole_sequence_parser.cc           |   161 +
 unit_tests/unit_tests.sh                           |     6 +-
 322 files changed, 55831 insertions(+), 102991 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d065b04
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.h.in
+configure
+depcomp
+install-sh
+missing
+compile
+config.guess
+config.h.in~
+config.sub
+ltmain.sh
+*_cmdline.hpp
+m4
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 0000000..066aaf2
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,13 @@
+Version 1.1
+===========
+
+* Read input from pipes. For example, to count DNA from zipped files, run:
+
+% gunzip -c *.fa.gz | jellyfish [options] /dev/fd/0
+
+* Support fasta and fastq formats.
+
+* Support for counting 'q-mers', as defined by the Quake error
+  correcting software (http://www.cbcb.umd.edu/software/quake/).
+
+* New dump subcommands which replaces 'stats -f' and 'stats -c'.
diff --git a/Makefile.am b/Makefile.am
index e25a30b..78a94af 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,192 +3,203 @@ EXTRA_DIST = doc/jellyfish.pdf doc/jellyfish.man README LICENSE HalfLICENSE
 man1_MANS = doc/jellyfish.man
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = jellyfish-1.1.pc
+pkgconfig_DATA = jellyfish-2.0.pc
 
-AM_LDFLAGS = -lpthread
-AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir)
-AM_CXXFLAGS = -g -O3
-LDADD = libjellyfish-1.1.la
+AM_LDFLAGS = -lpthread # $(VALGRIND_LIBS)
+AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir) -I$(top_srcdir)/include -g -O3 $(VALGRIND_CFLAGS)
+AM_CXXFLAGS = $(ALL_CXXFLAGS) -g -O3
 
-# What to build
-lib_LTLIBRARIES = libjellyfish-1.1.la
-
-bin_PROGRAMS = bin/jellyfish
-check_PROGRAMS = bin/generate_sequence bin/test_double_fifo_input	\
-                 bin/test_read_parser
-
-
-########################################
-# Build Jellyfish the exec
-########################################
-bin_jellyfish_SOURCES = jellyfish/jellyfish.cc			\
-                        jellyfish/stats_main.cc			\
-                        jellyfish/hash_merge.cc			\
-                        jellyfish/mer_counter.cc		\
-                        jellyfish/histo_main.cc			\
-                        jellyfish/dump_main.cc			\
-                        jellyfish/query_main.cc			\
-                        jellyfish/dump_fastq_main.cc		\
-                        jellyfish/histo_fastq_main.cc		\
-                        jellyfish/cite.cc			\
-                        jellyfish/hash_fastq_merge.cc		\
-                        jellyfish/yaggo.cpp
-# bin_jellyfish_LDADD = libjellyfish-1.1.la
+noinst_HEADERS = $(YAGGO_SOURCES)
+bin_PROGRAMS =
+dist_bin_SCRIPTS =
+data_DATA =
+BUILT_SOURCES = $(YAGGO_SOURCES)
+CLEANFILES =
+DISTCLEANFILES = $(BUILT_SOURCES)
+
+# Yaggo automatic rules with silencing
+V_YAGGO = $(V_YAGGO_$(V))
+V_YAGGO_ = $(V_YAGGO_$(AM_DEFAULT_VERBOSITY))
+V_YAGGO_0 = @echo "  YAGGO " $@;
+.yaggo.hpp:
+	$(V_YAGGO)$(YAGGO) --license $(srcdir)/header-license -o $@ $<
+
+YAGGO_SOURCES = # Append all file to be built by yaggo
 
+# What to build
+bin_PROGRAMS += bin/jellyfish
+lib_LTLIBRARIES = libjellyfish-2.0.la
+LDADD = libjellyfish-2.0.la # $(VALGRIND_LIBS)
+check_PROGRAMS = bin/generate_sequence
+
+############################
+# Build Jellyfish the exec #
+############################
+bin_jellyfish_SOURCES = sub_commands/jellyfish.cc	\
+                        sub_commands/count_main.cc	\
+                        sub_commands/info_main.cc	\
+                        sub_commands/dump_main.cc	\
+                        sub_commands/histo_main.cc	\
+                        sub_commands/stats_main.cc	\
+                        sub_commands/merge_main.cc	\
+                        sub_commands/bc_main.cc		\
+                        sub_commands/query_main.cc	\
+                        sub_commands/cite_main.cc	\
+                        sub_commands/mem_main.cc	\
+                        jellyfish/merge_files.cc
 bin_jellyfish_LDFLAGS = $(AM_LDFLAGS) $(STATIC_FLAGS)
 
-EXTRA_DIST += jellyfish/cite_cmdline.hpp jellyfish/query_cmdline.hpp	\
-              jellyfish/hash_merge_cmdline.hpp				\
-              jellyfish/histo_main_cmdline.hpp				\
-              jellyfish/stats_main_cmdline.hpp				\
-              jellyfish/histo_fastq_main_cmdline.hpp			\
-              jellyfish/dump_fastq_main_cmdline.hpp			\
-              jellyfish/count_main_cmdline.hpp				\
-              jellyfish/hash_fastq_merge_cmdline.hpp			\
-              jellyfish/dump_main_cmdline.hpp				\
-              jellyfish/double_fifo_input.hpp				\
-              jellyfish/simple_growing_array.hpp			\
-              jellyfish/backtrace.hpp jellyfish/noop_dumper.hpp		\
-              jellyfish/yaggo.hpp jellyfish/fstream_default.hpp
-
-########################################
-# Build Jellyfish the shared library
-########################################
-libjellyfish_srcs = jellyfish/square_binary_matrix.cc		\
-                       jellyfish/err.cc jellyfish/misc.cc		\
-                       jellyfish/storage.cc jellyfish/thread_exec.cc	\
-                       jellyfish/time.cc jellyfish/file_parser.cc	\
-                       jellyfish/read_parser.cc				\
-                       jellyfish/parse_read.cc jellyfish/half.cpp	\
-                       jellyfish/mapped_file.cc				\
-                       jellyfish/parse_dna.cc				\
-                       jellyfish/parse_quake.cc				\
-                       jellyfish/parse_qual_dna.cc			\
-                       jellyfish/sequence_parser.cc			\
-                       jellyfish/seq_qual_parser.cc			\
-                       jellyfish/backtrace.cc jellyfish/floats.cc	\
-                       jellyfish/dbg.cc jellyfish/allocators_mmap.cc	\
-                       jellyfish/dna_codes.cc
-
-libjellyfish_1_1_la_SOURCES = $(libjellyfish_srcs)
-libjellyfish_1_1_la_LDFLAGS = -version-info 1:1:0
+
+YAGGO_SOURCES += sub_commands/count_main_cmdline.hpp	\
+                 sub_commands/info_main_cmdline.hpp	\
+                 sub_commands/dump_main_cmdline.hpp	\
+                 sub_commands/histo_main_cmdline.hpp	\
+                 sub_commands/stats_main_cmdline.hpp	\
+                 sub_commands/merge_main_cmdline.hpp	\
+                 sub_commands/bc_main_cmdline.hpp	\
+                 sub_commands/query_main_cmdline.hpp	\
+                 sub_commands/cite_main_cmdline.hpp	\
+                 sub_commands/mem_main_cmdline.hpp
+
+######################################
+# Build Jellyfish the shared library #
+######################################
+libjellyfish_2_0_la_LDFLAGS = -version-info 2:0:0
+libjellyfish_2_0_la_SOURCES = lib/rectangular_binary_matrix.cc		\
+                              lib/mer_dna.cc lib/storage.cc		\
+                              lib/allocators_mmap.cc lib/misc.cc	\
+                              lib/int128.cc lib/thread_exec.cc		\
+                              lib/jsoncpp.cpp lib/time.cc	\
+                              lib/generator_manager.cc
+
 
 library_includedir=$(includedir)/jellyfish- at PACKAGE_VERSION@/jellyfish
-library_include_HEADERS = jellyfish/allocators_malloc.hpp		\
-                          jellyfish/allocators_mmap.hpp			\
-                          jellyfish/allocators_shm.hpp			\
-                          jellyfish/atomic_gcc.hpp			\
-                          jellyfish/compacted_dumper.hpp		\
-                          jellyfish/compacted_hash.hpp			\
-                          jellyfish/concurrent_queues.hpp		\
-                          jellyfish/direct_indexing_array.hpp		\
-                          jellyfish/direct_sorted_dumper.hpp		\
-                          jellyfish/divisor.hpp jellyfish/dumper.hpp	\
-                          jellyfish/hash_function.hpp			\
-                          jellyfish/hash.hpp jellyfish/heap.hpp		\
-                          jellyfish/invertible_hash_array.hpp		\
-                          jellyfish/locking_hash_counters.hpp		\
-                          jellyfish/locks_pthread.hpp			\
-                          jellyfish/mapped_file.hpp			\
-                          jellyfish/mer_counting.hpp			\
-                          jellyfish/err.hpp jellyfish/misc.hpp		\
-                          jellyfish/offsets_key_value.hpp		\
-                          jellyfish/reversible_hash_function.hpp	\
-                          jellyfish/sorted_dumper.hpp			\
-                          jellyfish/square_binary_matrix.hpp		\
-                          jellyfish/storage.hpp				\
-                          jellyfish/thread_exec.hpp			\
-                          jellyfish/time.hpp jellyfish/token_ring.hpp	\
-                          jellyfish/raw_dumper.hpp			\
-                          jellyfish/capped_integer.hpp			\
-                          jellyfish/aligned_values_array.hpp		\
-                          jellyfish/fastq_dumper.hpp			\
-                          jellyfish/floats.hpp				\
-                          jellyfish/circular_buffer.hpp			\
-                          jellyfish/counter.hpp				\
-                          jellyfish/parse_quake.hpp			\
-                          jellyfish/parse_dna.hpp			\
-                          jellyfish/parse_qual_dna.hpp			\
-                          jellyfish/file_parser.hpp			\
-                          jellyfish/sequence_parser.hpp			\
-                          jellyfish/seq_qual_parser.hpp			\
-                          jellyfish/double_fifo_input.hpp		\
-                          jellyfish/read_parser.hpp			\
-                          jellyfish/parse_read.hpp			\
-                          jellyfish/simple_growing_array.hpp		\
-                          jellyfish/toFloat.h jellyfish/eLut.h		\
-                          jellyfish/dbg.hpp jellyfish/half.h		\
-                          jellyfish/backtrace.hpp			\
-                          jellyfish/dna_codes.hpp			\
-                          jellyfish/simple_circular_buffer.hpp
-
-
-########################################
-# Build tests
-########################################
+JFI = include/jellyfish
+library_include_HEADERS = $(JFI)/allocators_mmap.hpp			\
+                          $(JFI)/backtrace.hpp $(JFI)/atomic_gcc.hpp	\
+                          $(JFI)/large_hash_array.hpp $(JFI)/err.hpp	\
+                          $(JFI)/misc.hpp				\
+                          $(JFI)/offsets_key_value.hpp			\
+                          $(JFI)/int128.hpp				\
+                          $(JFI)/rectangular_binary_matrix.hpp		\
+                          $(JFI)/mer_dna.hpp $(JFI)/storage.hpp		\
+                          $(JFI)/simple_circular_buffer.hpp		\
+                          $(JFI)/circular_buffer.hpp			\
+                          $(JFI)/atomic_field.hpp			\
+                          $(JFI)/compare_and_swap.hpp			\
+                          $(JFI)/divisor.hpp				\
+                          $(JFI)/large_hash_iterator.hpp		\
+                          $(JFI)/jellyfish.hpp $(JFI)/thread_exec.hpp	\
+                          $(JFI)/stream_iterator.hpp			\
+                          $(JFI)/mer_overlap_sequence_parser.hpp	\
+                          $(JFI)/whole_sequence_parser.hpp		\
+                          $(JFI)/binary_dumper.hpp			\
+                          $(JFI)/sorted_dumper.hpp			\
+                          $(JFI)/text_dumper.hpp $(JFI)/dumper.hpp	\
+                          $(JFI)/time.hpp $(JFI)/mer_heap.hpp		\
+                          $(JFI)/token_ring.hpp				\
+                          $(JFI)/locks_pthread.hpp			\
+                          $(JFI)/file_header.hpp			\
+                          $(JFI)/generic_file_header.hpp		\
+                          $(JFI)/json.h $(JFI)/hash_counter.hpp		\
+                          $(JFI)/mapped_file.hpp			\
+                          $(JFI)/mer_dna_bloom_counter.hpp		\
+                          $(JFI)/bloom_common.hpp			\
+                          $(JFI)/bloom_counter2.hpp			\
+                          $(JFI)/bloom_filter.hpp			\
+                          $(JFI)/cooperative_pool.hpp			\
+                          $(JFI)/cooperative_pool2.hpp			\
+                          $(JFI)/stream_manager.hpp			\
+                          $(JFI)/generator_manager.hpp			\
+                          $(JFI)/cpp_array.hpp				\
+                          $(JFI)/mer_iterator.hpp			\
+                          $(JFI)/atomic_bits_array.hpp			\
+                          $(JFI)/stdio_filebuf.hpp			\
+                          $(JFI)/mer_qual_iterator.hpp
+
+
+noinst_HEADERS += jellyfish/fstream_default.hpp jellyfish/dbg.hpp	\
+                  jellyfish/randomc.h jellyfish/merge_files.hpp
+
+###############
+# Build tests #
+###############
 bin_generate_sequence_SOURCES = jellyfish/generate_sequence.cc		\
-                                jellyfish/mersenne.cpp
-bin_test_double_fifo_input_SOURCES = jellyfish/test_double_fifo_input.cc
-bin_test_read_parser_SOURCES = jellyfish/test_read_parser.cc
-EXTRA_DIST += jellyfish/randomc.h jellyfish/generate_sequence_cmdline.hpp
-
-########################################
-# Tests
-########################################
+                                jellyfish/mersenne.cpp			\
+                                jellyfish/backtrace.cc			\
+                                jellyfish/dbg.cc
+YAGGO_SOURCES += jellyfish/generate_sequence_cmdline.hpp
+
+#########
+# Tests #
+#########
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = /bin/sh
 AM_SH_LOG_FLAGS =
 
-TESTS = tests/generate_sequence.sh tests/serial_hashing.sh		\
-        tests/parallel_hashing.sh tests/serial_direct_indexing.sh	\
-        tests/parallel_direct_indexing.sh tests/raw_hash.sh		\
-        tests/generate_fastq_sequence.sh				\
-        tests/parallel_fastq_hashing.sh tests/multi_file.sh		\
-        tests/multi_file_fastq.sh tests/from_stream.sh			\
-        tests/parallel_fastq_sequence_hashing.sh			\
-        tests/from_stream_fastq.sh tests/merge.sh tests/min_qual.sh	\
-        tests/big.sh tests/parsers.sh tests/small.sh			\
-        tests/parallel_fastq_direct_indexing.sh
+TESTS = tests/generate_sequence.sh tests/parallel_hashing.sh	\
+        tests/merge.sh tests/bloom_filter.sh tests/big.sh	\
+        tests/subset_hashing.sh tests/multi_file.sh		\
+        tests/bloom_counter.sh tests/large_key.sh
 
 EXTRA_DIST += $(TESTS)
 clean-local: clean-local-check
 .PHONY: clean-local-check
 clean-local-check:
-	-cd tests; rm -f seq10m* seq1m* *_0 *_1 *_2 *_S *.md5sum *.histo *.stats *.timing *.query *.dump *.fa
+	-cd tests; rm -f *
 
-tests/serial_hashing.log: tests/generate_sequence.log
 tests/parallel_hashing.log: tests/generate_sequence.log
-tests/serial_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_fastq_direct_indexing.log: tests/generate_fastq_sequence.log
+tests/subset_hashing.log: tests/generate_sequence.log
+tests/bloom_filter.log: tests/generate_sequence.log
+tests/bloom_counter.log: tests/generate_sequence.log
 tests/multi_file.log: tests/generate_sequence.log
-tests/raw_hash.log: tests/generate_sequence.log
-tests/from_stream.log: tests/generate_sequence.log
-tests/parallel_fastq_hashing.log: tests/generate_fastq_sequence.log
-tests/parallel_fastq_sequence_hashing.log: tests/generate_fastq_sequence.log
-tests/multi_file_fastq.log: tests/generate_fastq_sequence.log
-tests/from_stream_fastq.log: tests/generate_fastq_sequence.log
-tests/merge.log: tests/generate_fastq_sequence.log
+tests/merge.log: tests/generate_sequence.log
 tests/min_qual.log: tests/generate_fastq_sequence.log
-tests/parsers.log: tests/generate_sequence.log
+tests/large_key.log: tests/generate_sequence.log
+tests/quality_filter.log: tests/generate_sequence.log
 
-########################################
-# Unit tests
-########################################
+##############
+# Unit tests #
+##############
 TESTS += unit_tests/unit_tests.sh
 check_PROGRAMS += bin/test_all
 
-bin_test_all_SOURCES = unit_tests/test_offsets_key_value.cc		\
-                       unit_tests/test_simple_circular_buffer.cc	\
-                       unit_tests/test_square_binary_matrix.cc
-bin_test_all_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests/gtest
-bin_test_all_LDADD = libgtest_main.a libgtest.a $(LDADD)
+bin_test_all_SOURCES = unit_tests/test_main.cc				\
+	               unit_tests/test_misc.cc				\
+	               unit_tests/test_offsets_key_value.cc		\
+	               unit_tests/test_simple_circular_buffer.cc	\
+	               unit_tests/test_rectangular_binary_matrix.cc	\
+	               unit_tests/test_mer_dna.cc			\
+	               unit_tests/test_large_hash_array.cc		\
+	               unit_tests/test_mer_overlap_sequence_parser.cc	\
+	               unit_tests/test_file_header.cc			\
+	               unit_tests/test_mer_iterator.cc			\
+	               unit_tests/test_hash_counter.cc			\
+	               unit_tests/test_mer_heap.cc			\
+	               unit_tests/test_stream_iterator.cc		\
+	               unit_tests/test_token_ring.cc			\
+	               unit_tests/test_text_dumper.cc			\
+	               unit_tests/test_dumpers.cc			\
+	               unit_tests/test_mapped_file.cc			\
+	               unit_tests/test_int128.cc			\
+	               unit_tests/test_mer_dna_bloom_counter.cc		\
+	               unit_tests/test_whole_sequence_parser.cc		\
+	               unit_tests/test_allocators_mmap.cc		\
+	               unit_tests/test_cooperative_pool2.cc		\
+	               unit_tests/test_generator_manager.cc		\
+	               unit_tests/test_atomic_bits_array.cc		\
+	               unit_tests/test_stdio_filebuf.cc
+bin_test_all_SOURCES += jellyfish/backtrace.cc
+
+bin_test_all_CPPFLAGS = -Dprotected=public -Dprivate=public -DJSON_IS_AMALGAMATION=1
+bin_test_all_CXXFLAGS = $(AM_CXXFLAGS) -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests -I$(top_srcdir)/include
+bin_test_all_LDADD = libgtest.la $(LDADD)
+YAGGO_SOURCES += unit_tests/test_main_cmdline.hpp
+noinst_HEADERS += unit_tests/test_main.hpp
 
 include gtest.mk
 -include $(top_srcdir)/development.mk
 
-########
-# info #
-########
+# Print the value of a variable
 print-%:
 	@echo -n $($*)
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 455ac70..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,1826 +0,0 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = bin/jellyfish$(EXEEXT)
-check_PROGRAMS = bin/generate_sequence$(EXEEXT) \
-	bin/test_double_fifo_input$(EXEEXT) \
-	bin/test_read_parser$(EXEEXT) bin/test_all$(EXEEXT)
-DIST_COMMON = README $(am__configure_deps) $(library_include_HEADERS) \
-	$(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/config.h.in $(srcdir)/gtest.mk \
-	$(srcdir)/jellyfish-1.1.pc.in $(top_srcdir)/configure \
-	$(top_srcdir)/tests/compat.sh.in config.guess config.sub \
-	depcomp install-sh ltmain.sh missing
-subdir = .
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = tests/compat.sh jellyfish-1.1.pc
-CONFIG_CLEAN_VPATH_FILES =
-ARFLAGS = cru
-AM_V_AR = $(am__v_AR_ at AM_V@)
-am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
-am__v_AR_0 = @echo "  AR    " $@;
-AM_V_at = $(am__v_at_ at AM_V@)
-am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
-am__v_at_0 = @
-libgtest_a_AR = $(AR) $(ARFLAGS)
-libgtest_a_LIBADD =
-am__dirstamp = $(am__leading_dot)dirstamp
-am_libgtest_a_OBJECTS =  \
-	unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT)
-libgtest_a_OBJECTS = $(am_libgtest_a_OBJECTS)
-libgtest_main_a_AR = $(AR) $(ARFLAGS)
-libgtest_main_a_DEPENDENCIES = libgtest.a
-am_libgtest_main_a_OBJECTS =  \
-	unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT)
-libgtest_main_a_OBJECTS = $(am_libgtest_main_a_OBJECTS)
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \
-	"$(DESTDIR)$(library_includedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libjellyfish_1_1_la_LIBADD =
-am__objects_1 = jellyfish/square_binary_matrix.lo jellyfish/err.lo \
-	jellyfish/misc.lo jellyfish/storage.lo \
-	jellyfish/thread_exec.lo jellyfish/time.lo \
-	jellyfish/file_parser.lo jellyfish/read_parser.lo \
-	jellyfish/parse_read.lo jellyfish/half.lo \
-	jellyfish/mapped_file.lo jellyfish/parse_dna.lo \
-	jellyfish/parse_quake.lo jellyfish/parse_qual_dna.lo \
-	jellyfish/sequence_parser.lo jellyfish/seq_qual_parser.lo \
-	jellyfish/backtrace.lo jellyfish/floats.lo jellyfish/dbg.lo \
-	jellyfish/allocators_mmap.lo jellyfish/dna_codes.lo
-am_libjellyfish_1_1_la_OBJECTS = $(am__objects_1)
-libjellyfish_1_1_la_OBJECTS = $(am_libjellyfish_1_1_la_OBJECTS)
-AM_V_lt = $(am__v_lt_ at AM_V@)
-am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-libjellyfish_1_1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(AM_CXXFLAGS) $(CXXFLAGS) $(libjellyfish_1_1_la_LDFLAGS) \
-	$(LDFLAGS) -o $@
-PROGRAMS = $(bin_PROGRAMS)
-am_bin_generate_sequence_OBJECTS =  \
-	jellyfish/generate_sequence.$(OBJEXT) \
-	jellyfish/mersenne.$(OBJEXT)
-bin_generate_sequence_OBJECTS = $(am_bin_generate_sequence_OBJECTS)
-bin_generate_sequence_LDADD = $(LDADD)
-bin_generate_sequence_DEPENDENCIES = libjellyfish-1.1.la
-am_bin_jellyfish_OBJECTS = jellyfish/jellyfish.$(OBJEXT) \
-	jellyfish/stats_main.$(OBJEXT) jellyfish/hash_merge.$(OBJEXT) \
-	jellyfish/mer_counter.$(OBJEXT) jellyfish/histo_main.$(OBJEXT) \
-	jellyfish/dump_main.$(OBJEXT) jellyfish/query_main.$(OBJEXT) \
-	jellyfish/dump_fastq_main.$(OBJEXT) \
-	jellyfish/histo_fastq_main.$(OBJEXT) jellyfish/cite.$(OBJEXT) \
-	jellyfish/hash_fastq_merge.$(OBJEXT) jellyfish/yaggo.$(OBJEXT)
-bin_jellyfish_OBJECTS = $(am_bin_jellyfish_OBJECTS)
-bin_jellyfish_LDADD = $(LDADD)
-bin_jellyfish_DEPENDENCIES = libjellyfish-1.1.la
-bin_jellyfish_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(AM_CXXFLAGS) $(CXXFLAGS) $(bin_jellyfish_LDFLAGS) $(LDFLAGS) \
-	-o $@
-am_bin_test_all_OBJECTS =  \
-	unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT) \
-	unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT) \
-	unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT)
-bin_test_all_OBJECTS = $(am_bin_test_all_OBJECTS)
-bin_test_all_DEPENDENCIES = libgtest_main.a libgtest.a $(LDADD)
-bin_test_all_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(bin_test_all_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am_bin_test_double_fifo_input_OBJECTS =  \
-	jellyfish/test_double_fifo_input.$(OBJEXT)
-bin_test_double_fifo_input_OBJECTS =  \
-	$(am_bin_test_double_fifo_input_OBJECTS)
-bin_test_double_fifo_input_LDADD = $(LDADD)
-bin_test_double_fifo_input_DEPENDENCIES = libjellyfish-1.1.la
-am_bin_test_read_parser_OBJECTS =  \
-	jellyfish/test_read_parser.$(OBJEXT)
-bin_test_read_parser_OBJECTS = $(am_bin_test_read_parser_OBJECTS)
-bin_test_read_parser_LDADD = $(LDADD)
-bin_test_read_parser_DEPENDENCIES = libjellyfish-1.1.la
-DEFAULT_INCLUDES = -I. at am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_ at AM_V@)
-am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
-am__v_CXX_0 = @echo "  CXX   " $@;
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo "  CXXLD " $@;
-AM_V_GEN = $(am__v_GEN_ at AM_V@)
-am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libgtest_a_SOURCES) $(libgtest_main_a_SOURCES) \
-	$(libjellyfish_1_1_la_SOURCES) \
-	$(bin_generate_sequence_SOURCES) $(bin_jellyfish_SOURCES) \
-	$(bin_test_all_SOURCES) $(bin_test_double_fifo_input_SOURCES) \
-	$(bin_test_read_parser_SOURCES)
-DIST_SOURCES = $(libgtest_a_SOURCES) $(libgtest_main_a_SOURCES) \
-	$(libjellyfish_1_1_la_SOURCES) \
-	$(bin_generate_sequence_SOURCES) $(bin_jellyfish_SOURCES) \
-	$(bin_test_all_SOURCES) $(bin_test_double_fifo_input_SOURCES) \
-	$(bin_test_read_parser_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-man1dir = $(mandir)/man1
-NROFF = nroff
-MANS = $(man1_MANS)
-DATA = $(pkgconfig_DATA)
-HEADERS = $(library_include_HEADERS) $(noinst_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-# If stdout is a non-dumb tty, use colors.  If test -t is not supported,
-# then this fails; a conservative approach.  Of course do not redirect
-# stdout here, just stderr.
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=; \
-test "X$(AM_COLOR_TESTS)" != Xno \
-&& test "X$$TERM" != Xdumb \
-&& { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \
-&& { \
-  red=''; \
-  grn=''; \
-  lgn=''; \
-  blu=''; \
-  std=''; \
-}
-# Restructured Text title and section.
-am__rst_title = sed 's/.*/   &   /;h;s/./=/g;p;x;p;g;p;s/.*//'
-am__rst_section = sed 'p;s/./=/g;p;g'
-# Put stdin (possibly several lines separated by ".  ") in a box.
-# Prefix each line by 'col' and terminate each with 'std', for coloring.
-# Multi line coloring is problematic with "less -R", so we really need
-# to color each line individually.
-am__text_box = $(AWK) '{			\
-  n = split($$0, lines, "\\.  "); max = 0;	\
-  for (i = 1; i <= n; ++i)			\
-    if (max < length(lines[i]))			\
-      max = length(lines[i]);			\
-  for (i = 0; i < max; ++i)			\
-    line = line "=";				\
-  print col line std;				\
-  for (i = 1; i <= n; ++i)			\
-    if (lines[i])				\
-      print col lines[i] std;			\
-  print col line std;				\
-}'
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log, and passes
-# TESTS_ENVIRONMENT.  Save and restore TERM around use of
-# TESTS_ENVIRONMENT, in case that unsets it.
-am__check_pre = \
-$(am__sh_e_setup);					\
-$(am__vpath_adj_setup) $(am__vpath_adj)			\
-srcdir=$(srcdir); export srcdir;			\
-rm -f $@-t;						\
-am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \
-trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2;	\
-trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \
-am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;		\
-test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?;	\
-if test -f "./$$f"; then dir=./;			\
-elif test -f "$$f"; then dir=;				\
-else dir="$(srcdir)/"; fi;				\
-tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM;		\
-$(TESTS_ENVIRONMENT)
-# To be appended to the command running the test.  Handle the stdout
-# and stderr redirection, and catch the exit status.
-am__check_post = \
->$@-t 2>&1;						\
-estatus=$$?;						\
-if test -n '$(DISABLE_HARD_ERRORS)'			\
-   && test $$estatus -eq 99; then			\
-  estatus=1;						\
-fi;							\
-TERM=$$__SAVED_TERM; export TERM;			\
-$(am__tty_colors);					\
-xfailed=PASS;						\
-case " $(XFAIL_TESTS) " in				\
-  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
-    xfailed=XFAIL;;					\
-esac;							\
-case $$estatus.$$xfailed in				\
-    0.XFAIL) col=$$red; res=XPASS;;			\
-    0.*)     col=$$grn; res=PASS ;;			\
-    77.*)    col=$$blu; res=SKIP ;;			\
-    99.*)    col=$$red; res=FAIL ;;			\
-    *.XFAIL) col=$$lgn; res=XFAIL;;			\
-    *.*)     col=$$red; res=FAIL ;;			\
-esac;							\
-echo "$${col}$$res$${std}: $$f";			\
-echo "$$res: $$f (exit: $$estatus)" |			\
-  $(am__rst_section) >$@;				\
-cat $@-t >>$@;						\
-rm -f $@-t
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck check-html recheck-html
-TEST_SUITE_HTML = $(TEST_SUITE_LOG:.log=.html)
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
-TEST_LOGS = $(am__test_logs2:.sh.log=.log)
-SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
-TEST_LOGS_TMP = $(TEST_LOGS:.log=.log-t)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  if test -d "$(distdir)"; then \
-    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-      && rm -rf "$(distdir)" \
-      || { sleep 5 && rm -rf "$(distdir)"; }; \
-  else :; fi
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
-  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MD5 = @MD5@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STATIC_FLAGS = @STATIC_FLAGS@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = doc/jellyfish.pdf doc/jellyfish.man README LICENSE \
-	HalfLICENSE jellyfish/cite_cmdline.hpp \
-	jellyfish/query_cmdline.hpp jellyfish/hash_merge_cmdline.hpp \
-	jellyfish/histo_main_cmdline.hpp \
-	jellyfish/stats_main_cmdline.hpp \
-	jellyfish/histo_fastq_main_cmdline.hpp \
-	jellyfish/dump_fastq_main_cmdline.hpp \
-	jellyfish/count_main_cmdline.hpp \
-	jellyfish/hash_fastq_merge_cmdline.hpp \
-	jellyfish/dump_main_cmdline.hpp \
-	jellyfish/double_fifo_input.hpp \
-	jellyfish/simple_growing_array.hpp jellyfish/backtrace.hpp \
-	jellyfish/noop_dumper.hpp jellyfish/yaggo.hpp \
-	jellyfish/fstream_default.hpp jellyfish/randomc.h \
-	jellyfish/generate_sequence_cmdline.hpp $(TESTS) $(GTEST_SRC)
-man1_MANS = doc/jellyfish.man
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = jellyfish-1.1.pc
-AM_LDFLAGS = -lpthread
-AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir)
-AM_CXXFLAGS = -g -O3
-LDADD = libjellyfish-1.1.la
-
-# What to build
-lib_LTLIBRARIES = libjellyfish-1.1.la
-
-########################################
-# Build Jellyfish the exec
-########################################
-bin_jellyfish_SOURCES = jellyfish/jellyfish.cc			\
-                        jellyfish/stats_main.cc			\
-                        jellyfish/hash_merge.cc			\
-                        jellyfish/mer_counter.cc		\
-                        jellyfish/histo_main.cc			\
-                        jellyfish/dump_main.cc			\
-                        jellyfish/query_main.cc			\
-                        jellyfish/dump_fastq_main.cc		\
-                        jellyfish/histo_fastq_main.cc		\
-                        jellyfish/cite.cc			\
-                        jellyfish/hash_fastq_merge.cc		\
-                        jellyfish/yaggo.cpp
-
-# bin_jellyfish_LDADD = libjellyfish-1.1.la
-bin_jellyfish_LDFLAGS = $(AM_LDFLAGS) $(STATIC_FLAGS)
-
-########################################
-# Build Jellyfish the shared library
-########################################
-libjellyfish_srcs = jellyfish/square_binary_matrix.cc		\
-                       jellyfish/err.cc jellyfish/misc.cc		\
-                       jellyfish/storage.cc jellyfish/thread_exec.cc	\
-                       jellyfish/time.cc jellyfish/file_parser.cc	\
-                       jellyfish/read_parser.cc				\
-                       jellyfish/parse_read.cc jellyfish/half.cpp	\
-                       jellyfish/mapped_file.cc				\
-                       jellyfish/parse_dna.cc				\
-                       jellyfish/parse_quake.cc				\
-                       jellyfish/parse_qual_dna.cc			\
-                       jellyfish/sequence_parser.cc			\
-                       jellyfish/seq_qual_parser.cc			\
-                       jellyfish/backtrace.cc jellyfish/floats.cc	\
-                       jellyfish/dbg.cc jellyfish/allocators_mmap.cc	\
-                       jellyfish/dna_codes.cc
-
-libjellyfish_1_1_la_SOURCES = $(libjellyfish_srcs)
-libjellyfish_1_1_la_LDFLAGS = -version-info 1:1:0
-library_includedir = $(includedir)/jellyfish- at PACKAGE_VERSION@/jellyfish
-library_include_HEADERS = jellyfish/allocators_malloc.hpp		\
-                          jellyfish/allocators_mmap.hpp			\
-                          jellyfish/allocators_shm.hpp			\
-                          jellyfish/atomic_gcc.hpp			\
-                          jellyfish/compacted_dumper.hpp		\
-                          jellyfish/compacted_hash.hpp			\
-                          jellyfish/concurrent_queues.hpp		\
-                          jellyfish/direct_indexing_array.hpp		\
-                          jellyfish/direct_sorted_dumper.hpp		\
-                          jellyfish/divisor.hpp jellyfish/dumper.hpp	\
-                          jellyfish/hash_function.hpp			\
-                          jellyfish/hash.hpp jellyfish/heap.hpp		\
-                          jellyfish/invertible_hash_array.hpp		\
-                          jellyfish/locking_hash_counters.hpp		\
-                          jellyfish/locks_pthread.hpp			\
-                          jellyfish/mapped_file.hpp			\
-                          jellyfish/mer_counting.hpp			\
-                          jellyfish/err.hpp jellyfish/misc.hpp		\
-                          jellyfish/offsets_key_value.hpp		\
-                          jellyfish/reversible_hash_function.hpp	\
-                          jellyfish/sorted_dumper.hpp			\
-                          jellyfish/square_binary_matrix.hpp		\
-                          jellyfish/storage.hpp				\
-                          jellyfish/thread_exec.hpp			\
-                          jellyfish/time.hpp jellyfish/token_ring.hpp	\
-                          jellyfish/raw_dumper.hpp			\
-                          jellyfish/capped_integer.hpp			\
-                          jellyfish/aligned_values_array.hpp		\
-                          jellyfish/fastq_dumper.hpp			\
-                          jellyfish/floats.hpp				\
-                          jellyfish/circular_buffer.hpp			\
-                          jellyfish/counter.hpp				\
-                          jellyfish/parse_quake.hpp			\
-                          jellyfish/parse_dna.hpp			\
-                          jellyfish/parse_qual_dna.hpp			\
-                          jellyfish/file_parser.hpp			\
-                          jellyfish/sequence_parser.hpp			\
-                          jellyfish/seq_qual_parser.hpp			\
-                          jellyfish/double_fifo_input.hpp		\
-                          jellyfish/read_parser.hpp			\
-                          jellyfish/parse_read.hpp			\
-                          jellyfish/simple_growing_array.hpp		\
-                          jellyfish/toFloat.h jellyfish/eLut.h		\
-                          jellyfish/dbg.hpp jellyfish/half.h		\
-                          jellyfish/backtrace.hpp			\
-                          jellyfish/dna_codes.hpp			\
-                          jellyfish/simple_circular_buffer.hpp
-
-
-########################################
-# Build tests
-########################################
-bin_generate_sequence_SOURCES = jellyfish/generate_sequence.cc		\
-                                jellyfish/mersenne.cpp
-
-bin_test_double_fifo_input_SOURCES = jellyfish/test_double_fifo_input.cc
-bin_test_read_parser_SOURCES = jellyfish/test_read_parser.cc
-
-########################################
-# Tests
-########################################
-TEST_EXTENSIONS = .sh
-SH_LOG_COMPILER = /bin/sh
-AM_SH_LOG_FLAGS = 
-
-########################################
-# Unit tests
-########################################
-TESTS = tests/generate_sequence.sh tests/serial_hashing.sh \
-	tests/parallel_hashing.sh tests/serial_direct_indexing.sh \
-	tests/parallel_direct_indexing.sh tests/raw_hash.sh \
-	tests/generate_fastq_sequence.sh \
-	tests/parallel_fastq_hashing.sh tests/multi_file.sh \
-	tests/multi_file_fastq.sh tests/from_stream.sh \
-	tests/parallel_fastq_sequence_hashing.sh \
-	tests/from_stream_fastq.sh tests/merge.sh tests/min_qual.sh \
-	tests/big.sh tests/parsers.sh tests/small.sh \
-	tests/parallel_fastq_direct_indexing.sh \
-	unit_tests/unit_tests.sh
-bin_test_all_SOURCES = unit_tests/test_offsets_key_value.cc		\
-                       unit_tests/test_simple_circular_buffer.cc	\
-                       unit_tests/test_square_binary_matrix.cc
-
-bin_test_all_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests/gtest
-bin_test_all_LDADD = libgtest_main.a libgtest.a $(LDADD)
-
-##############################
-# Gtest build.
-##############################
-# Build rules for libraries.
-# check_LTLIBRARIES = libgtest.la libgtest_main.la
-check_LIBRARIES = libgtest.a libgtest_main.a
-libgtest_a_SOURCES = unit_tests/gtest/src/gtest-all.cc
-libgtest_main_a_SOURCES = unit_tests/gtest/src/gtest_main.cc
-libgtest_main_a_LIBADD = libgtest.a
-libgtest_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest	\
--I$(top_srcdir)/unit_tests/gtest/include
-
-libgtest_main_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest	\
--I$(top_srcdir)/unit_tests/gtest/include
-
-
-# gtest source files that we don't compile directly.  They are
-# #included by gtest-all.cc.
-GTEST_SRC = unit_tests/gtest/src/gtest-death-test.cc	\
-	    unit_tests/gtest/src/gtest-filepath.cc	\
-	    unit_tests/gtest/src/gtest-internal-inl.h	\
-	    unit_tests/gtest/src/gtest-port.cc		\
-	    unit_tests/gtest/src/gtest-printers.cc	\
-	    unit_tests/gtest/src/gtest-test-part.cc	\
-	    unit_tests/gtest/src/gtest-typed-test.cc	\
-	    unit_tests/gtest/src/gtest.cc
-
-
-# Headers, not installed
-GTEST_I = unit_tests/gtest/include/gtest
-noinst_HEADERS = $(GTEST_I)/gtest-death-test.h				\
-                 $(GTEST_I)/gtest-message.h				\
-                 $(GTEST_I)/gtest-param-test.h				\
-                 $(GTEST_I)/gtest-printers.h $(GTEST_I)/gtest-spi.h	\
-                 $(GTEST_I)/gtest-test-part.h				\
-                 $(GTEST_I)/gtest-typed-test.h $(GTEST_I)/gtest.h	\
-                 $(GTEST_I)/gtest_pred_impl.h $(GTEST_I)/gtest_prod.h	\
-                 $(GTEST_I)/internal/gtest-death-test-internal.h	\
-                 $(GTEST_I)/internal/gtest-filepath.h			\
-                 $(GTEST_I)/internal/gtest-internal.h			\
-                 $(GTEST_I)/internal/gtest-linked_ptr.h			\
-                 $(GTEST_I)/internal/gtest-param-util-generated.h	\
-                 $(GTEST_I)/internal/gtest-param-util.h			\
-                 $(GTEST_I)/internal/gtest-port.h			\
-                 $(GTEST_I)/internal/gtest-string.h			\
-                 $(GTEST_I)/internal/gtest-tuple.h			\
-                 $(GTEST_I)/internal/gtest-type-util.h
-
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .cc .cpp .html .lo .log .o .obj .sh .sh$(EXEEXT)
-am--refresh: Makefile
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/gtest.mk $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-$(srcdir)/gtest.mk:
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then rm -f stamp-h1; else :; fi
-	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-tests/compat.sh: $(top_builddir)/config.status $(top_srcdir)/tests/compat.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-jellyfish-1.1.pc: $(top_builddir)/config.status $(srcdir)/jellyfish-1.1.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-
-clean-checkLIBRARIES:
-	-test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
-unit_tests/gtest/src/$(am__dirstamp):
-	@$(MKDIR_P) unit_tests/gtest/src
-	@: > unit_tests/gtest/src/$(am__dirstamp)
-unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) unit_tests/gtest/src/$(DEPDIR)
-	@: > unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT):  \
-	unit_tests/gtest/src/$(am__dirstamp) \
-	unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-libgtest.a: $(libgtest_a_OBJECTS) $(libgtest_a_DEPENDENCIES) $(EXTRA_libgtest_a_DEPENDENCIES) 
-	$(AM_V_at)-rm -f libgtest.a
-	$(AM_V_AR)$(libgtest_a_AR) libgtest.a $(libgtest_a_OBJECTS) $(libgtest_a_LIBADD)
-	$(AM_V_at)$(RANLIB) libgtest.a
-unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT):  \
-	unit_tests/gtest/src/$(am__dirstamp) \
-	unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-libgtest_main.a: $(libgtest_main_a_OBJECTS) $(libgtest_main_a_DEPENDENCIES) $(EXTRA_libgtest_main_a_DEPENDENCIES) 
-	$(AM_V_at)-rm -f libgtest_main.a
-	$(AM_V_AR)$(libgtest_main_a_AR) libgtest_main.a $(libgtest_main_a_OBJECTS) $(libgtest_main_a_LIBADD)
-	$(AM_V_at)$(RANLIB) libgtest_main.a
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-jellyfish/$(am__dirstamp):
-	@$(MKDIR_P) jellyfish
-	@: > jellyfish/$(am__dirstamp)
-jellyfish/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) jellyfish/$(DEPDIR)
-	@: > jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/square_binary_matrix.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/err.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/misc.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/storage.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/thread_exec.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/time.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/file_parser.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/read_parser.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_read.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/half.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mapped_file.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_dna.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_quake.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_qual_dna.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/sequence_parser.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/seq_qual_parser.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/backtrace.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/floats.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dbg.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/allocators_mmap.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dna_codes.lo: jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-libjellyfish-1.1.la: $(libjellyfish_1_1_la_OBJECTS) $(libjellyfish_1_1_la_DEPENDENCIES) $(EXTRA_libjellyfish_1_1_la_DEPENDENCIES) 
-	$(AM_V_CXXLD)$(libjellyfish_1_1_la_LINK) -rpath $(libdir) $(libjellyfish_1_1_la_OBJECTS) $(libjellyfish_1_1_la_LIBADD) $(LIBS)
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
-	fi; \
-	for p in $$list; do echo "$$p $$p"; done | \
-	sed 's/$(EXEEXT)$$//' | \
-	while read p p1; do if test -f $$p || test -f $$p1; \
-	  then echo "$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
-	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
-	sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
-	    else { print "f", $$3 "/" $$4, $$1; } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	    test -z "$$files" || { \
-	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	    } \
-	; done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-	      -e 's/$$/$(EXEEXT)/' `; \
-	test -n "$$list" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
-	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-clean-checkPROGRAMS:
-	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-jellyfish/generate_sequence.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mersenne.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/$(am__dirstamp):
-	@$(MKDIR_P) bin
-	@: > bin/$(am__dirstamp)
-bin/generate_sequence$(EXEEXT): $(bin_generate_sequence_OBJECTS) $(bin_generate_sequence_DEPENDENCIES) $(EXTRA_bin_generate_sequence_DEPENDENCIES) bin/$(am__dirstamp)
-	@rm -f bin/generate_sequence$(EXEEXT)
-	$(AM_V_CXXLD)$(CXXLINK) $(bin_generate_sequence_OBJECTS) $(bin_generate_sequence_LDADD) $(LIBS)
-jellyfish/jellyfish.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/stats_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/hash_merge.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mer_counter.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/histo_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dump_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/query_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dump_fastq_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/histo_fastq_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/cite.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/hash_fastq_merge.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/yaggo.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/jellyfish$(EXEEXT): $(bin_jellyfish_OBJECTS) $(bin_jellyfish_DEPENDENCIES) $(EXTRA_bin_jellyfish_DEPENDENCIES) bin/$(am__dirstamp)
-	@rm -f bin/jellyfish$(EXEEXT)
-	$(AM_V_CXXLD)$(bin_jellyfish_LINK) $(bin_jellyfish_OBJECTS) $(bin_jellyfish_LDADD) $(LIBS)
-unit_tests/$(am__dirstamp):
-	@$(MKDIR_P) unit_tests
-	@: > unit_tests/$(am__dirstamp)
-unit_tests/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) unit_tests/$(DEPDIR)
-	@: > unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT):  \
-	unit_tests/$(am__dirstamp) \
-	unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT):  \
-	unit_tests/$(am__dirstamp) \
-	unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT):  \
-	unit_tests/$(am__dirstamp) \
-	unit_tests/$(DEPDIR)/$(am__dirstamp)
-bin/test_all$(EXEEXT): $(bin_test_all_OBJECTS) $(bin_test_all_DEPENDENCIES) $(EXTRA_bin_test_all_DEPENDENCIES) bin/$(am__dirstamp)
-	@rm -f bin/test_all$(EXEEXT)
-	$(AM_V_CXXLD)$(bin_test_all_LINK) $(bin_test_all_OBJECTS) $(bin_test_all_LDADD) $(LIBS)
-jellyfish/test_double_fifo_input.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/test_double_fifo_input$(EXEEXT): $(bin_test_double_fifo_input_OBJECTS) $(bin_test_double_fifo_input_DEPENDENCIES) $(EXTRA_bin_test_double_fifo_input_DEPENDENCIES) bin/$(am__dirstamp)
-	@rm -f bin/test_double_fifo_input$(EXEEXT)
-	$(AM_V_CXXLD)$(CXXLINK) $(bin_test_double_fifo_input_OBJECTS) $(bin_test_double_fifo_input_LDADD) $(LIBS)
-jellyfish/test_read_parser.$(OBJEXT): jellyfish/$(am__dirstamp) \
-	jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/test_read_parser$(EXEEXT): $(bin_test_read_parser_OBJECTS) $(bin_test_read_parser_DEPENDENCIES) $(EXTRA_bin_test_read_parser_DEPENDENCIES) bin/$(am__dirstamp)
-	@rm -f bin/test_read_parser$(EXEEXT)
-	$(AM_V_CXXLD)$(CXXLINK) $(bin_test_read_parser_OBJECTS) $(bin_test_read_parser_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-	-rm -f jellyfish/allocators_mmap.$(OBJEXT)
-	-rm -f jellyfish/allocators_mmap.lo
-	-rm -f jellyfish/backtrace.$(OBJEXT)
-	-rm -f jellyfish/backtrace.lo
-	-rm -f jellyfish/cite.$(OBJEXT)
-	-rm -f jellyfish/dbg.$(OBJEXT)
-	-rm -f jellyfish/dbg.lo
-	-rm -f jellyfish/dna_codes.$(OBJEXT)
-	-rm -f jellyfish/dna_codes.lo
-	-rm -f jellyfish/dump_fastq_main.$(OBJEXT)
-	-rm -f jellyfish/dump_main.$(OBJEXT)
-	-rm -f jellyfish/err.$(OBJEXT)
-	-rm -f jellyfish/err.lo
-	-rm -f jellyfish/file_parser.$(OBJEXT)
-	-rm -f jellyfish/file_parser.lo
-	-rm -f jellyfish/floats.$(OBJEXT)
-	-rm -f jellyfish/floats.lo
-	-rm -f jellyfish/generate_sequence.$(OBJEXT)
-	-rm -f jellyfish/half.$(OBJEXT)
-	-rm -f jellyfish/half.lo
-	-rm -f jellyfish/hash_fastq_merge.$(OBJEXT)
-	-rm -f jellyfish/hash_merge.$(OBJEXT)
-	-rm -f jellyfish/histo_fastq_main.$(OBJEXT)
-	-rm -f jellyfish/histo_main.$(OBJEXT)
-	-rm -f jellyfish/jellyfish.$(OBJEXT)
-	-rm -f jellyfish/mapped_file.$(OBJEXT)
-	-rm -f jellyfish/mapped_file.lo
-	-rm -f jellyfish/mer_counter.$(OBJEXT)
-	-rm -f jellyfish/mersenne.$(OBJEXT)
-	-rm -f jellyfish/misc.$(OBJEXT)
-	-rm -f jellyfish/misc.lo
-	-rm -f jellyfish/parse_dna.$(OBJEXT)
-	-rm -f jellyfish/parse_dna.lo
-	-rm -f jellyfish/parse_quake.$(OBJEXT)
-	-rm -f jellyfish/parse_quake.lo
-	-rm -f jellyfish/parse_qual_dna.$(OBJEXT)
-	-rm -f jellyfish/parse_qual_dna.lo
-	-rm -f jellyfish/parse_read.$(OBJEXT)
-	-rm -f jellyfish/parse_read.lo
-	-rm -f jellyfish/query_main.$(OBJEXT)
-	-rm -f jellyfish/read_parser.$(OBJEXT)
-	-rm -f jellyfish/read_parser.lo
-	-rm -f jellyfish/seq_qual_parser.$(OBJEXT)
-	-rm -f jellyfish/seq_qual_parser.lo
-	-rm -f jellyfish/sequence_parser.$(OBJEXT)
-	-rm -f jellyfish/sequence_parser.lo
-	-rm -f jellyfish/square_binary_matrix.$(OBJEXT)
-	-rm -f jellyfish/square_binary_matrix.lo
-	-rm -f jellyfish/stats_main.$(OBJEXT)
-	-rm -f jellyfish/storage.$(OBJEXT)
-	-rm -f jellyfish/storage.lo
-	-rm -f jellyfish/test_double_fifo_input.$(OBJEXT)
-	-rm -f jellyfish/test_read_parser.$(OBJEXT)
-	-rm -f jellyfish/thread_exec.$(OBJEXT)
-	-rm -f jellyfish/thread_exec.lo
-	-rm -f jellyfish/time.$(OBJEXT)
-	-rm -f jellyfish/time.lo
-	-rm -f jellyfish/yaggo.$(OBJEXT)
-	-rm -f unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT)
-	-rm -f unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT)
-	-rm -f unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT)
-	-rm -f unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT)
-	-rm -f unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/allocators_mmap.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/backtrace.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/cite.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dbg.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dna_codes.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dump_fastq_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dump_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/err.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/file_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/floats.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/generate_sequence.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/half.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/hash_fastq_merge.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/hash_merge.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/histo_fastq_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/histo_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/jellyfish.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mapped_file.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mer_counter.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mersenne.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/misc.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_dna.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_quake.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_qual_dna.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_read.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/query_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/read_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/seq_qual_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/sequence_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/square_binary_matrix.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/stats_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/storage.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/test_double_fifo_input.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/test_read_parser.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/thread_exec.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/time.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/yaggo.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po at am__quote@
-
-.cc.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
- at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
-
-.cc.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
- at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cc.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
- at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-
-unit_tests/gtest/src/libgtest_a-gtest-all.o: unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_a-gtest-all.o -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo -c -o unit_tests/gtest/src/libgtest_a-gtest-all.o `test -f 'unit_tests/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/gtest/src/gtest-all.cc' object='unit_tests/gtest/src/libgtest_a-gtest-all.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_a-gtest-all.o `test -f 'unit_tests/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest-all.cc
-
-unit_tests/gtest/src/libgtest_a-gtest-all.obj: unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_a-gtest-all.obj -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo -c -o unit_tests/gtest/src/libgtest_a-gtest-all.obj `if test -f 'unit_tests/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest-all.cc'; fi`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/gtest/src/gtest-all.cc' object='unit_tests/gtest/src/libgtest_a-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_a-gtest-all.obj `if test -f 'unit_tests/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest-all.cc'; fi`
-
-unit_tests/gtest/src/libgtest_main_a-gtest_main.o: unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_main_a-gtest_main.o -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.o `test -f 'unit_tests/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/gtest/src/gtest_main.cc' object='unit_tests/gtest/src/libgtest_main_a-gtest_main.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.o `test -f 'unit_tests/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest_main.cc
-
-unit_tests/gtest/src/libgtest_main_a-gtest_main.obj: unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_main_a-gtest_main.obj -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.obj `if test -f 'unit_tests/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/g [...]
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/gtest/src/gtest_main.cc' object='unit_tests/gtest/src/libgtest_main_a-gtest_main.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.obj `if test -f 'unit_tests/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest_main.cc'; fi`
-
-unit_tests/bin_test_all-test_offsets_key_value.o: unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_offsets_key_value.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo -c -o unit_tests/bin_test_all-test_offsets_key_value.o `test -f 'unit_tests/test_offsets_key_value.cc' || echo '$(srcdir)/'`unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_offsets_key_value.cc' object='unit_tests/bin_test_all-test_offsets_key_value.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_offsets_key_value.o `test -f 'unit_tests/test_offsets_key_value.cc' || echo '$(srcdir)/'`unit_tests/test_offsets_key_value.cc
-
-unit_tests/bin_test_all-test_offsets_key_value.obj: unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_offsets_key_value.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo -c -o unit_tests/bin_test_all-test_offsets_key_value.obj `if test -f 'unit_tests/test_offsets_key_value.cc'; then $(CYGPATH_W) 'unit_tests/test_offsets_key_value.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_offsets_ [...]
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_offsets_key_value.cc' object='unit_tests/bin_test_all-test_offsets_key_value.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_offsets_key_value.obj `if test -f 'unit_tests/test_offsets_key_value.cc'; then $(CYGPATH_W) 'unit_tests/test_offsets_key_value.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_offsets_key_value.cc'; fi`
-
-unit_tests/bin_test_all-test_simple_circular_buffer.o: unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_simple_circular_buffer.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo -c -o unit_tests/bin_test_all-test_simple_circular_buffer.o `test -f 'unit_tests/test_simple_circular_buffer.cc' || echo '$(srcdir)/'`unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_simple_circular_buffer.cc' object='unit_tests/bin_test_all-test_simple_circular_buffer.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_simple_circular_buffer.o `test -f 'unit_tests/test_simple_circular_buffer.cc' || echo '$(srcdir)/'`unit_tests/test_simple_circular_buffer.cc
-
-unit_tests/bin_test_all-test_simple_circular_buffer.obj: unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_simple_circular_buffer.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo -c -o unit_tests/bin_test_all-test_simple_circular_buffer.obj `if test -f 'unit_tests/test_simple_circular_buffer.cc'; then $(CYGPATH_W) 'unit_tests/test_simple_circular_buffer.cc'; else $(CYGPATH_W) '$(srcdir) [...]
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_simple_circular_buffer.cc' object='unit_tests/bin_test_all-test_simple_circular_buffer.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_simple_circular_buffer.obj `if test -f 'unit_tests/test_simple_circular_buffer.cc'; then $(CYGPATH_W) 'unit_tests/test_simple_circular_buffer.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_simple_circular_buffer.cc'; fi`
-
-unit_tests/bin_test_all-test_square_binary_matrix.o: unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_square_binary_matrix.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo -c -o unit_tests/bin_test_all-test_square_binary_matrix.o `test -f 'unit_tests/test_square_binary_matrix.cc' || echo '$(srcdir)/'`unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_square_binary_matrix.cc' object='unit_tests/bin_test_all-test_square_binary_matrix.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_square_binary_matrix.o `test -f 'unit_tests/test_square_binary_matrix.cc' || echo '$(srcdir)/'`unit_tests/test_square_binary_matrix.cc
-
-unit_tests/bin_test_all-test_square_binary_matrix.obj: unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_square_binary_matrix.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo -c -o unit_tests/bin_test_all-test_square_binary_matrix.obj `if test -f 'unit_tests/test_square_binary_matrix.cc'; then $(CYGPATH_W) 'unit_tests/test_square_binary_matrix.cc'; else $(CYGPATH_W) '$(srcdir)/unit_test [...]
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unit_tests/test_square_binary_matrix.cc' object='unit_tests/bin_test_all-test_square_binary_matrix.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_square_binary_matrix.obj `if test -f 'unit_tests/test_square_binary_matrix.cc'; then $(CYGPATH_W) 'unit_tests/test_square_binary_matrix.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_square_binary_matrix.cc'; fi`
-
-.cpp.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
- at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
- at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
- at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-	-rm -rf bin/.libs bin/_libs
-	-rm -rf jellyfish/.libs jellyfish/_libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-man1: $(man1_MANS)
-	@$(NORMAL_INSTALL)
-	@list1='$(man1_MANS)'; \
-	list2=''; \
-	test -n "$(man1dir)" \
-	  && test -n "`echo $$list1$$list2`" \
-	  || exit 0; \
-	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
-	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
-	{ for i in $$list1; do echo "$$i"; done;  \
-	if test -n "$$list2"; then \
-	  for i in $$list2; do echo "$$i"; done \
-	    | sed -n '/\.1[a-z]*$$/p'; \
-	fi; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
-install-library_includeHEADERS: $(library_include_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(library_includedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(library_includedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \
-	done
-
-uninstall-library_includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(library_includedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-	@$(am__sh_e_setup);						\
-	list='$(TEST_LOGS)';						\
-	results=`for f in $$list; do					\
-		   test -r $$f && read line < $$f && echo "$$line"	\
-		     || echo FAIL;					\
-		 done`;							\
-	all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[	 ]*//'`; \
-	fail=`echo "$$results" | grep -c '^FAIL'`;			\
-	pass=`echo "$$results" | grep -c '^PASS'`;			\
-	skip=`echo "$$results" | grep -c '^SKIP'`;			\
-	xfail=`echo "$$results" | grep -c '^XFAIL'`;			\
-	xpass=`echo "$$results" | grep -c '^XPASS'`;			\
-	failures=`expr $$fail + $$xpass`;				\
-	all=`expr $$all - $$skip`;					\
-	if test "$$all" -eq 1; then tests=test; All=;			\
-	else tests=tests; All="All "; fi;				\
-	case fail=$$fail:xpass=$$xpass:xfail=$$xfail in			\
-	  fail=0:xpass=0:xfail=0)					\
-	    msg="$$All$$all $$tests passed.  ";				\
-	    exit=true;;							\
-	  fail=0:xpass=0:xfail=*)					\
-	    msg="$$All$$all $$tests behaved as expected";		\
-	    if test "$$xfail" -eq 1; then xfailures=failure;		\
-	    else xfailures=failures; fi;				\
-	    msg="$$msg ($$xfail expected $$xfailures).  ";		\
-	    exit=true;;							\
-	  fail=*:xpass=0:xfail=*)					\
-	    msg="$$fail of $$all $$tests failed.  ";			\
-	    exit=false;;						\
-	  fail=*:xpass=*:xfail=*)					\
-	    msg="$$failures of $$all $$tests did not behave as expected"; \
-	    if test "$$xpass" -eq 1; then xpasses=pass;			\
-	    else xpasses=passes; fi;					\
-	    msg="$$msg ($$xpass unexpected $$xpasses).  ";		\
-	    exit=false;;						\
-	  *)								\
-	    echo >&2 "incorrect case"; exit 4;;				\
-	esac;								\
-	if test "$$skip" -ne 0; then					\
-	  if test "$$skip" -eq 1; then					\
-	    msg="$$msg($$skip test was not run).  ";			\
-	  else								\
-	    msg="$$msg($$skip tests were not run).  ";			\
-	  fi;								\
-	fi;								\
-	{								\
-	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
-	    $(am__rst_title);						\
-	  echo "$$msg";							\
-	  echo;								\
-	  echo ".. contents:: :depth: 2";				\
-	  echo;								\
-	  for f in $$list; do						\
-	    test -r $$f && read line < $$f || line=;			\
-	    case $$line in						\
-	      PASS:*|XFAIL:*);;						\
-	      *) echo; cat $$f;;					\
-	    esac;							\
-	  done;								\
-	} >$(TEST_SUITE_LOG).tmp;					\
-	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
-	if test "$$failures" -ne 0; then				\
-	  msg="$${msg}See $(subdir)/$(TEST_SUITE_LOG).  ";		\
-	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
-	    msg="$${msg}Please report to $(PACKAGE_BUGREPORT).  ";	\
-	  fi;								\
-	fi;								\
-	test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG);	\
-	$(am__tty_colors);						\
-	if $$exit; then							\
-	  col="$$grn";							\
-	 else								\
-	  col="$$red";							\
-	fi;								\
-	echo "$$msg" | $(am__text_box) "col=$$col" "std=$$std";		\
-	$$exit || exit 1
-
-check-TESTS recheck:
-	@if test $@ != recheck; then \
-	   list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list; \
-	 fi
-	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-	@list='' list2='$(TEST_LOGS)'; for f in $$list2; do \
-	  test .log = $$f && continue; \
-	  if test $@ = recheck; then \
-	    test -f $$f || continue; \
-	    if test -r $$f && read line < $$f; then \
-	      case $$line in FAIL*|XPASS*) : ;; *) continue;; esac; \
-	    fi; \
-	  fi; \
-	  if test -z "$$list"; then list=$$f; else list="$$list $$f"; fi; \
-	done; \
-	if test $@ = recheck && test -n "$$list"; then \
-	  $(am__make_dryrun) || rm -f $$list || exit 1; \
-	fi; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list"
-recheck: $(check_LIBRARIES) $(check_PROGRAMS)
-
-am--mostlyclean-test-html:
-	list='$(TEST_LOGS:.log=.html)'; test -z "$$list" || rm -f $$list
-	rm -f $(TEST_SUITE_HTML)
-
-.log.html:
-	@list='$(RST2HTML) $$RST2HTML rst2html rst2html.py';		\
-	for r2h in $$list; do						\
-	  if ($$r2h --version) >/dev/null 2>&1; then			\
-	    R2H=$$r2h;							\
-	  fi;								\
-	done;								\
-	if test -z "$$R2H"; then					\
-	  echo >&2 "cannot find rst2html, cannot create $@";		\
-	  exit 2;							\
-	fi;								\
-	$$R2H $< >$@.tmp
-	@mv $@.tmp $@
-
-# Be sure to run check first, and then to convert the result.
-# Beware of concurrent executions.  Run "check" not "check-TESTS", as
-# check-SCRIPTS and other dependencies are rebuilt by the former only.
-# And expect check to fail.
-check-html recheck-html:
-	@target=`echo $@ | sed 's/-html$$//'`; \
-	rv=0; $(MAKE) $(AM_MAKEFLAGS) $$target || rv=$$?; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) TEST_LOGS= || exit 4; \
-	exit $$rv
-.sh.log:
-	@p='$<'; $(am__check_pre) $(SH_LOG_COMPILE) "$$tst" $(am__check_post)
- at am__EXEEXT_TRUE@.sh$(EXEEXT).log:
- at am__EXEEXT_TRUE@	@p='$<'; $(am__check_pre) $(SH_LOG_COMPILE) "$$tst" $(am__check_post)
-
-distdir: $(DISTFILES)
-	@list='$(MANS)'; if test -n "$$list"; then \
-	  list=`for p in $$list; do \
-	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	    if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
-	  if test -n "$$list" && \
-	    grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
-	    echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
-	    grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
-	    echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
-	    echo "       typically \`make maintainer-clean' will remove them" >&2; \
-	    exit 1; \
-	  else :; fi; \
-	else :; fi
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzip: distdir
-	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.lz*) \
-	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod u+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@test -n '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: trying to run $@ with an empty' \
-	       '$$(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	$(am__cd) '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) $(check_PROGRAMS)
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) \
-		config.h
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(library_includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-	-test -z "$(TEST_LOGS_TMP)" || rm -f $(TEST_LOGS_TMP)
-	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-	-rm -f bin/$(am__dirstamp)
-	-rm -f jellyfish/$(DEPDIR)/$(am__dirstamp)
-	-rm -f jellyfish/$(am__dirstamp)
-	-rm -f unit_tests/$(DEPDIR)/$(am__dirstamp)
-	-rm -f unit_tests/$(am__dirstamp)
-	-rm -f unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-	-rm -f unit_tests/gtest/src/$(am__dirstamp)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-checkLIBRARIES clean-checkPROGRAMS \
-	clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf jellyfish/$(DEPDIR) unit_tests/$(DEPDIR) unit_tests/gtest/src/$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-library_includeHEADERS install-man \
-	install-pkgconfigDATA
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man1
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf jellyfish/$(DEPDIR) unit_tests/$(DEPDIR) unit_tests/gtest/src/$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: am--mostlyclean-test-html mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \
-	uninstall-library_includeHEADERS uninstall-man \
-	uninstall-pkgconfigDATA
-
-uninstall-man: uninstall-man1
-
-.MAKE: all check-am check-html install-am install-strip recheck-html
-
-.PHONY: CTAGS GTAGS all all-am am--mostlyclean-test-html am--refresh \
-	check check-TESTS check-am check-html clean clean-binPROGRAMS \
-	clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
-	clean-libLTLIBRARIES clean-libtool clean-local ctags dist \
-	dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar \
-	dist-tarZ dist-xz dist-zip distcheck distclean \
-	distclean-compile distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-libLTLIBRARIES \
-	install-library_includeHEADERS install-man install-man1 \
-	install-pdf install-pdf-am install-pkgconfigDATA install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am recheck recheck-html \
-	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-libLTLIBRARIES uninstall-library_includeHEADERS \
-	uninstall-man uninstall-man1 uninstall-pkgconfigDATA
-
-clean-local: clean-local-check
-.PHONY: clean-local-check
-clean-local-check:
-	-cd tests; rm -f seq10m* seq1m* *_0 *_1 *_2 *_S *.md5sum *.histo *.stats *.timing *.query *.dump *.fa
-
-tests/serial_hashing.log: tests/generate_sequence.log
-tests/parallel_hashing.log: tests/generate_sequence.log
-tests/serial_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_fastq_direct_indexing.log: tests/generate_fastq_sequence.log
-tests/multi_file.log: tests/generate_sequence.log
-tests/raw_hash.log: tests/generate_sequence.log
-tests/from_stream.log: tests/generate_sequence.log
-tests/parallel_fastq_hashing.log: tests/generate_fastq_sequence.log
-tests/parallel_fastq_sequence_hashing.log: tests/generate_fastq_sequence.log
-tests/multi_file_fastq.log: tests/generate_fastq_sequence.log
-tests/from_stream_fastq.log: tests/generate_fastq_sequence.log
-tests/merge.log: tests/generate_fastq_sequence.log
-tests/min_qual.log: tests/generate_fastq_sequence.log
-tests/parsers.log: tests/generate_sequence.log
-
--include $(top_srcdir)/development.mk
-
-########
-# info #
-########
-print-%:
-	@echo -n $($*)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/Makefile.simple b/Makefile.simple
new file mode 100644
index 0000000..0e1730b
--- /dev/null
+++ b/Makefile.simple
@@ -0,0 +1,40 @@
+# This Makefile is meant to be run in the traget directories. There
+# name start with a '_' by convention and contain a config.h.
+
+CC = g++
+CPPFLAGS = -Wall -Werror -g -O2 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -I.
+# Uncomment following to use SSE
+# CPPFLAGS += -msse -msse2 -DSSE
+LDFLAGS = -lpthread
+TARGETS = jellyfish 
+# old TARGETS = mer_counter dump_stats dump_stats_compacted hash_merge
+SOURCES = $(patsubst %,%.cc,$(TARGETS)) mer_count_thread.cc
+
+.SECONDARY:
+
+#VPATH=..:../lib
+
+%.d: %.cc
+	$(CC) -M -MM -MG -MP $(CPPFLAGS) $< > $@.tmp
+	sed -e 's/$*.o/& $@/g' $@.tmp > $@ && rm $@.tmp
+
+all: $(TARGETS)
+
+jellyfish: dump_stats_compacted.o square_binary_matrix.o hash_merge.o storage.o misc.o mer_count_thread.o mer_counter.o
+
+# compare_dump3: compare_dump3.o
+# dump_stats_compacted: dump_stats_compacted.o square_binary_matrix.o
+total_mers_single_fasta: total_mers_single_fasta.o
+mer_counter_C: mer_counter_C.o
+
+# hash_merge: hash_merge.o storage.o misc.o
+# mer_counter: mer_counter.o mer_count_thread.o storage.o misc.o
+# dump_mers: dump_mers.o storage.o misc.o
+dump_stats: dump_stats.o storage.o misc.o
+
+clean:
+	rm -f $(TARGETS) *.o *.d
+
+# Is the following OK? Shouldn't we include more than that?
+include $(SOURCES:.cc=.d)
+-include local.mk
diff --git a/README b/README
index 8cf449a..d73a91b 100644
--- a/README
+++ b/README
@@ -25,6 +25,26 @@ jellyfish. MANPATH is used by the man command. PKG_CONFIG_PATH and
 LD_LIBRARY_PATH are used to compile software against the jellyfish
 shared library.
 
+GCC requirement
+===============
+
+GCC version 4.4 or higher is required to compile Jellyfish. Most
+current Linux distribution provides a version of gcc current
+enough. On RedHat 5.x, install the packages gcc44 and gcc44-c++.
+
+To install on Mac OS X: Jellyfish 2.0 does not compile with Apple's
+Xcode GCC 4.2. Instead, the easiest thing to do is to install GCC 4.8
+using MacPorts (http://www.macports.org) using the following commands:
+
+        sudo port install gcc48
+        sudo port install gcc_select
+        sudo port select -set gcc mp-gcc48
+
+The first command installs GCC version 4.8. The third command makes
+that version of GCC the default, and the second installs a package that
+makes the third command work. After the above, you should be able to
+run './configure ; make' as normal.
+
 Tests
 =====
 
@@ -47,7 +67,7 @@ to create the data, 10 to run jellyfish).
 Notes
 =====
 
-* Jellyfish has been devellopped and tested on x86-64 GNU/Linux. It
+* Jellyfish has been developed and tested on x86-64 GNU/Linux. It
   compiles and runs correctly the tests on MacOS X (Intel) and
   FreeBSD. It should be fairly easy to port on other *NIX platform
   with the gcc compiler, but no guarantee is made. Support for 32-bits
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bc5bb1c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+Jellyfish
+=========
+
+Overview
+--------
+
+Jellyfish is a tool for fast, memory-efficient counting of k-mers in DNA. A k-mer is a substring of length k, and counting the occurrences of all such substrings is a central step in many analyses of DNA sequence. Jellyfish can count k-mers using an order of magnitude less memory and an order of magnitude faster than other k-mer counting packages by using an efficient encoding of a hash table and by exploiting the "compare-and-swap" CPU instruction to increase parallelism.
+
+JELLYFISH is a command-line program that reads FASTA and multi-FASTA files containing DNA sequences. It outputs its k-mer counts in an binary format, which can be translated into a human-readable text format using the "jellyfish dump" command. See the documentation below for more details.
+
+If you use Jellyfish in your research, please cite:
+
+  Guillaume Marcais and Carl Kingsford, A fast, lock-free approach for efficient parallel counting of occurrences of k-mers. Bioinformatics (2011) 27(6): 764-770 ([first published online January 7, 2011](http://bioinformatics.oxfordjournals.org/cgi/content/abstract/27/6/764 "Paper on Oxford Bioinformatics website")) doi:10.1093/bioinformatics/btr011
+
+Installation
+------------
+
+To get packaged tar ball of the source code, see the [home page of Jellyfish at the University of Maryland](http://www.genome.umd.edu/jellyfish.html "University of Maryland website").
+
+To compile from the git tree, you will need autoconf/automake, make, g++ 4.4 or newer and [yaggo](https://github.com/gmarcais/yaggo "Yaggo on github"). Then compile with:
+
+```Shell
+autoreconf -i
+./configure
+make
+sudo make install
+```
+
+Extra / Examples
+----------------
+
+In the examples directory are potentially useful extra programs to query/manipulates output files from Jellyfish. The examples are not compiled by default. Each subdirectory of examples is independent and is compiled with a simple invocation of 'make'.
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index 20ca7c9..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,1033 +0,0 @@
-# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.6], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.6])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# --------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009, 2011  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-dnl
-dnl A few `make' implementations (e.g., NonStop OS and NextStep)
-dnl do not support nested variable expansions.
-dnl See automake bug#9928 and bug#10237.
-am_make=${MAKE-make}
-AC_CACHE_CHECK([whether $am_make supports nested variables],
-   [am_cv_make_support_nested_variables],
-   [if AS_ECHO([['TRUE=$(BAR$(V))
-BAR0=false
-BAR1=true
-V=1
-am__doit:
-	@$(TRUE)
-.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
-  am_cv_make_support_nested_variables=yes
-else
-  am_cv_make_support_nested_variables=no
-fi])
-if test $am_cv_make_support_nested_variables = yes; then
-  dnl Using `$V' instead of `$(V)' breaks IRIX make.
-  AM_V='$(V)'
-  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
-  AM_V=$AM_DEFAULT_VERBOSITY
-  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
-AC_SUBST([AM_V])dnl
-AM_SUBST_NOTMAKE([AM_V])dnl
-AC_SUBST([AM_DEFAULT_V])dnl
-AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
-     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/config.guess b/config.guess
deleted file mode 100755
index d622a44..0000000
--- a/config.guess
+++ /dev/null
@@ -1,1530 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches at gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi at noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-		os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-	echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	SUN_ARCH="i386"
-	# If there is a compiler, see if it is configured for 64-bit objects.
-	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
-	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-	echo m68k-milan-mint${UNAME_RELEASE}
-	exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-	echo m68k-hades-mint${UNAME_RELEASE}
-	exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-unknown-mint${UNAME_RELEASE}
-	exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-	# DG/UX returns AViiON for all architectures
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
-	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[4567])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-		      532)                      # CPU_PA_RISC2_0
-			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-			esac ;;
-		    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^		//' << EOF >$dummy.c
-
-		#define _HPUX_SOURCE
-		#include <stdlib.h>
-		#include <unistd.h>
-
-		int main ()
-		{
-		#if defined(_SC_KERNEL_BITS)
-		    long bits = sysconf(_SC_KERNEL_BITS);
-		#endif
-		    long cpu  = sysconf (_SC_CPU_VERSION);
-
-		    switch (cpu)
-			{
-			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-			case CPU_PA_RISC2_0:
-		#if defined(_SC_KERNEL_BITS)
-			    switch (bits)
-				{
-				case 64: puts ("hppa2.0w"); break;
-				case 32: puts ("hppa2.0n"); break;
-				default: puts ("hppa2.0"); break;
-				} break;
-		#else  /* !defined(_SC_KERNEL_BITS) */
-			    puts ("hppa2.0"); break;
-		#endif
-			default: puts ("hppa1.0"); break;
-			}
-		    exit (0);
-		}
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-	exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-	exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-	exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-	exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case ${UNAME_PROCESSOR} in
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS*:*)
-	echo ${UNAME_MACHINE}-pc-msys
-	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    aarch64_be:Linux:*:*)
-	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-	esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-		| grep -q __ARM_PCS_VFP
-	    then
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	    else
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
-	    fi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-	# Unixware is an offshoot of SVR4, but it has its own version
-	# number series starting with 2...
-	# I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-	# Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-	# uname -m prints for DJGPP always 'pc', but it prints nothing about
-	# the processor, so we play safe by assuming i586.
-	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-	exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-			# says <Richard.M.Bartel at ccMail.Census.GOV>
-	echo i586-unisys-sysv4
-	exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes at openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf at swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green at stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green at stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-		echo mips-nec-sysv${UNAME_RELEASE}
-	else
-		echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-	exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-	echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-    x86_64:VMkernel:*:*)
-	echo ${UNAME_MACHINE}-unknown-esx
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches at gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.h.in b/config.h.in
deleted file mode 100644
index 7801220..0000000
--- a/config.h.in
+++ /dev/null
@@ -1,90 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if you use half floats for qmer counting */
-#undef HALF_FLOATS
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRERROR_R
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <execinfo.h> header file. */
-#undef HAVE_EXECINFO_H
-
-/* Define if type __int128 is supported */
-#undef HAVE_INT128
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define if siginfo_t.si_int exists */
-#undef HAVE_SI_INT
-
-/* Define if you have SSE */
-#undef HAVE_SSE
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strerror_r' function. */
-#undef HAVE_STRERROR_R
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/syscall.h> header file. */
-#undef HAVE_SYS_SYSCALL_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if strerror_r returns char *. */
-#undef STRERROR_R_CHAR_P
-
-/* Version number of package */
-#undef VERSION
diff --git a/config.sub b/config.sub
deleted file mode 100755
index c894da4..0000000
--- a/config.sub
+++ /dev/null
@@ -1,1773 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches at gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-	-bluegene*)
-		os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
-	-chorusrdb)
-		os=-chorusrdb
-		basic_machine=$1
-		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| aarch64 | aarch64_be \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| hexagon \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| open8 \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| rl78 | rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-	xgate)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| aarch64-* | aarch64_be-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| rl78-* | romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16 | cr16-*)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	msys)
-		basic_machine=i386-pc
-		os=-msys
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
-		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tile*)
-		basic_machine=$basic_machine-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-	-os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-	-tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-	-nacl*)
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	score-*)
-		os=-elf
-		;;
-	spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-	c4x-* | tic4x-*)
-		os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
deleted file mode 100755
index dc385a3..0000000
--- a/configure
+++ /dev/null
@@ -1,18209 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for jellyfish 1.1.11.
-#
-# Report bugs to <gmarcais at umd.edu>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	# Preserve -v and -x to the replacement shell.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	case $- in # ((((
-	  *v*x* | *x*v* ) as_opts=-vx ;;
-	  *v* ) as_opts=-v ;;
-	  *x* ) as_opts=-x ;;
-	  * ) as_opts= ;;
-	esac
-	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf at gnu.org and gmarcais at umd.edu
-$0: about your system, including any error possibly output
-$0: before this message. Then install a modern shell, or
-$0: manually run the script under such a shell if you do
-$0: have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='jellyfish'
-PACKAGE_TARNAME='jellyfish'
-PACKAGE_VERSION='1.1.11'
-PACKAGE_STRING='jellyfish 1.1.11'
-PACKAGE_BUGREPORT='gmarcais at umd.edu'
-PACKAGE_URL=''
-
-ac_unique_file="jellyfish"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-STATIC_FLAGS
-MD5
-CXXCPP
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-MANIFEST_TOOL
-RANLIB
-ac_ct_AR
-AR
-DLLTOOL
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-am__nodep
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-LIBTOOL
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-AM_DEFAULT_V
-AM_V
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-enable_dependency_tracking
-with_gnu_ld
-with_sysroot
-enable_libtool_lock
-with_sse
-with_half
-enable_all_static
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP
-CXX
-CXXFLAGS
-CCC
-CXXCPP
-MD5'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *=)   ac_optarg= ;;
-  *)    ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures jellyfish 1.1.11 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking ...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/jellyfish]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of jellyfish 1.1.11:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-all-static     create statically linked executable
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
-  --with-sse              enable SSE
-  --with-half             enable half float (16 bits)
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-  CXX         C++ compiler command
-  CXXFLAGS    C++ compiler flags
-  CXXCPP      C++ preprocessor
-  MD5         Path to md5 hashing program
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <gmarcais at umd.edu>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-jellyfish configure 1.1.11
-generated by GNU Autoconf 2.68
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
-# ---------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_cxx_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_type
-
-# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
-# -----------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_cxx_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_decl
-
-# ac_fn_cxx_check_func LINENO FUNC VAR
-# ------------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_cxx_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_func
-
-# ac_fn_cxx_try_run LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_cxx_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_run
-
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------- ##
-## Report this to gmarcais at umd.edu ##
-## ------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_header_mongrel
-
-# ac_fn_cxx_check_member LINENO AGGR MEMBER VAR INCLUDES
-# ------------------------------------------------------
-# Tries to find if the field MEMBER exists in type AGGR, after including
-# INCLUDES, setting cache variable VAR accordingly.
-ac_fn_cxx_check_member ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval \${$4+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (sizeof ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  eval "$4=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$4
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_member
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by jellyfish $as_me 1.1.11, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if ${ac_cv_path_mkdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='jellyfish'
- VERSION='1.1.11'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
-
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
-  enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
-esac
-am_make=${MAKE-make}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
-$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
-if ${am_cv_make_support_nested_variables+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if $as_echo 'TRUE=$(BAR$(V))
-BAR0=false
-BAR1=true
-V=1
-am__doit:
-	@$(TRUE)
-.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
-  am_cv_make_support_nested_variables=yes
-else
-  am_cv_make_support_nested_variables=no
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
-$as_echo "$am_cv_make_support_nested_variables" >&6; }
-if test $am_cv_make_support_nested_variables = yes; then
-    AM_V='$(V)'
-  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
-  AM_V=$AM_DEFAULT_VERBOSITY
-  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
-AM_BACKSLASH='\'
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.4.2'
-macro_revision='1.3337'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
-
-fi
-
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  #assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
-
-fi
-
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
-    fi
-    ;;
-  esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DLLTOOL" = x; then
-    DLLTOOL="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DLLTOOL=$ac_ct_DLLTOOL
-  fi
-else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in ar
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$AR" && break
-  done
-fi
-if test -z "$AR"; then
-  ac_ct_AR=$AR
-  for ac_prog in ar
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_AR" && break
-done
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-fi
-
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ar_at_file=no
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
-      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
-
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
-else
-  archiver_list_spec=$lt_cv_ar_at_file
-fi
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-LT_DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
-  nm_file_list_spec='@'
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
-
-# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
-  withval=$with_sysroot;
-else
-  with_sysroot=no
-fi
-
-
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
-   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
-   ;;
-esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
-set dummy ${ac_tool_prefix}mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$MANIFEST_TOOL"; then
-  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
-if test -n "$MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
-  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
-  # Extract the first word of "mt", so it can be a program name with args.
-set dummy mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_MANIFEST_TOOL"; then
-  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
-if test -n "$ac_ct_MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_MANIFEST_TOOL" = x; then
-    MANIFEST_TOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
-  fi
-else
-  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
-fi
-
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&5
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
-fi
-
-
-
-
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&5
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      if test -n "$lt_prog_compiler_pic"; then
-        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	lt_prog_compiler_wl='-Wl,-Wl,,'
-	lt_prog_compiler_pic='-PIC'
-	lt_prog_compiler_static='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-        *Intel*\ [CF]*Compiler*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fPIC'
-	  lt_prog_compiler_static='-static'
-	  ;;
-	*Portland\ Group*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fpic'
-	  lt_prog_compiler_static='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath_
-fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath_
-fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	always_export_symbols=yes
-	file_list_spec='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
-	enable_shared_with_static_runtimes=yes
-	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	old_postinstall_cmds='chmod 644 $oldlib'
-	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	old_archive_from_new_cmds='true'
-	# FIXME: Should let the user specify the lib program.
-	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	enable_shared_with_static_runtimes=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo (void) { return 0; }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_irix_exported_symbol=yes
-else
-  lt_cv_irix_exported_symbol=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# Change default compilation flags
-#AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
-#CXXFLAGS="-std=c++0x $CXXFLAGS"
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
-
-
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
-
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-else
-  _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      whole_archive_flag_spec_CXX='$convenience'
-	    fi
-	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX=' '
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=yes
-	  file_list_spec_CXX='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
-	  enable_shared_with_static_runtimes_CXX=yes
-	  # Don't use ranlib
-	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
-	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=no
-	  enable_shared_with_static_runtimes_CXX=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    ld_shlibs_CXX=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
-  else
-    whole_archive_flag_spec_CXX=''
-  fi
-  link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-
-  else
-  ld_shlibs_CXX=no
-  fi
-
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        ld_shlibs_CXX=no
-        ;;
-
-      freebsd-elf*)
-        archive_cmds_need_lc_CXX=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        ld_shlibs_CXX=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        link_all_deplibs_CXX=yes
-        ;;
-
-      hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
-        hardcode_direct_CXX=yes
-        hardcode_minus_L_CXX=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            ld_shlibs_CXX=no
-            ;;
-          aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              ld_shlibs_CXX=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct_CXX=no
-            hardcode_shlibpath_var_CXX=no
-            ;;
-          *)
-            hardcode_direct_CXX=yes
-            hardcode_direct_absolute_CXX=yes
-            hardcode_minus_L_CXX=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[3-9]*)
-	hardcode_direct_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    link_all_deplibs_CXX=yes
-	    ;;
-        esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        inherit_rpath_CXX=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
-	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      compiler_needs_object_CXX=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  hardcode_libdir_flag_spec_CXX='-R$libdir'
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        ld_shlibs_CXX=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	  hardcode_direct_absolute_CXX=yes
-	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-		;;
-	    esac
-
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	      hardcode_libdir_separator_CXX=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            archive_cmds_need_lc_CXX=yes
-	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    hardcode_libdir_flag_spec_CXX='-R$libdir'
-	    hardcode_shlibpath_var_CXX=no
-	    case $host_os in
-	      solaris2.[0-5] | solaris2.[0-5].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    link_all_deplibs_CXX=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[0-5] | solaris2.[0-5].*) ;;
-		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
-      archive_cmds_need_lc_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
-	archive_cmds_need_lc_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
-	hardcode_libdir_separator_CXX=':'
-	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
-	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
-	    ;;
-	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_CXX='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static_CXX=
-      ;;
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_CXX='-fPIC -shared'
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[4-9]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-qpic'
-	    lt_prog_compiler_static_CXX='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      lt_prog_compiler_pic_CXX='-KPIC'
-	      lt_prog_compiler_static_CXX='-Bstatic'
-	      lt_prog_compiler_wl_CXX='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        lt_prog_compiler_pic_CXX='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_CXX=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  case $host_os in
-  aix[4-9]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-      ;;
-    esac
-    ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_CXX
-	  pic_flag=$lt_prog_compiler_pic_CXX
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-	  allow_undefined_flag_CXX=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc_CXX=no
-	  else
-	    lt_cv_archive_cmds_need_lc_CXX=yes
-	  fi
-	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
-      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
-   test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-
-ac_config_files="$ac_config_files Makefile tests/compat.sh jellyfish-1.1.pc"
-
-
-
-if test "x$MD5" = "x"; then :
-  # Extract the first word of "md5sum", so it can be a program name with args.
-set dummy md5sum; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MD5+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$MD5"; then
-  ac_cv_prog_MD5="$MD5" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_MD5="md5sum"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-MD5=$ac_cv_prog_MD5
-if test -n "$MD5"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5" >&5
-$as_echo "$MD5" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test "x$MD5" = "x"; then :
-  # Extract the first word of "md5", so it can be a program name with args.
-set dummy md5; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MD5+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$MD5"; then
-  ac_cv_prog_MD5="$MD5" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_MD5="md5 -r"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-MD5=$ac_cv_prog_MD5
-if test -n "$MD5"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5" >&5
-$as_echo "$MD5" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test "x$MD5" = "x"; then :
-  as_fn_error $? "Could not find md5 hashing program in your path" "$LINENO" 5
-fi
-
-
-# Check whether --with-sse was given.
-if test "${with_sse+set}" = set; then :
-  withval=$with_sse;
-else
-  with_sse=no
-fi
-
-if test "x$with_sse" != xno; then :
-
-$as_echo "#define HAVE_SSE 1" >>confdefs.h
-
-fi
-
-
-# Check whether --with-half was given.
-if test "${with_half+set}" = set; then :
-  withval=$with_half;
-else
-  with_half=no
-fi
-
-if test "x$with_half" = "xyes"; then :
-
-$as_echo "#define HALF_FLOATS 1" >>confdefs.h
-
-fi
-
-ac_fn_cxx_check_type "$LINENO" "__int128" "ac_cv_type___int128" "$ac_includes_default"
-if test "x$ac_cv_type___int128" = xyes; then :
-
-$as_echo "#define HAVE_INT128 1" >>confdefs.h
-
-fi
-
-
-
-# Check the version of strerror_r
-ac_fn_cxx_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R $ac_have_decl
-_ACEOF
-
-for ac_func in strerror_r
-do :
-  ac_fn_cxx_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r"
-if test "x$ac_cv_func_strerror_r" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRERROR_R 1
-_ACEOF
-
-fi
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
-$as_echo_n "checking whether strerror_r returns char *... " >&6; }
-if ${ac_cv_func_strerror_r_char_p+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    ac_cv_func_strerror_r_char_p=no
-    if test $ac_cv_have_decl_strerror_r = yes; then
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	  char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  char *p = strerror_r (0, buf, sizeof buf);
-	  return !p || x;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    else
-      # strerror_r is not declared.  Choose between
-      # systems that have relatively inaccessible declarations for the
-      # function.  BeOS and DEC UNIX 4.0 fall in this category, but the
-      # former has a strerror_r that returns char*, while the latter
-      # has a strerror_r that returns `int'.
-      # This test should segfault on the DEC system.
-      if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-	extern char *strerror_r ();
-int
-main ()
-{
-char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  return ! isalpha (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-  ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
-$as_echo "$ac_cv_func_strerror_r_char_p" >&6; }
-if test $ac_cv_func_strerror_r_char_p = yes; then
-
-$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h
-
-fi
-
-
-
-for ac_header in execinfo.h sys/syscall.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-ac_fn_cxx_check_member "$LINENO" "siginfo_t" "si_int" "ac_cv_member_siginfo_t_si_int" "#include <signal.h>
-"
-if test "x$ac_cv_member_siginfo_t_si_int" = xyes; then :
-
-$as_echo "#define HAVE_SI_INT 1" >>confdefs.h
-
-fi
-
-
-# --enable-all-static
-# Do not use libtool if building all static
-# Check whether --enable-all-static was given.
-if test "${enable_all_static+set}" = set; then :
-  enableval=$enable_all_static;
-fi
-
-STATIC_FLAGS=
-if test x$enable_all_static = xyes; then :
-  STATIC_FLAGS=-all-static
-
-fi
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    if test "x$cache_file" != "x/dev/null"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-      if test ! -f "$cache_file" || test -h "$cache_file"; then
-	cat confcache >"$cache_file"
-      else
-        case $cache_file in #(
-        */* | ?:*)
-	  mv -f confcache "$cache_file"$$ &&
-	  mv -f "$cache_file"$$ "$cache_file" ;; #(
-        *)
-	  mv -f confcache "$cache_file" ;;
-	esac
-      fi
-    fi
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: "${CONFIG_STATUS=./config.status}"
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by jellyfish $as_me 1.1.11, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <gmarcais at umd.edu>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-jellyfish config.status 1.1.11
-configured by $0, generated by GNU Autoconf 2.68,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=?*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  --*=)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    '') as_fn_error $? "missing file argument" ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-PATH_SEPARATOR \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-file_magic_glob \
-want_nocaseglob \
-DLLTOOL \
-sharedlib_from_linklib_cmd \
-AR \
-AR_FLAGS \
-archiver_list_spec \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-nm_file_list_spec \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_pic \
-lt_prog_compiler_wl \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-MANIFEST_TOOL \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_separator \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_separator_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postlink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX \
-postlink_cmds_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "tests/compat.sh") CONFIG_FILES="$CONFIG_FILES tests/compat.sh" ;;
-    "jellyfish-1.1.pc") CONFIG_FILES="$CONFIG_FILES jellyfish-1.1.pc" ;;
-
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp= ac_tmp=
-  trap 'exit_status=$?
-  : "${ac_tmp:=$tmp}"
-  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
-h
-s///
-s/^/:/
-s/[	 ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[	 ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_tt"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$ac_tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$ac_tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
-  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
-      "$ac_tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&2;}
-
-  rm -f "$ac_tmp/stdin"
-  case $ac_file in
-  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
-  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
-    } >"$ac_tmp/config.h" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$ac_tmp/config.h" "$ac_file" \
-	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error $? "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The PATH separator for the build system.
-PATH_SEPARATOR=$lt_PATH_SEPARATOR
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# convert \$build file names to \$host format.
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-
-# convert \$build files to toolchain format.
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method = "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# How to find potential files when deplibs_check_method = "file_magic".
-file_magic_glob=$lt_file_magic_glob
-
-# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
-want_nocaseglob=$lt_want_nocaseglob
-
-# DLL creation program.
-DLLTOOL=$lt_DLLTOOL
-
-# Command to associate shared and link libraries.
-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
-
-# The archiver.
-AR=$lt_AR
-
-# Flags to create an archive.
-AR_FLAGS=$lt_AR_FLAGS
-
-# How to feed a file listing to the archiver.
-archiver_list_spec=$lt_archiver_list_spec
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# Specify filename containing input files for \$NM.
-nm_file_list_spec=$lt_nm_file_list_spec
-
-# The root where to search for dependent libraries,and in which our libraries should be installed.
-lt_sysroot=$lt_sysroot
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Manifest tool.
-MANIFEST_TOOL=$lt_MANIFEST_TOOL
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" \
-     || (rm -f "$cfgfile"; exit 1)
-
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
-   mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-
diff --git a/configure.ac b/configure.ac
index d650d0f..fba0614 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,23 +1,33 @@
-AC_INIT([jellyfish], [1.1.11], [gmarcais at umd.edu])
+AC_INIT([jellyfish], [2.1.4], [gmarcais at umd.edu])
 AC_CANONICAL_HOST
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE([subdir-objects foreign parallel-tests color-tests])
 AM_SILENT_RULES([yes])
 AC_CONFIG_SRCDIR([jellyfish])
 AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
 AC_PROG_LIBTOOL
 
 # Change default compilation flags
-#AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
-#CXXFLAGS="-std=c++0x $CXXFLAGS"
+AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
+CXXFLAGS="-std=c++0x $CXXFLAGS"
 AC_LANG(C++)
 AC_PROG_CXX
 
+# Major version of the library
+AC_SUBST([PACKAGE_LIB], [2.0])
+
+# Check for md5 or md5sum
+AC_ARG_VAR([MD5], [Path to md5 hashing program])
+AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5sum], [md5sum]), [])
+AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5], [md5 -r]), [])
+AS_IF([test "x$MD5" = "x"], AC_MSG_ERROR([Could not find md5 hashing program in your path]), [])
+
+# Check for yaggo
+AC_ARG_VAR([YAGGO], [Yaggo switch parser generator])
+AS_IF([test "x$YAGGO" = "x"], [AC_PATH_PROG([YAGGO], [yaggo], [false])])
 
 dnl define([concat], $1$2$3)dnl
-dnl define([PC_FILE], concat([jellyfish-],AC_PACKAGE_VERSION,[.pc]))
-define([PC_FILE], jellyfish-1.1.pc)
+define([PC_FILE], jellyfish-2.0.pc)
 AC_CONFIG_FILES([
     Makefile
     tests/compat.sh
@@ -25,14 +35,10 @@ AC_CONFIG_FILES([
     PC_FILE
 )
 
-AC_ARG_VAR([MD5], [Path to md5 hashing program])
-AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5sum], [md5sum]), [])
-AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5], [md5 -r]), [])
-AS_IF([test "x$MD5" = "x"], AC_MSG_ERROR([Could not find md5 hashing program in your path]), [])
 
 AC_ARG_WITH([sse],
             [AS_HELP_STRING([--with-sse], [enable SSE])],
-            [], [with_sse=no])
+            [], [with_sse=yes])
 AS_IF([test "x$with_sse" != xno],
       [AC_DEFINE([HAVE_SSE], [1], [Define if you have SSE])],
       [])
@@ -44,15 +50,39 @@ AS_IF([test "x$with_half" = "xyes"],
       [AC_DEFINE([HALF_FLOATS], [1], [Define if you use half floats for qmer counting])],
       [])
 
-AC_CHECK_TYPE([__int128],
-              [AC_DEFINE([HAVE_INT128], [1], [Define if type __int128 is supported])])
+# Use valgrind to check memory allocation with mmap
+AC_ARG_ENABLE([valgrind],
+              [AS_HELP_STRING([--enable-valgrind], [Instrument mmap memory allocation with valgrind])])
+AS_IF([test "x$enable_valgrind" = xyes],
+      [AC_DEFINE([HAVE_VALGRIND], [1], [Define is using Valgrind])]
+      [PKG_CHECK_MODULES([VALGRIND], [valgrind >= 1.8.0])])
 
+# Check that type __int128 is supported and if the
+# std::numeric_limits<__int128> specialization exists
+AC_ARG_WITH([int128],
+            [AS_HELP_STRING([--with-int128], [enable int128])],
+            [], [with_int128=yes])
+AS_IF([test "x$with_int128" != xno],
+      [AC_CHECK_TYPE([__int128],
+                     [AC_DEFINE([HAVE_INT128], [1], [Define if type __int128 is supported])])
+       AC_MSG_CHECKING([for std::numeric_limits<__int128>])
+       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <limits>
+                                            template<bool> struct StaticAssert; template<> struct StaticAssert<true> { static void assert() { } };]],
+                                          [[StaticAssert<std::numeric_limits<__int128>::is_specialized>::assert();]])],
+                         [AC_MSG_RESULT([yes])]
+                         [AC_DEFINE([HAVE_NUMERIC_LIMITS128], [1], [Define if numeric limits specialization exists for __int128])],
+                         [AC_MSG_RESULT([no])])])
 
-# Check the version of strerror_r
-AC_FUNC_STRERROR_R      
-
-AC_CHECK_HEADERS([execinfo.h sys/syscall.h])
+# On MacOS X, use _NSGetExecutablePath to find path to own executable
+AC_MSG_CHECKING([for _NSGetExecutablePath])
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mach-o/dyld.h>]],
+                                   [[_NSGetExecutablePath(0, 0);]])],
+                  [AC_MSG_RESULT([yes])]
+                  [AC_DEFINE([HAVE_NSGETEXECUTABLEPATH], [1], [Used to find executable path on MacOS X])],
+                  [AC_MSG_RESULT([no])])
 
+# Check the version of strerror_r
+AC_CHECK_HEADERS_ONCE([execinfo.h ext/stdio_filebuf.h])
 AC_CHECK_MEMBER([siginfo_t.si_int],
                 [AC_DEFINE([HAVE_SI_INT], [1], [Define if siginfo_t.si_int exists])],
                 [], [[#include <signal.h>]])
diff --git a/depcomp b/depcomp
deleted file mode 100755
index 25a39e6..0000000
--- a/depcomp
+++ /dev/null
@@ -1,708 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2012-03-27.16; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by 'PROGRAMS ARGS'.
-  object      Object file output by 'PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputting dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake at gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-# A tabulation character.
-tab='	'
-# A newline character.
-nl='
-'
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u='sed s,\\\\,/,g'
-   depmode=msvisualcpp
-fi
-
-if test "$depmode" = msvc7msys; then
-   # This is just like msvc7 but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u='sed s,\\\\,/,g'
-   depmode=msvc7
-fi
-
-if test "$depmode" = xlc; then
-   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
-   gccflag=-qmakedep=gcc,-MF
-   depmode=gcc
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the "deleted header file" problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' "$nl" < "$tmpdepfile" |
-## Some versions of gcc put a space before the ':'.  On the theory
-## that the space means something, we add a space to the output as
-## well.  hp depmode also adds that space, but also prefixes the VPATH
-## to the object.  Take care to not repeat it in the output.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
-      | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like '#:fec' to the end of the
-    # dependency line.
-    tr ' ' "$nl" < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr "$nl" ' ' >> "$depfile"
-    echo >> "$depfile"
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' "$nl" < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-xlc)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts '$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form 'foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # '$object: dependent.h' and one to simply 'dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
-  # However on
-  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using '\':
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-  # tcc 0.9.26 (FIXME still under development at the moment of writing)
-  # will emit a similar output, but also prepend the continuation lines
-  # with horizontal tabulation characters.
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form 'foo.o: dependent.h',
-  # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # '$object: dependent.h' and one to simply 'dependent.h:'.
-  sed -e "s/^[ $tab][ $tab]*/  /" -e "s,^[^:]*:,$object :," \
-    < "$tmpdepfile" > "$depfile"
-  sed '
-    s/[ '"$tab"'][ '"$tab"']*/ /g
-    s/^ *//
-    s/ *\\*$//
-    s/^[^:]*: *//
-    /^$/d
-    /:$/d
-    s/$/ :/
-  ' < "$tmpdepfile" >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add 'dependent.h:' lines.
-    sed -ne '2,${
-	       s/^ *//
-	       s/ \\*$//
-	       s/$/:/
-	       p
-	     }' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in 'foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-msvc7)
-  if test "$libtool" = yes; then
-    showIncludes=-Wc,-showIncludes
-  else
-    showIncludes=-showIncludes
-  fi
-  "$@" $showIncludes > "$tmpdepfile"
-  stat=$?
-  grep -v '^Note: including file: ' "$tmpdepfile"
-  if test "$stat" = 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  # The first sed program below extracts the file names and escapes
-  # backslashes for cygpath.  The second sed program outputs the file
-  # name when reading, but also accumulates all include files in the
-  # hold buffer in order to output them again at the end.  This only
-  # works with sed implementations that can handle large buffers.
-  sed < "$tmpdepfile" -n '
-/^Note: including file:  *\(.*\)/ {
-  s//\1/
-  s/\\/\\\\/g
-  p
-}' | $cygpath_u | sort -u | sed -n '
-s/ /\\ /g
-s/\(.*\)/'"$tab"'\1 \\/p
-s/.\(.*\) \\/\1:/
-H
-$ {
-  s/.*/'"$tab"'/
-  G
-  p
-}' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvc7msys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for ':'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' "$nl" < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  # makedepend may prepend the VPATH from the source file name to the object.
-  # No need to regex-escape $object, excess matching of '.' is harmless.
-  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
-  echo "$tab" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/development.mk b/development.mk
new file mode 100644
index 0000000..7043903
--- /dev/null
+++ b/development.mk
@@ -0,0 +1,22 @@
+AM_CXXFLAGS += -Werror
+
+# Count lines of code
+.PHONY: cloc cloc_jellyfish
+cloc:
+	cloc --force-lang="Ruby,yaggo" --force-lang="make,am" --force-lang="make,mk" \
+	  --exclude-dir="gtest" --ignored=cloc_ignored_src_files \
+	  $(top_srcdir)/jellyfish $(top_srcdir)/include $(top_srcdir)/lib $(top_srcdir)/sub_commands $(top_srcdir)/tests $(top_srcdir)/unit_tests \
+	  $(top_srcdir)/Makefile.am $(top_srcdir)/*.mk
+
+cloc_jellyfish:
+	cloc $(top_srcdir)/jellyfish $(top_srcdir)/include $(top_srcdir)/lib $(top_srcdir)/sub_commands
+
+cloc_library:
+	cloc $(top_srcdir)/include $(top_srcdir)/lib
+
+# Make a dependency on yaggo the software
+$(YAGGO_SOURCES): $(YAGGO)
+
+# Launch unit tests
+unittests:
+	@$(MAKE) check TESTS=unit_tests/unit_tests.sh
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..332f618
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,37 @@
+L2M = latex2man -t transfile
+MI = makeinfo
+PDFLATEX = pdflatex
+M4 = m4
+
+TARGETS = jellyfish.man jellyfish.html jellyfish.pdf
+all: $(TARGETS)
+
+man: jellyfish.man
+	man ./$<
+
+options.tex: generate_options_tex.sh
+	sh $< > $@
+
+%-full.tex: %.tex options.tex
+	$(M4) $< > $@
+
+%.man: %-full.tex
+	$(L2M) $< $@
+
+%.html: %-full.tex
+	$(L2M) -H $< $@
+
+%.texi: %-full.tex
+	$(L2M) -T $< $@
+
+%.info: %.texi
+	$(MI) --force $< $@
+
+%.latex: %-full.tex
+	$(L2M) -L $< $@
+
+%.pdf: %.latex
+	$(PDFLATEX) $<
+
+clean:
+	rm -f $(TARGETS) *-full.tex options.tex
diff --git a/doc/UserGuide.lyx b/doc/UserGuide.lyx
new file mode 100644
index 0000000..7a1c426
--- /dev/null
+++ b/doc/UserGuide.lyx
@@ -0,0 +1,1515 @@
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass report
+\begin_preamble
+\usepackage[letterpaper]{geometry}
+\usepackage{siunitx}
+\end_preamble
+\use_default_options true
+\begin_modules
+theorems-ams
+eqs-within-sections
+figs-within-sections
+\end_modules
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_amsmath 1
+\use_esint 1
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 1
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\secnumdepth 2
+\tocdepth 2
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Title
+Jellyfish 2 User Guide
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset toc
+LatexCommand tableofcontents
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset FormulaMacro
+\newcommand{\switch}[1]{\texttt{-\@-#1}}
+\end_inset
+
+
+\begin_inset FormulaMacro
+\newcommand{\opt}[1]{\texttt{-#1}}
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Getting started
+\end_layout
+
+\begin_layout Section
+Counting all 
+\begin_inset Formula $k$
+\end_inset
+
+-mers
+\end_layout
+
+\begin_layout Standard
+The basic command to count all 
+\begin_inset Formula $k$
+\end_inset
+
+-mers is as follows:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 21 -s 100M -t 10 -C reads.fasta
+\end_layout
+
+\begin_layout Standard
+This will count canonical (
+\begin_inset Formula $\opt C$
+\end_inset
+
+) 
+\begin_inset Formula $21$
+\end_inset
+
+-mers (
+\family sans
+
+\begin_inset Formula $\opt m\,21$
+\end_inset
+
+
+\family default
+), using a hash with 100 million elements (
+\family sans
+
+\begin_inset Formula $\opt s\,\unit[100]{M}$
+\end_inset
+
+
+\family default
+) and 10 threads (
+\family sans
+
+\begin_inset Formula $\opt t\,10$
+\end_inset
+
+
+\family default
+) in the sequences in the file 
+\family sans
+reads.fasta
+\family default
+.
+ The output is written in the file '
+\family sans
+mer_counts.jf
+\family default
+' by default (change with 
+\family sans
+
+\begin_inset Formula $\opt o$
+\end_inset
+
+
+\family default
+ switch).
+ 
+\end_layout
+
+\begin_layout Standard
+To compute the histogram of the 
+\begin_inset Formula $k$
+\end_inset
+
+-mer occurrences, use the 
+\family sans
+histo
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:histo"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish histo mer_counts.jf
+\end_layout
+
+\begin_layout Standard
+To query the counts of a particular 
+\begin_inset Formula $k$
+\end_inset
+
+-mer, use the 
+\family sans
+query
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:query"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish query mer_counts.jf AACGTTG
+\end_layout
+
+\begin_layout Standard
+To output all the counts for all the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the file, use the 
+\family sans
+dump
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:dump"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish dump mer_counts.jf > mer_counts_dumps.fa
+\end_layout
+
+\begin_layout Standard
+To get some information on how, when and where this jellyfish file was generated
+, use the 
+\family sans
+info
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:info"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish info mer_counts.jf
+\end_layout
+
+\begin_layout Standard
+For more detail information, see the relevant sections in this document.
+ All commands understand 
+\begin_inset Formula $\switch{help}$
+\end_inset
+
+ and will produce some information about the switches available.
+\end_layout
+
+\begin_layout Subsection
+Counting 
+\begin_inset Formula $k$
+\end_inset
+
+-mers in sequencing reads
+\end_layout
+
+\begin_layout Standard
+In sequencing reads, it is unknown which strands of the DNA is sequenced.
+ As a consequence, a 
+\begin_inset Formula $k$
+\end_inset
+
+-mer or its reverse complement are essentially equivalent.
+ The canonical representative of a 
+\begin_inset Formula $k$
+\end_inset
+
+-mer 
+\begin_inset Formula $m$
+\end_inset
+
+ is by definition 
+\begin_inset Formula $m$
+\end_inset
+
+ or the reverse complement of 
+\begin_inset Formula $m$
+\end_inset
+
+, whichever comes first lexicographically.
+ The 
+\family sans
+
+\begin_inset Formula $\opt C$
+\end_inset
+
+
+\family default
+ switch instructs to save in the hash only canonical 
+\begin_inset Formula $k$
+\end_inset
+
+-mers, while the count is the number of occurrences of both a 
+\begin_inset Formula $k$
+\end_inset
+
+-mer and it reverse complement.
+\end_layout
+
+\begin_layout Standard
+The size parameter (given with 
+\begin_inset Formula $\opt s$
+\end_inset
+
+) is an indication of the number 
+\begin_inset Formula $k$
+\end_inset
+
+-mers that will be stored in the hash.
+ For sequencing reads, one this size should be the size of the genome plus
+ the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers generated by sequencing errors.
+ For example, if the error rate is 
+\begin_inset Formula $e$
+\end_inset
+
+ (e.g.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ Illumina reads, usually 
+\begin_inset Formula $e\approx1\%$
+\end_inset
+
+), with an estimated genome size of 
+\begin_inset Formula $G$
+\end_inset
+
+ and a coverage of 
+\begin_inset Formula $c$
+\end_inset
+
+, the number of expected 
+\begin_inset Formula $k$
+\end_inset
+
+-mers is 
+\begin_inset Formula $G+Gcek$
+\end_inset
+
+.
+ This assume
+\end_layout
+
+\begin_layout Quote
+NOTE: unlike in Jellyfish 1, this 
+\family sans
+-s
+\family default
+ parameter is only an estimation.
+ If the size given is too small to fit all the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers, the hash size will be increased automatically or partial results
+ will be written to disk and finally merged automatically.
+ Running '
+\family sans
+jellyfish merge
+\family default
+' should never be necessary, as now jellyfish now takes care of this task
+ on its own.
+\end_layout
+
+\begin_layout Standard
+If the low frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers (
+\begin_inset Formula $k$
+\end_inset
+
+-mers occurring only once), which are mostly due to sequencing errors, are
+ not of interest, one might consider counting only high-frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+), which uses less memory and is potentially faster.
+\end_layout
+
+\begin_layout Subsection
+Counting 
+\begin_inset Formula $k$
+\end_inset
+
+-mers in a genome
+\end_layout
+
+\begin_layout Standard
+In an actual genome or finished sequence, a 
+\begin_inset Formula $k$
+\end_inset
+
+-mer and its reverse complement are not equivalent, hence using the 
+\family sans
+
+\begin_inset Formula $\opt C$
+\end_inset
+
+
+\family default
+ switch does not make sense.
+ In addition, the size for the hash can be set directly to the size of the
+ genome.
+\end_layout
+
+\begin_layout Section
+Counting high-frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Jellyfish offers two way to count only high-frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers (meaning only 
+\begin_inset Formula $k$
+\end_inset
+
+-mers with count 
+\begin_inset Formula $>1$
+\end_inset
+
+), which reduces significantly the memory usage.
+ Both methods are based on using Bloom filters.
+ The first method is a one pass method, which provides approximate count
+ for some percentage of the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers.
+ The second method is a two pass method which provides exact count.
+ In both methods, most of the low-frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers are not reported.
+\end_layout
+
+\begin_layout Subsection
+One pass method
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:One-pass-method"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Adding the 
+\family sans
+
+\begin_inset Formula $\switch{bf-size}$
+\end_inset
+
+
+\family default
+ switch make jellyfish first insert all 
+\begin_inset Formula $k$
+\end_inset
+
+-mers first into a Bloom filter and only insert into the hash the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers which have already been seen at least once.
+ The argument to 
+\begin_inset Formula $\switch{bf-size}$
+\end_inset
+
+ should the total number of 
+\begin_inset Formula $k$
+\end_inset
+
+-mer expected in the data set while the 
+\family sans
+
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ argument should be the number of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers occurring more than once.
+ For example:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 25 -s 3G --bf-size 100G -t 16 homo_sapiens.fa
+\end_layout
+
+\begin_layout Standard
+would be appropriate for counting 
+\begin_inset Formula $25$
+\end_inset
+
+-mers in human reads at 
+\begin_inset Formula $30\times$
+\end_inset
+
+ coverage.
+ The approximate memory usage is 
+\begin_inset Formula $\SI{9}{bits}$
+\end_inset
+
+ per 
+\begin_inset Formula $k$
+\end_inset
+
+-mer in the Bloom filter.
+\end_layout
+
+\begin_layout Standard
+The count reported for each 
+\begin_inset Formula $k$
+\end_inset
+
+-mer (by '
+\family sans
+jellyfish dump
+\family default
+' or '
+\family sans
+jellyfish query
+\family default
+') is one less than the actual count.
+ Meaning, the count 
+\begin_inset Formula $1$
+\end_inset
+
+ 
+\begin_inset Formula $k$
+\end_inset
+
+-mer are not reported, count 
+\begin_inset Formula $2$
+\end_inset
+
+ 
+\begin_inset Formula $k$
+\end_inset
+
+-mer are reported to have count 
+\begin_inset Formula $1$
+\end_inset
+
+, etc.
+\end_layout
+
+\begin_layout Standard
+The drawback of this method is some percentage of the 
+\begin_inset Formula $k$
+\end_inset
+
+-mer that should not be reported (because they occur only once) are reported.
+ This is due to the random nature of the Bloom filter data structure.
+ The percentage is 
+\begin_inset Formula $<1\%$
+\end_inset
+
+ by default and can be changed with the
+\begin_inset Formula $\switch{bf-fp}$
+\end_inset
+
+ switch.
+\end_layout
+
+\begin_layout Subsection
+Two pass method
+\end_layout
+
+\begin_layout Standard
+In the two pass method, first a Bloom counter is created from the reads
+ with '
+\family sans
+jellyfish bc
+\family default
+'.
+ Then this Bloom counter is given to the '
+\family sans
+jelllyfish count
+\family default
+' command and only the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers which have been seen twice in the first pass will be inserted in the
+ hash.
+ For example, with a human data set similar that in section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:One-pass-method"
+
+\end_inset
+
+:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish bc -m 25 -s 100G -t 16 -o homo_sapiens.bc homo_sapiens.fa
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 25 -s 3G -t 16 --bc homo_sapiens.bc homo_sapiens.fa
+\end_layout
+
+\begin_layout Standard
+The advantage of this method is that the counts reported for the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers are all correct.
+ Most count 
+\begin_inset Formula $1$
+\end_inset
+
+ 
+\begin_inset Formula $k$
+\end_inset
+
+-mer are not reported, except for a small percentage (set by the 
+\family sans
+
+\begin_inset Formula $\opt f$
+\end_inset
+
+
+\family default
+ switch of the 
+\family sans
+bc
+\family default
+ subcommand) of them which are reported (correctly with count 
+\begin_inset Formula $1$
+\end_inset
+
+).
+ All other 
+\begin_inset Formula $k$
+\end_inset
+
+-mers are reported with the correct count.
+\end_layout
+
+\begin_layout Standard
+The drawback of this method is that it requires to parse the entire reads
+ data set twice and the memory usage of the Bloom counter is greater than
+ that of the Bloom filter (slightly less than twice as much).
+\end_layout
+
+\begin_layout Chapter
+FAQ
+\end_layout
+
+\begin_layout Section
+How to read compressed files (or other format)?
+\end_layout
+
+\begin_layout Standard
+Jellyfish only reads FASTA or FASTQ formatted input files.
+ By reading from pipes, jellyfish can read compressed files, like this:
+\end_layout
+
+\begin_layout LyX-Code
+zcat *.fastq.gz | jellyfish count /dev/fd/0 ...
+\end_layout
+
+\begin_layout Standard
+or by using the 
+\family sans
+'<()
+\family default
+' 
+\family sans
+redirection
+\family default
+ provided by the shell (e.g.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ bash, zsh):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count <(zcat file1.fastq.gz) <(zcat file2.fasta.gz) ...
+\end_layout
+
+\begin_layout Section
+How to read multiple files at once?
+\end_layout
+
+\begin_layout Standard
+Often, jellyfish can parse an input sequence file faster than 
+\family sans
+gzip
+\family default
+ or 
+\family sans
+fastq-dump
+\family default
+ (to parse SRA files) can output the sequence.
+ This leads to many threads in jellyfish going partially unused.
+ Jellyfish can be instructed to open multiple file at once.
+ For example, to read two short read archive files simultaneously:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -F 2 <(fastq-dump -Z file1.sra) <(fastq-dump -Z file2.sra)
+ ...
+\end_layout
+
+\begin_layout Standard
+Another way is to use 
+\begin_inset Quotes eld
+\end_inset
+
+generators
+\begin_inset Quotes erd
+\end_inset
+
+.
+ First, create a file containing, one per line, commands to generate sequence.
+ Then pass this file to jellyfish and the number of generators to run simultaneo
+usly.
+ Jellyfish will spawn subprocesses running the commands passed and read
+ their standard output for sequence.
+ By default, the commands are run using the shell in the SHELL environment
+ variable, and this can be changed by the 
+\family sans
+
+\begin_inset Formula $\opt S$
+\end_inset
+
+
+\family default
+ switch.
+ Multiple generators will be run simultaneously as specified by the 
+\family sans
+
+\begin_inset Formula $\opt G$
+\end_inset
+
+
+\family default
+ switch.
+ For example:
+\end_layout
+
+\begin_layout LyX-Code
+ls *.fasta.gz | xargs -n 1 echo gunzip -c > generators
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -g generators -G 4 ...
+\end_layout
+
+\begin_layout Standard
+The first command created the command list into the '
+\family sans
+generators
+\family default
+' file, each command unzipping one FASTA file in the current directory.
+ The second command runs jellyfish with 
+\begin_inset Formula $4$
+\end_inset
+
+ concurrent generators.
+\end_layout
+
+\begin_layout Section
+How to reduce the output size?
+\end_layout
+
+\begin_layout Standard
+The output file was design to be easy to read, but the file generated can
+ be rather large.
+ By default, a 
+\begin_inset Formula $\SI{4}{bytes}$
+\end_inset
+
+ counter value is saved for every 
+\begin_inset Formula $k$
+\end_inset
+
+-mer (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ a maximum count of over 4 billion).
+ Instead, a counter size of 
+\begin_inset Formula $\SI{2}{bytes}$
+\end_inset
+
+ or 
+\begin_inset Formula $\SI{1}{byte}$
+\end_inset
+
+ can be used with the switch 
+\begin_inset Formula $\switch{out-counter-len}$
+\end_inset
+
+, which reduces significantly the output size.
+\end_layout
+
+\begin_layout Standard
+The count of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers which cannot be represented with the given number of bytes will have
+ a value equal to the maximum value that can be represented.
+ Meaning, if the counter field uses 
+\begin_inset Formula $\SI{1}{byte}$
+\end_inset
+
+, any 
+\begin_inset Formula $k$
+\end_inset
+
+-mers with count greater or equal to 
+\begin_inset Formula $255$
+\end_inset
+
+ will be reported of having a count 
+\begin_inset Formula $255$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Also, low frequency and high frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers can be skipped using the 
+\family sans
+
+\begin_inset Formula $\opt L$
+\end_inset
+
+
+\family default
+ and 
+\family sans
+
+\begin_inset Formula $\opt U$
+\end_inset
+
+
+\family default
+ switches respectively.
+ Although it might be more appropriate to filter out the low frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers using Bloom filters, as shown in section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Section
+How much memory is needed?
+\end_layout
+
+\begin_layout Standard
+The memory needed to count 
+\begin_inset Formula $k$
+\end_inset
+
+-mers, given the various parameters of the 
+\family sans
+count 
+\family default
+subcommand is obtained by using the 
+\family sans
+mem
+\family default
+ subcommand.
+ It understand all the same switches, but only the 
+\begin_inset Formula $\switch{mer-len}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt m$
+\end_inset
+
+), 
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt s$
+\end_inset
+
+), 
+\begin_inset Formula $\switch{counter-len}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt c$
+\end_inset
+
+) and 
+\begin_inset Formula $\switch{reprobes}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt p$
+\end_inset
+
+) switches are taken into account.
+\end_layout
+
+\begin_layout Standard
+For example, for 
+\begin_inset Formula $24$
+\end_inset
+
+-mers, with an initial hash size of 1 billion, and default parameters otherwise,
+ the memory usage is:
+\end_layout
+
+\begin_layout LyX-Code
+$ jellyfish mem -m 24 -s 1G
+\end_layout
+
+\begin_layout LyX-Code
+4521043056 (4G)
+\end_layout
+
+\begin_layout Standard
+Conversely, if the 
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ switch is not given by the 
+\begin_inset Formula $\switch{mem}$
+\end_inset
+
+ switch is, then the maximum initial hash size that would fit in the given
+ memory is returned.
+ For example, this is the maximum hash size for 
+\begin_inset Formula $31$
+\end_inset
+
+-mers in 
+\begin_inset Formula $\unit[8]{Gb}$
+\end_inset
+
+ of RAM:
+\end_layout
+
+\begin_layout LyX-Code
+$ jellyfish mem -m 31 --mem 8g
+\end_layout
+
+\begin_layout LyX-Code
+1073741824 (1G)
+\end_layout
+
+\begin_layout Chapter
+Subcommands
+\end_layout
+
+\begin_layout Section
+
+\family sans
+histo
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:histo"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+histo
+\family default
+ subcommand outputs the histogram of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers frequencies.
+ The last bin, with value one above the high setting set by the 
+\family sans
+
+\begin_inset Formula $\opt h$
+\end_inset
+
+
+\family default
+ switch (
+\begin_inset Formula $10\,000$
+\end_inset
+
+ by default), is a catch all: all 
+\begin_inset Formula $k$
+\end_inset
+
+-mers with a count greater than the high setting are tallied in that one
+ bin.
+ If the low setting is set (
+\family sans
+
+\begin_inset Formula $\opt l$
+\end_inset
+
+
+\family default
+ switch), then the first bin, with value one below the low setting, is also
+ similarly a catch all.
+\end_layout
+
+\begin_layout Standard
+By default, the bins with a zero count are skipped.
+ This can be changed with the 
+\family sans
+
+\begin_inset Formula $\opt f$
+\end_inset
+
+
+\family default
+ switch.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+dump
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:dump"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+dump
+\family default
+ subcommand outputs a list of all the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the file associated with their count.
+ By default, the output is in FASTA format, where the header line contains
+ the count of the 
+\begin_inset Formula $k$
+\end_inset
+
+-mer and the sequence part is the sequence of the 
+\begin_inset Formula $k$
+\end_inset
+
+-mer.
+ This format has the advantage that the output contains the sequence of
+ 
+\begin_inset Formula $k$
+\end_inset
+
+-mers and can be directly fed into another program expecting the very common
+ FASTA format.
+ A more convenient column format (for human beings) is selected with the
+ 
+\family sans
+-c
+\family default
+ switch.
+\end_layout
+
+\begin_layout Standard
+Low frequency and high frequency 
+\begin_inset Formula $k$
+\end_inset
+
+-mers can be skipped with the 
+\family sans
+
+\begin_inset Formula $\opt L$
+\end_inset
+
+
+\family default
+ and 
+\family sans
+
+\begin_inset Formula $\opt U$
+\end_inset
+
+
+\family default
+ switches respectively.
+\end_layout
+
+\begin_layout Standard
+In the output of the 
+\family sans
+dump
+\family default
+ subcommand, the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers are sorted according to the hash function used by Jellyfish.
+ The output can be considered to be 
+\begin_inset Quotes eld
+\end_inset
+
+fairly pseudo-random
+\begin_inset Quotes erd
+\end_inset
+
+.
+ By 
+\begin_inset Quotes eld
+\end_inset
+
+fairly
+\begin_inset Quotes erd
+\end_inset
+
+ we mean that NO guarantee is made about the actual randomness of this order,
+ it is just good enough for the hash table to work properly.
+ And by 
+\begin_inset Quotes eld
+\end_inset
+
+pseudo-random
+\begin_inset Quotes erd
+\end_inset
+
+ we mean that the order is actually deterministic: given the same hash function,
+ the output will be always the same and two different files generated with
+ the same hash function can be merged easily.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+query
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:query"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+query
+\family default
+ subcommand outputs the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers and their counts for some subset of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers.
+ It will outputs the counts of all the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers passed on the command line or of all the 
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the sequence read from the FASTA or FASTQ formatted file passed
+ to the switch 
+\family sans
+
+\begin_inset Formula $\opt s$
+\end_inset
+
+
+\family default
+ (this switch can be given multiple times).
+\end_layout
+
+\begin_layout Section
+
+\family sans
+info
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:info"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+info
+\family default
+ subcommand outputs some information about the jellyfish file and the command
+ used to generated it, in which directory and at what time the command was
+ run.
+ Hopefully, the information given should be enough to rerun jellyfish under
+ the same conditions and reproduce the output file.
+ In particular, the 
+\family sans
+
+\begin_inset Formula $\opt c$
+\end_inset
+
+
+\family default
+ switch outputs the command, properly escaped and ready to run in a shell.
+\end_layout
+
+\begin_layout Standard
+The header is saved in JSON format and contains more information than is
+ written by the default.
+ The full header in JSON format can be written out using the 
+\family sans
+-j
+\family default
+ switch.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+merge
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:merge"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+merge
+\family default
+ subcommand is a little direct use with version version 2 of jellyfish.
+ When intermediary files were written to disk, because not all 
+\begin_inset Formula $k$
+\end_inset
+
+-mers would fit in memory, they can be merged into one file containing the
+ final result with the 
+\family sans
+merge
+\family default
+ subcommand.
+ The 
+\family sans
+count
+\family default
+ will merge intermediary files automatically as needed.
+\end_layout
+
+\begin_layout Section
+stats 
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:stats"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+stats
+\family default
+ subcommand computes some statistics about the mers.
+ Although these statistics could be computed from the histogram, it provides
+ quick summary information.
+ The fields are:
+\end_layout
+
+\begin_layout Description
+Unique The number of 
+\begin_inset Formula $k$
+\end_inset
+
+-mer occuring exactly once
+\end_layout
+
+\begin_layout Description
+Distinct The number of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers, ignoring their multiplicity (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ the cardinality of the set of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers)
+\end_layout
+
+\begin_layout Description
+Total The number of 
+\begin_inset Formula $k$
+\end_inset
+
+-mers with multiplicity (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ the sum of the number of occurence of all the mers)
+\end_layout
+
+\begin_layout Description
+Max_count The maximum of the number of occurences
+\end_layout
+
+\begin_layout Section
+mem 
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:mem"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+mem
+\family default
+ subcommand shows how much memory a count subcommand will need or conversely
+ how large of a hash size will fit in a given amount of memory.
+\end_layout
+
+\begin_layout Section
+cite
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:cite"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The 
+\family sans
+cite
+\family default
+ subcommand prints the citation for the jellyfish paper.
+ With the 
+\begin_inset Formula $\opt b$
+\end_inset
+
+, it is formatted in Bibtex format.
+ How convenient!
+\end_layout
+
+\end_body
+\end_document
diff --git a/doc/generate_options_tex.sh b/doc/generate_options_tex.sh
new file mode 100755
index 0000000..1497830
--- /dev/null
+++ b/doc/generate_options_tex.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+for i in count stats histo dump merge query qhisto qdump qmerge cite; do
+    echo "\\subsection{$i}"
+    jellyfish $i --help | ruby option_to_tex /dev/fd/0
+    echo
+done
diff --git a/doc/help_parse.rb b/doc/help_parse.rb
new file mode 100644
index 0000000..bee2c47
--- /dev/null
+++ b/doc/help_parse.rb
@@ -0,0 +1,451 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module HelpGrammar
+  include Treetop::Runtime
+
+  def root
+    @root ||= :line
+  end
+
+  module Line0
+    def spaces
+      elements[0]
+    end
+
+    def sws
+      elements[1]
+    end
+
+    def text
+      elements[2]
+    end
+
+  end
+
+  module Line1
+    def to_tex(opened)
+      res = ""
+      unless sws.empty?
+        if !opened.is_open
+          res << "\\begin{description}\n"
+          opened.is_open = true
+        end
+        res << "\\item["
+        res << sws.elements.map { |s| s.to_tex }.join(",")
+        res << "] "
+      end
+      res << "\\noindent " unless text.text_value.empty?
+      res << quote(text.text_value)
+    end
+  end
+
+  def _nt_line
+    start_index = index
+    if node_cache[:line].has_key?(index)
+      cached = node_cache[:line][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    i0, s0 = index, []
+    r1 = _nt_spaces
+    s0 << r1
+    if r1
+      s2, i2 = [], index
+      loop do
+        r3 = _nt_switches
+        if r3
+          s2 << r3
+        else
+          break
+        end
+      end
+      r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+      s0 << r2
+      if r2
+        r4 = _nt_text
+        s0 << r4
+        if r4
+          s5, i5 = [], index
+          loop do
+            if has_terminal?('\G[\\n]', true, index)
+              r6 = true
+              @index += 1
+            else
+              r6 = nil
+            end
+            if r6
+              s5 << r6
+            else
+              break
+            end
+          end
+          r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+          s0 << r5
+        end
+      end
+    end
+    if s0.last
+      r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+      r0.extend(Line0)
+      r0.extend(Line1)
+    else
+      @index = i0
+      r0 = nil
+    end
+
+    node_cache[:line][start_index] = r0
+
+    r0
+  end
+
+  def _nt_spaces
+    start_index = index
+    if node_cache[:spaces].has_key?(index)
+      cached = node_cache[:spaces][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    s0, i0 = [], index
+    loop do
+      if has_terminal?('\G[\\s]', true, index)
+        r1 = true
+        @index += 1
+      else
+        r1 = nil
+      end
+      if r1
+        s0 << r1
+      else
+        break
+      end
+    end
+    r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+    node_cache[:spaces][start_index] = r0
+
+    r0
+  end
+
+  module Switches0
+    def sw
+      elements[1]
+    end
+  end
+
+  module Switches1
+    def to_tex
+      sw.to_tex
+    end
+  end
+
+  def _nt_switches
+    start_index = index
+    if node_cache[:switches].has_key?(index)
+      cached = node_cache[:switches][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    i0, s0 = index, []
+    if has_terminal?("-", false, index)
+      r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+      @index += 1
+    else
+      terminal_parse_failure("-")
+      r1 = nil
+    end
+    s0 << r1
+    if r1
+      i2 = index
+      r3 = _nt_short_switch
+      if r3
+        r2 = r3
+      else
+        r4 = _nt_long_switch
+        if r4
+          r2 = r4
+        else
+          @index = i2
+          r2 = nil
+        end
+      end
+      s0 << r2
+    end
+    if s0.last
+      r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+      r0.extend(Switches0)
+      r0.extend(Switches1)
+    else
+      @index = i0
+      r0 = nil
+    end
+
+    node_cache[:switches][start_index] = r0
+
+    r0
+  end
+
+  module ShortSwitch0
+    def name
+      elements[0]
+    end
+
+    def spaces
+      elements[2]
+    end
+  end
+
+  module ShortSwitch1
+    def to_tex
+      "\\Opt{-#{name.text_value}}"
+    end
+  end
+
+  def _nt_short_switch
+    start_index = index
+    if node_cache[:short_switch].has_key?(index)
+      cached = node_cache[:short_switch][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    i0, s0 = index, []
+    if has_terminal?('\G[a-zA-Z]', true, index)
+      r1 = true
+      @index += 1
+    else
+      r1 = nil
+    end
+    s0 << r1
+    if r1
+      if has_terminal?(",", false, index)
+        r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
+        @index += 1
+      else
+        terminal_parse_failure(",")
+        r3 = nil
+      end
+      if r3
+        r2 = r3
+      else
+        r2 = instantiate_node(SyntaxNode,input, index...index)
+      end
+      s0 << r2
+      if r2
+        r4 = _nt_spaces
+        s0 << r4
+      end
+    end
+    if s0.last
+      r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+      r0.extend(ShortSwitch0)
+      r0.extend(ShortSwitch1)
+    else
+      @index = i0
+      r0 = nil
+    end
+
+    node_cache[:short_switch][start_index] = r0
+
+    r0
+  end
+
+  module LongSwitch0
+  end
+
+  module LongSwitch1
+    def name
+      elements[1]
+    end
+
+    def val
+      elements[2]
+    end
+
+    def spaces
+      elements[4]
+    end
+  end
+
+  module LongSwitch2
+    def to_tex
+      val.empty? ? "\\LOpt{#{quote(name.text_value)}}" : "\\LOptArg{#{quote(name.text_value)}}{#{quote(val.text_value)}}"
+    end
+  end
+
+  def _nt_long_switch
+    start_index = index
+    if node_cache[:long_switch].has_key?(index)
+      cached = node_cache[:long_switch][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    i0, s0 = index, []
+    if has_terminal?("-", false, index)
+      r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+      @index += 1
+    else
+      terminal_parse_failure("-")
+      r1 = nil
+    end
+    s0 << r1
+    if r1
+      s2, i2 = [], index
+      loop do
+        if has_terminal?('\G[^,\\s=]', true, index)
+          r3 = true
+          @index += 1
+        else
+          r3 = nil
+        end
+        if r3
+          s2 << r3
+        else
+          break
+        end
+      end
+      if s2.empty?
+        @index = i2
+        r2 = nil
+      else
+        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+      end
+      s0 << r2
+      if r2
+        i5, s5 = index, []
+        if has_terminal?("=", false, index)
+          r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
+          @index += 1
+        else
+          terminal_parse_failure("=")
+          r6 = nil
+        end
+        s5 << r6
+        if r6
+          s7, i7 = [], index
+          loop do
+            if has_terminal?('\G[^,\\s]', true, index)
+              r8 = true
+              @index += 1
+            else
+              r8 = nil
+            end
+            if r8
+              s7 << r8
+            else
+              break
+            end
+          end
+          if s7.empty?
+            @index = i7
+            r7 = nil
+          else
+            r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
+          end
+          s5 << r7
+        end
+        if s5.last
+          r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+          r5.extend(LongSwitch0)
+        else
+          @index = i5
+          r5 = nil
+        end
+        if r5
+          r4 = r5
+        else
+          r4 = instantiate_node(SyntaxNode,input, index...index)
+        end
+        s0 << r4
+        if r4
+          if has_terminal?(",", false, index)
+            r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
+            @index += 1
+          else
+            terminal_parse_failure(",")
+            r10 = nil
+          end
+          if r10
+            r9 = r10
+          else
+            r9 = instantiate_node(SyntaxNode,input, index...index)
+          end
+          s0 << r9
+          if r9
+            r11 = _nt_spaces
+            s0 << r11
+          end
+        end
+      end
+    end
+    if s0.last
+      r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+      r0.extend(LongSwitch1)
+      r0.extend(LongSwitch2)
+    else
+      @index = i0
+      r0 = nil
+    end
+
+    node_cache[:long_switch][start_index] = r0
+
+    r0
+  end
+
+  def _nt_text
+    start_index = index
+    if node_cache[:text].has_key?(index)
+      cached = node_cache[:text][index]
+      if cached
+        cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+        @index = cached.interval.end
+      end
+      return cached
+    end
+
+    s0, i0 = [], index
+    loop do
+      if has_terminal?('\G[^\\n]', true, index)
+        r1 = true
+        @index += 1
+      else
+        r1 = nil
+      end
+      if r1
+        s0 << r1
+      else
+        break
+      end
+    end
+    r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+    node_cache[:text][start_index] = r0
+
+    r0
+  end
+
+end
+
+class HelpGrammarParser < Treetop::Runtime::CompiledParser
+  include HelpGrammar
+end
+
diff --git a/doc/help_parse.treetop b/doc/help_parse.treetop
new file mode 100644
index 0000000..2b35c09
--- /dev/null
+++ b/doc/help_parse.treetop
@@ -0,0 +1,52 @@
+grammar HelpGrammar
+  rule line
+    spaces sws:switches* text [\n]* {
+      def to_tex(opened)
+        res = ""
+        unless sws.empty?
+          if !opened.is_open
+            res << "\\begin{description}\n"
+            opened.is_open = true
+          end
+          res << "\\item["
+          res << sws.elements.map { |s| s.to_tex }.join(",")
+          res << "] "
+        end
+        res << "\\noindent " unless text.text_value.empty?
+        res << quote(text.text_value)
+      end
+    }
+  end
+
+  rule spaces
+    [\s]*
+  end
+
+  rule switches
+    "-" sw:( short_switch / long_switch ) {
+      def to_tex
+        sw.to_tex
+      end
+    }
+  end
+
+  rule short_switch
+    name:[a-zA-Z] ","? spaces {
+      def to_tex
+        "\\Opt{-#{name.text_value}}"
+      end
+    }
+  end
+
+  rule long_switch
+    "-" name:[^,\s=]+ val:("=" [^,\s]+)? ","? spaces {
+      def to_tex
+        val.empty? ? "\\LOpt{#{quote(name.text_value)}}" : "\\LOptArg{#{quote(name.text_value)}}{#{quote(val.text_value)}}"
+      end
+    }
+  end
+
+  rule text
+    [^\n]*
+  end
+end
diff --git a/doc/jellyfish.html b/doc/jellyfish.html
new file mode 100644
index 0000000..fa9d5d0
--- /dev/null
+++ b/doc/jellyfish.html
@@ -0,0 +1,802 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- Manual page created with latex2man on Wed Feb 29 10:58:49 EST 2012 --
+-- Author of latex2man: Juergen.Vollmer at informatik-vollmer.de --
+-- NOTE: This file is generated, DO NOT EDIT. -->
+<html>
+<head><title>JELLYFISH</title></head>
+<body bgcolor="white">
+<h1 align=center>
+Jellyfish: A fast k-mer counter 
+</h1>
+<h4 align=center>G. Marcais and C. Kingsford </h4>
+<h4 align=center>2010/10/1</h4>
+<h4 align=center>Version 1.1.4</h4>
+<p>
+<tt>Jellyfish</tt>
+is a software to count k-mers in DNA sequences. 
+<p>
+<h3>Table of Contents</h3>
+<ul>
+<li><a href="#section_1">Synopsis </a></li>
+<li><a href="#section_2">Description </a>
+<ul>
+<li><a href="#section_3">Counting and merging </a></li>
+<li><a href="#section_4">Orientation </a></li>
+<li><a href="#section_5">Choosing the hash size </a></li>
+<li><a href="#section_6">Choosing the counting field size </a></li>
+</ul>
+<li><a href="#section_7">Subcommands and options </a>
+<ul>
+<li><a href="#section_8">count </a></li>
+<li><a href="#section_9">stats </a></li>
+<li><a href="#section_10">histo </a></li>
+<li><a href="#section_11">dump </a></li>
+<li><a href="#section_12">merge </a></li>
+<li><a href="#section_13">query </a></li>
+<li><a href="#section_14">qhisto </a></li>
+<li><a href="#section_15">qdump </a></li>
+<li><a href="#section_16">qmerge </a></li>
+<li><a href="#section_17">cite </a></li>
+</ul>
+<li><a href="#section_18">Version </a></li>
+<li><a href="#section_19">Bugs </a></li>
+<li><a href="#section_20">Copyright & License </a></li>
+<li><a href="#section_21">Authors </a></li>
+</ul>
+<p>
+<h2><a name="section_1">Synopsis</a></h2>
+
+<tt>jellyfish count</tt>
+[<b>-o</b><i>prefix</i>]
+[<b>-m</b><i>merlength</i>]
+[<b>-t</b><i>threads</i>]
+[<b>-s</b><i>hashsize</i>]
+[<b>--both-strands</b>]
+<i>fasta</i>
+[<i>fasta ...</i>]
+<br>
+<tt>jellyfish merge</tt>
+<i>hash1</i>
+<i>hash2</i>
+...<br>
+<tt>jellyfish dump</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish stats</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish histo</tt>
+[<b>-h</b><i>high</i>]
+[<b>-l</b><i>low</i>]
+[<b>-i</b><i>increment</i>]
+<i>hash</i>
+<br>
+<tt>jellyfish query</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish cite</tt>
+<br>
+<p>
+Plus equivalent version for <tt>Quake</tt>
+mode: <tt>qhisto</tt>,
+<tt>qdump</tt>
+and <tt>qmerge</tt>.
+<p>
+<h2><a name="section_2">Description</a></h2>
+
+<p>
+<tt>Jellyfish</tt>
+is a k-mer counter based on a multi-threaded hash 
+table implementation. 
+<p>
+<h4><a name="section_3">Counting and merging</a></h4>
+
+<p>
+To count k-mers, use a command like: 
+<p>
+<pre>
+jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta
+</pre>
+<p>
+This will count the the 22-mers in input.fasta with 32 threads. The 
+counter field in the hash uses only 3 bits and the hash has at least 
+10 million entries. 
+<p>
+The output files will be named output_0, output_1, etc. (the prefix 
+is specified with the <b>-o</b>
+switch). If the hash is large enough 
+(has specified by the <b>-s</b>
+switch) to fit all the k-mers, there 
+will be only one output file named output_0. If the hash filled up 
+before all the mers were read, the hash is dumped to disk, zeroed out 
+and reading in mers resumes. Multiple intermediary files will be 
+present on the disks, named output_0, output_1, etc. 
+<p>
+To obtain correct results from the other sub-commands (such as histo, 
+stats, etc.), the multiple output files, if any, need to be merged into one 
+with the merge command. For example with the following command: 
+<p>
+<pre>
+jellyfish merge -o output.jf output\_*
+</pre>
+<p>
+Should you get many intermediary output files (say hundreds), the size 
+of the hash table is too small. Rerunning <tt>Jellyfish</tt>
+with a 
+larger size (option <b>-s</b>)
+is probably faster than merging all the 
+intermediary files. 
+<p>
+<h4><a name="section_4">Orientation</a></h4>
+
+When the orientation of the sequences in the input fasta file is not 
+known, e.g. in sequencing reads, using <b>--both-strands</b>
+(<b>-C</b>)
+makes the most sense. 
+<p>
+For any k-mer m, its canonical representation is m itself or its 
+reverse-complement, whichever comes first lexicographically. With the 
+option <b>-C</b>,
+only the canonical representation of the mers are 
+stored in the hash and the count value is the number of occurrences of 
+both the mer and its reverse-complement. 
+<p>
+<h4><a name="section_5">Choosing the hash size</a></h4>
+
+<p>
+To achieve the best performance, a minimum number of intermediary 
+files should be written to disk. So the parameter <b>-s</b>
+should be 
+chosen to fit as many k-mers as possible (ideally all of them) while 
+still fitting in memory. 
+<p>
+We consider to examples: counting mers in sequencing reads and in a 
+finished genome. 
+<p>
+First, suppose we count k-mers in short sequencing reads: 
+there are n reads and there is an average of 1 error per reads where 
+each error generates k unique mers. If the genome size is G, the 
+size of the hash (option <b>-s</b>)
+to fit all k-mers at once is estimated to: $(G + 
+k*n)/0.8$. The division by 0.8 compensates for the maximum usage of 
+approximately $80%$ of the hash table. 
+<p>
+On the other hand, when counting k-mers in an assembled sequence of 
+length G, setting <b>-s</b>
+to G is appropriate. 
+<p>
+As a matter of convenience, Jellyfish understands ISO suffixes for the 
+size of the hash. Hence '-s 10M' stands 10 million entries while '-s 
+50G' stands for 50 billion entries. 
+<p>
+The actual memory usage of the hash table can be computed as 
+follow. The actual size of the hash will be rounded up to the next 
+power of 2: s=2^l. The parameter r is such that the maximum 
+reprobe value (<b>-p</b>)
+plus one is less than 2^r. Then the memory usage per 
+entry in the hash is (in bits, not bytes) 2k-l+r+1. The total memory 
+usage of the hash table in bytes is: 2^l*(2k-l+r+1)/8. 
+<p>
+<h4><a name="section_6">Choosing the counting field size</a></h4>
+
+To save space, the hash table supports variable length counter, i.e. a 
+k-mer occurring only a few times will use a small counter, a k-mer 
+occurring many times will used multiple entries in the hash. 
+<p>
+Important: the size of the couting field does NOT change the result, 
+it only impacts the amount of memory used. In particular, there is no 
+maximum value in the hash. Even if the counting field uses 5 bits, a 
+k-mer occuring 2 million times will have a value reported of 2 
+million (i.e., it is not capped at 2^5). 
+<p>
+The <b>-c</b>
+specify the length (in bits) of the counting field. The 
+trade off is as follows: a low value will save space per entry in the 
+hash but can potentially increase the number of entries used, hence 
+maybe requiring a larger hash. 
+<p>
+In practice, use a value for <b>-c</b>
+so that most of you k-mers 
+require only 1 entry. For example, to count k-mers in a genome, 
+where most of the sequence is unique, use <b>-c</b><i>1</i>
+or 
+<b>-c</b><i>2</i>.
+For sequencing reads, use a value for <b>-c</b>
+large 
+enough to counts up to twice the coverage. For example, if the 
+coverage is 10X, choose a counter length of 5 (<b>-c</b><i>5</i>)
+as $2^5 > 20$. 
+<p>
+<h2><a name="section_7">Subcommands and options</a></h2>
+
+<h4><a name="section_8">count</a></h4>
+
+Usage: jellyfish count [options] file:path+ 
+<p>
+Count k-mers or qmers in fasta or fastq files 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-m</b>,
+<b>--mer-len</b><i>=uint32</i>
+</dt>
+<dd> *Length of mer 
+</dd>
+<dt><b>-s</b>,
+<b>--size</b><i>=uint64</i>
+</dt>
+<dd> *Hash size 
+</dd>
+<dt><b>-t</b>,
+<b>--threads</b><i>=uint32</i>
+</dt>
+<dd> Number of threads (1) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output prefix (mer_counts) 
+</dd>
+<dt><b>-c</b>,
+<b>--counter-len</b><i>=Length</i>
+</dt>
+<dd> in bits Length of counting field (7) 
+</dd>
+<dt><b>--out-counter-len</b><i>=Length</i>
+</dt>
+<dd> in bytes Length of counter field in output (4) 
+</dd>
+<dt><b>-C</b>,<b>--both-strands</b>
+</dt>
+<dd> Count both strand, canonical representation (false) 
+</dd>
+<dt><b>-p</b>,
+<b>--reprobes</b><i>=uint32</i>
+</dt>
+<dd> Maximum number of reprobes (62) 
+</dd>
+<dt><b>-r</b>,<b>--raw</b>
+</dt>
+<dd> Write raw database (false) 
+</dd>
+<dt><b>-q</b>,<b>--quake</b>
+</dt>
+<dd> Quake compatibility mode (false) 
+</dd>
+<dt><b>--quality-start</b><i>=uint32</i>
+</dt>
+<dd> Starting ASCII for quality values (64) 
+</dd>
+<dt><b>--min-quality</b><i>=uint32</i>
+</dt>
+<dd> Minimum quality. A base with lesser quality becomes an N (0) 
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count 
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count 
+</dd>
+<dt><b>--matrix</b><i>=Matrix</i>
+</dt>
+<dd> file Hash function binary matrix 
+</dd>
+<dt><b>--timing</b><i>=Timing</i>
+</dt>
+<dd> file Print timing information 
+</dd>
+<dt><b>--stats</b><i>=Stats</i>
+</dt>
+<dd> file Print stats 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_9">stats</a></h4>
+
+Usage: jellyfish stats [options] db:path 
+<p>
+Statistics 
+<p>
+Display some statistics about the k-mers in the hash: 
+<p>
+Unique: Number of k-mers which occur only once. 
+Distinct: Number of k-mers, not counting multiplicity. 
+Total: Number of k-mers, including multiplicity. 
+Max_count: Maximum number of occurrence of a k-mer. 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't consider k-mer with count < lower-count 
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't consider k-mer with count > upper-count 
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Verbose (false) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_10">histo</a></h4>
+
+Usage: jellyfish histo [options] db:path 
+<p>
+Create an histogram of k-mer occurrences 
+<p>
+Create an histogram with the number of k-mers having a given 
+count. In bucket 'i' are tallied the k-mers which have a count 'c' 
+satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are 
+labeled by the low end point (low+i*inc). 
+<p>
+The last bucket in the output behaves as a catchall: it tallies all 
+k-mers with a count greater or equal to the low end point of this 
+bucket. 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-l</b>,
+<b>--low</b><i>=uint64</i>
+</dt>
+<dd> Low count value of histogram (1) 
+</dd>
+<dt><b>-h</b>,
+<b>--high</b><i>=uint64</i>
+</dt>
+<dd> High count value of histogram (10000) 
+</dd>
+<dt><b>-i</b>,
+<b>--increment</b><i>=uint64</i>
+</dt>
+<dd> Increment value for buckets (1) 
+</dd>
+<dt><b>-t</b>,
+<b>--threads</b><i>=uint32</i>
+</dt>
+<dd> Number of threads (1) 
+</dd>
+<dt><b>-f</b>,<b>--full</b>
+</dt>
+<dd> Full histo. Don't skip count 0. (false) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Output information (false) 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_11">dump</a></h4>
+
+Usage: jellyfish dump [options] db:path 
+<p>
+Dump k-mer counts 
+<p>
+By default, dump in a fasta format where the header is the count and 
+the sequence is the sequence of the k-mer. The column format is a 2 
+column output: k-mer count. 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-c</b>,<b>--column</b>
+</dt>
+<dd> Column format (false) 
+</dd>
+<dt><b>-t</b>,<b>--tab</b>
+</dt>
+<dd> Tab separator (false) 
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count 
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_12">merge</a></h4>
+
+Usage: jellyfish merge [options] input:string+ 
+<p>
+Merge jellyfish databases 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-s</b>,
+<b>--buffer-size</b><i>=Buffer</i>
+</dt>
+<dd> length Length in bytes of input buffer (10000000) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file (mer_counts_merged.jf) 
+</dd>
+<dt><b>--out-counter-len</b><i>=uint32</i>
+</dt>
+<dd> Length (in bytes) of counting field in output (4) 
+</dd>
+<dt><b>--out-buffer-size</b><i>=uint64</i>
+</dt>
+<dd> Size of output buffer per thread (10000000) 
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Be verbose (false) 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_13">query</a></h4>
+
+Usage: jellyfish query [options] db:path 
+<p>
+Query from a compacted database 
+<p>
+Query a hash. It reads k-mers from the standard input and write the counts on the standard output. 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-C</b>,<b>--both-strands</b>
+</dt>
+<dd> Both strands (false) 
+</dd>
+<dt><b>-c</b>,<b>--cary-bit</b>
+</dt>
+<dd> Value field as the cary bit information (false) 
+</dd>
+<dt><b>-i</b>,
+<b>--input</b><i>=file</i>
+</dt>
+<dd> Input file 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=file</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_14">qhisto</a></h4>
+
+Usage: jellyfish qhisto [options] db:string 
+<p>
+Create an histogram of k-mer occurences 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-l</b>,
+<b>--low</b><i>=double</i>
+</dt>
+<dd> Low count value of histogram (0.0) 
+</dd>
+<dt><b>-h</b>,
+<b>--high</b><i>=double</i>
+</dt>
+<dd> High count value of histogram (10000.0) 
+</dd>
+<dt><b>-i</b>,
+<b>--increment</b><i>=double</i>
+</dt>
+<dd> Increment value for buckets (1.0) 
+</dd>
+<dt><b>-f</b>,<b>--full</b>
+</dt>
+<dd> Full histo. Don't skip count 0. (false) 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_15">qdump</a></h4>
+
+Usage: jellyfish qdump [options] db:path 
+<p>
+Dump k-mer from a qmer database 
+<p>
+By default, dump in a fasta format where the header is the count and 
+the sequence is the sequence of the k-mer. The column format is a 2 
+column output: k-mer count. 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-c</b>,<b>--column</b>
+</dt>
+<dd> Column format (false) 
+</dd>
+<dt><b>-t</b>,<b>--tab</b>
+</dt>
+<dd> Tab separator (false) 
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=double</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count 
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=double</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count 
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Be verbose (false) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_16">qmerge</a></h4>
+
+Usage: jellyfish merge [options] db:string+ 
+<p>
+Merge quake databases 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-s</b>,
+<b>--size</b><i>=uint64</i>
+</dt>
+<dd> *Merged hash table size 
+</dd>
+<dt><b>-m</b>,
+<b>--mer-len</b><i>=uint32</i>
+</dt>
+<dd> *Mer length 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file (merged.jf) 
+</dd>
+<dt><b>-p</b>,
+<b>--reprobes</b><i>=uint32</i>
+</dt>
+<dd> Maximum number of reprobes (62) 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h4><a name="section_17">cite</a></h4>
+
+Usage: jellyfish cite [options] 
+<p>
+How to cite Jellyfish's paper 
+<p>
+Citation of paper 
+<p>
+Options (default value in (), *required): 
+<dl compact>
+<dt><b>-b</b>,<b>--bibtex</b>
+</dt>
+<dd> Bibtex format (false) 
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file 
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage 
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message 
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version 
+</dd>
+</dl>
+<p>
+<h2><a name="section_18">Version</a></h2>
+
+<p>
+Version: 1.1.4 of 2010/10/1
+<p>
+<h2><a name="section_19">Bugs</a></h2>
+
+<p>
+<ul compact>
+<li><tt>jellyfish merge</tt> has not been parallelized and is
+relatively slow. 
+</li>
+<li>The hash table does not grow in memory automatically and 
+<tt>jellyfish merge</tt>
+is not called automatically on the 
+intermediary files (if any). 
+</li>
+</ul>
+<p>
+<h2><a name="section_20">Copyright & License</a></h2>
+
+<dl compact>
+<dt>Copyright</dt>
+<dd> © 2010, Guillaume Marcais <a href ="mailto:guillaume at marcais.net"><tt>guillaume at marcais.net</tt></a>
+and Carl Kingsford <a href ="mailto:carlk at umiacs.umd.edu"><tt>carlk at umiacs.umd.edu</tt></a>.
+<p>
+</dd>
+<dt>License</dt>
+<dd> This program is free software: you can redistribute it 
+and/or modify it under the terms of the GNU General Public License 
+as published by the Free Software Foundation, either version 3 of 
+the License, or (at your option) any later version. <br>
+
+This program is distributed in the hope that it will be useful, but 
+WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
+General Public License for more details. <br>
+
+You should have received a copy of the GNU General Public License 
+along with this program. If not, see 
+<a href ="http://www.gnu.org/licenses/"><tt>http://www.gnu.org/licenses/</tt></a>.
+</dd>
+</dl>
+<p>
+<h2><a name="section_21">Authors</a></h2>
+
+Guillaume Marcais <br>
+
+University of Maryland <br>
+
+<a href ="mailto:gmarcais at umd.edu"><tt>gmarcais at umd.edu</tt></a>
+<p>
+Carl Kingsford <br>
+
+University of Maryland <br>
+
+<a href ="mailto:carlk at umiacs.umd.edu"><tt>carlk at umiacs.umd.edu</tt></a>
+<p>
+</body>
+</html>
+<!-- NOTE: This file is generated, DO NOT EDIT. -->
diff --git a/doc/jellyfish.tex b/doc/jellyfish.tex
new file mode 100644
index 0000000..c329e11
--- /dev/null
+++ b/doc/jellyfish.tex
@@ -0,0 +1,205 @@
+\documentclass[english]{article}
+\usepackage[latin1]{inputenc}
+\usepackage{babel}
+\usepackage{verbatim}
+
+%% do we have the hyperref package?
+\IfFileExists{hyperref.sty}{
+   \usepackage[bookmarksopen,bookmarksnumbered]{hyperref}
+}{}
+
+%% do we have the fancyhdr package?
+\IfFileExists{fancyhdr.sty}{
+\usepackage[fancyhdr]{latex2man}
+}{
+%% do we have the fancyheadings package?
+\IfFileExists{fancyheadings.sty}{
+\usepackage[fancy]{latex2man}
+}{
+\usepackage[nofancy]{latex2man}
+\message{no fancyhdr or fancyheadings package present, discard it}
+}}
+\usepackage[letterpaper]{geometry}
+
+\newcommand{\ddash}[1]{-\,-#1}
+\newcommand{\LOpt}[1]{\Opt{\ddash{#1}}}
+\newcommand{\LoOpt}[1]{\oOpt{\ddash{#1}}}
+\newcommand{\LOptArg}[2]{\OptArg{\ddash{#1}}{#2}}
+\newcommand{\LoOptArg}[2]{\oOptArg{\ddash{#1}}{#2}}
+\newcommand{\LoOptoArg}[2]{\oOptoArg{\ddash{#1}}{#2}}
+
+\setVersion{1.1.4}
+\setDate{2010/10/1}
+
+\begin{document}
+
+\begin{Name}{1}{jellyfish}{G. Marcais and C. Kingsford}{k-mer counter}{Jellyfish: A fast k-mer counter}
+
+\Prog{Jellyfish} is a software to count $k$-mers in DNA sequences.
+
+\end{Name}
+
+\section{Synopsis}
+\Prog{jellyfish count} \oOptArg{-o}{prefix} \oOptArg{-m}{merlength} \oOptArg{-t}{threads} \oOptArg{-s}{hashsize} \LoOpt{both-strands} \Arg{fasta} \oArg{fasta \Dots} \\
+\Prog{jellyfish merge} \Arg{hash1} \Arg{hash2} \Dots \\
+\Prog{jellyfish dump}  \Arg{hash} \\
+\Prog{jellyfish stats} \Arg{hash} \\
+\Prog{jellyfish histo} \oOptArg{-h}{high} \oOptArg{-l}{low} \oOptArg{-i}{increment} \Arg{hash} \\
+\Prog{jellyfish query} \Arg{hash} \\
+\Prog{jellyfish cite} \\
+
+
+Plus equivalent version for \Prog{Quake} mode: \Prog{qhisto}, \Prog{qdump} and \Prog{qmerge}.
+
+\section{Description}
+
+\Prog{Jellyfish} is a $k$-mer counter based on a multi-threaded hash
+table implementation.
+
+\subsection{Counting and merging}
+
+To count $k$-mers, use a command like:
+
+\begin{verbatim}
+jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta
+\end{verbatim}
+
+This will count the the 22-mers in input.fasta with 32 threads. The
+counter field in the hash uses only 3 bits and the hash has at least
+10 million entries.
+
+The output files will be named output\_0, output\_1, etc. (the prefix
+is specified with the \Opt{-o} switch). If the hash is large enough
+(has specified by the \Opt{-s} switch) to fit all the $k$-mers, there
+will be only one output file named output\_0. If the hash filled up
+before all the mers were read, the hash is dumped to disk, zeroed out
+and reading in mers resumes. Multiple intermediary files will be
+present on the disks, named output\_0, output\_1, etc.
+
+To obtain correct results from the other sub-commands (such as histo,
+stats, etc.), the multiple output files, if any, need to be merged into one
+with the merge command. For example with the following command:
+
+\begin{verbatim}
+jellyfish merge -o output.jf output\_*
+\end{verbatim}
+
+Should you get many intermediary output files (say hundreds), the size
+of the hash table is too small. Rerunning \Prog{Jellyfish} with a
+larger size (option \Opt{-s}) is probably faster than merging all the
+intermediary files.
+
+\subsection{Orientation}
+When the orientation of the sequences in the input fasta file is not
+known, e.g. in sequencing reads, using \LOpt{both-strands} (\Opt{-C})
+makes the most sense.
+
+For any $k$-mer $m$, its canonical representation is $m$ itself or its
+reverse-complement, whichever comes first lexicographically. With the
+option \Opt{-C}, only the canonical representation of the mers are
+stored in the hash and the count value is the number of occurrences of
+both the mer and its reverse-complement.
+
+
+\subsection{Choosing the hash size}
+
+To achieve the best performance, a minimum number of intermediary
+files should be written to disk. So the parameter \Opt{-s} should be
+chosen to fit as many $k$-mers as possible (ideally all of them) while
+still fitting in memory.
+
+We consider to examples: counting mers in sequencing reads and in a
+finished genome.
+
+First, suppose we count $k$-mers in short sequencing reads:
+there are $n$ reads and there is an average of 1 error per reads where
+each error generates $k$ unique mers. If the genome size is $G$, the
+size of the hash (option \Opt{-s}) to fit all $k$-mers at once is estimated to: $(G +
+k*n)/0.8$. The division by $0.8$ compensates for the maximum usage of
+approximately $80\%$ of the hash table.
+
+On the other hand, when counting $k$-mers in an assembled sequence of
+length $G$, setting \Opt{-s} to $G$ is appropriate.
+
+As a matter of convenience, Jellyfish understands ISO suffixes for the
+size of the hash. Hence '-s 10M' stands 10 million entries while '-s
+50G' stands for 50 billion entries.
+
+The actual memory usage of the hash table can be computed as
+follow. The actual size of the hash will be rounded up to the next
+power of 2: $s=2^l$. The parameter $r$ is such that the maximum
+reprobe value (\Opt{-p}) plus one is less than $2^r$. Then the memory usage per
+entry in the hash is (in bits, not bytes) $2k-l+r+1$. The total memory
+usage of the hash table in bytes is: $2^l*(2k-l+r+1)/8$.
+
+\subsection{Choosing the counting field size}
+To save space, the hash table supports variable length counter, i.e. a
+$k$-mer occurring only a few times will use a small counter, a $k$-mer
+occurring many times will used multiple entries in the hash.
+
+Important: the size of the couting field does NOT change the result,
+it only impacts the amount of memory used. In particular, there is no
+maximum value in the hash. Even if the counting field uses 5 bits, a
+$k$-mer occuring 2 million times will have a value reported of 2
+million (i.e., it is not capped at $2^5$).
+
+The \Opt{-c} specify the length (in bits) of the counting field. The
+trade off is as follows: a low value will save space per entry in the
+hash but can potentially increase the number of entries used, hence
+maybe requiring a larger hash.
+
+In practice, use a value for \Opt{-c} so that most of you $k$-mers
+require only 1 entry. For example, to count $k$-mers in a genome,
+where most of the sequence is unique, use \OptArg{-c}{1} or
+\OptArg{-c}{2}. For sequencing reads, use a value for \Opt{-c} large
+enough to counts up to twice the coverage. For example, if the
+coverage is 10X, choose a counter length of $5$ (\OptArg{-c}{5}) as $2^5 > 20$.
+
+
+\section{Subcommands and options}
+include(options.tex)
+
+\section{Version}
+
+Version: \Version\ of \Date
+
+\section{Bugs}
+
+\begin{itemize}
+\item \Prog{jellyfish merge} has not been parallelized and is
+  relatively slow.
+\item The hash table does not grow in memory automatically and
+  \Prog{jellyfish merge} is not called automatically on the
+  intermediary files (if any).
+\end{itemize}
+
+\section{Copyright \& License}
+\begin{description}
+\item[Copyright] \copyright\ 2010, Guillaume Marcais \Email{guillaume at marcais.net} and Carl Kingsford \Email{carlk at umiacs.umd.edu}.
+
+\item[License] This program is free software: you can redistribute it
+  and/or modify it under the terms of the GNU General Public License
+  as published by the Free Software Foundation, either version 3 of
+  the License, or (at your option) any later version. \\
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details. \\
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see
+  \URL{http://www.gnu.org/licenses/}. 
+\end{description}
+
+\section{Authors}
+\noindent
+Guillaume Marcais \\
+University of Maryland \\
+\Email{gmarcais at umd.edu}
+
+\noindent
+Carl Kingsford \\
+University of Maryland \\
+\Email{carlk at umiacs.umd.edu}
+
+\LatexManEnd
+\end{document}
diff --git a/doc/option_to_tex b/doc/option_to_tex
new file mode 100644
index 0000000..97dad8d
--- /dev/null
+++ b/doc/option_to_tex
@@ -0,0 +1,35 @@
+#! /usr/bin/env ruby
+
+exit 1 if ARGV[0].nil?
+
+require 'rubygems'
+require 'treetop'
+
+
+def quote(str)
+  str.gsub(/_/, "\\_")
+end
+require 'help_parse.rb'
+
+
+class IsOpen
+  attr_accessor :is_open
+  def initialize
+    @is_open = false
+  end
+end
+opened = IsOpen.new
+
+
+parser = HelpGrammarParser.new
+open(ARGV[0]) { |fd|
+  fd.each { |l| 
+    r = parser.parse(l)
+    if r.nil?
+      raise "Got nil for: #{l}"
+    else
+      puts r.to_tex(opened)
+    end
+  }
+  puts("\\end{description}") if opened.is_open
+}
diff --git a/doc/options.tex b/doc/options.tex
new file mode 100644
index 0000000..f9e4532
--- /dev/null
+++ b/doc/options.tex
@@ -0,0 +1,210 @@
+\subsection{count}
+\noindent Usage: jellyfish count [options] file:path+
+
+\noindent Count k-mers or qmers in fasta or fastq files
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-m},\LOptArg{mer-len}{=uint32}] \noindent *Length of mer
+\item[\Opt{-s},\LOptArg{size}{=uint64}] \noindent *Hash size
+\item[\Opt{-t},\LOptArg{threads}{=uint32}] \noindent Number of threads (1)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output prefix (mer\_counts)
+\item[\Opt{-c},\LOptArg{counter-len}{=Length}] \noindent in bits         Length of counting field (7)
+\item[\LOptArg{out-counter-len}{=Length}] \noindent in bytes    Length of counter field in output (4)
+\item[\Opt{-C},\LOpt{both-strands}] \noindent Count both strand, canonical representation (false)
+\item[\Opt{-p},\LOptArg{reprobes}{=uint32}] \noindent Maximum number of reprobes (62)
+\item[\Opt{-r},\LOpt{raw}] \noindent Write raw database (false)
+\item[\Opt{-q},\LOpt{quake}] \noindent Quake compatibility mode (false)
+\item[\LOptArg{quality-start}{=uint32}] \noindent Starting ASCII for quality values (64)
+\item[\LOptArg{min-quality}{=uint32}] \noindent Minimum quality. A base with lesser quality becomes an N (0)
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't output k-mer with count > upper-count
+\item[\LOptArg{matrix}{=Matrix}] \noindent file                 Hash function binary matrix
+\item[\LOptArg{timing}{=Timing}] \noindent file                 Print timing information
+\item[\LOptArg{stats}{=Stats}] \noindent file                   Print stats
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{stats}
+\noindent Usage: jellyfish stats [options] db:path
+
+\noindent Statistics
+
+\noindent Display some statistics about the k-mers in the hash:
+
+\noindent Unique:    Number of k-mers which occur only once.
+\noindent Distinct:  Number of k-mers, not counting multiplicity.
+\noindent Total:     Number of k-mers, including multiplicity.
+\noindent Max\_count: Maximum number of occurrence of a k-mer.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't consider k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't consider k-mer with count > upper-count
+\item[\Opt{-v},\LOpt{verbose}] \noindent Verbose (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{histo}
+\noindent Usage: jellyfish histo [options] db:path
+
+\noindent Create an histogram of k-mer occurrences
+
+\noindent Create an histogram with the number of k-mers having a given
+\noindent count. In bucket 'i' are tallied the k-mers which have a count 'c'
+\noindent satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are
+\noindent labeled by the low end point (low+i*inc).
+
+\noindent The last bucket in the output behaves as a catchall: it tallies all
+\noindent k-mers with a count greater or equal to the low end point of this
+\noindent bucket.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-l},\LOptArg{low}{=uint64}] \noindent Low count value of histogram (1)
+\item[\Opt{-h},\LOptArg{high}{=uint64}] \noindent High count value of histogram (10000)
+\item[\Opt{-i},\LOptArg{increment}{=uint64}] \noindent Increment value for buckets (1)
+\item[\Opt{-t},\LOptArg{threads}{=uint32}] \noindent Number of threads (1)
+\item[\Opt{-f},\LOpt{full}] \noindent Full histo. Don't skip count 0. (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\Opt{-v},\LOpt{verbose}] \noindent Output information (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{dump}
+\noindent Usage: jellyfish dump [options] db:path
+
+\noindent Dump k-mer counts
+
+\noindent By default, dump in a fasta format where the header is the count and
+\noindent the sequence is the sequence of the k-mer. The column format is a 2
+\noindent column output: k-mer count.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-c},\LOpt{column}] \noindent Column format (false)
+\item[\Opt{-t},\LOpt{tab}] \noindent Tab separator (false)
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't output k-mer with count > upper-count
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{merge}
+\noindent Usage: jellyfish merge [options] input:string+
+
+\noindent Merge jellyfish databases
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-s},\LOptArg{buffer-size}{=Buffer}] \noindent length          Length in bytes of input buffer (10000000)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file (mer\_counts\_merged.jf)
+\item[\LOptArg{out-counter-len}{=uint32}] \noindent Length (in bytes) of counting field in output (4)
+\item[\LOptArg{out-buffer-size}{=uint64}] \noindent Size of output buffer per thread (10000000)
+\item[\Opt{-v},\LOpt{verbose}] \noindent Be verbose (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{query}
+\noindent Usage: jellyfish query [options] db:path
+
+\noindent Query from a compacted database
+
+\noindent Query a hash. It reads k-mers from the standard input and write the counts on the standard output.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-C},\LOpt{both-strands}] \noindent Both strands (false)
+\item[\Opt{-c},\LOpt{cary-bit}] \noindent Value field as the cary bit information (false)
+\item[\Opt{-i},\LOptArg{input}{=file}] \noindent Input file
+\item[\Opt{-o},\LOptArg{output}{=file}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qhisto}
+\noindent Usage: jellyfish qhisto [options] db:string
+
+\noindent Create an histogram of k-mer occurences
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-l},\LOptArg{low}{=double}] \noindent Low count value of histogram (0.0)
+\item[\Opt{-h},\LOptArg{high}{=double}] \noindent High count value of histogram (10000.0)
+\item[\Opt{-i},\LOptArg{increment}{=double}] \noindent Increment value for buckets (1.0)
+\item[\Opt{-f},\LOpt{full}] \noindent Full histo. Don't skip count 0. (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qdump}
+\noindent Usage: jellyfish qdump [options] db:path
+
+\noindent Dump k-mer from a qmer database
+
+\noindent By default, dump in a fasta format where the header is the count and
+\noindent the sequence is the sequence of the k-mer. The column format is a 2
+\noindent column output: k-mer count.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-c},\LOpt{column}] \noindent Column format (false)
+\item[\Opt{-t},\LOpt{tab}] \noindent Tab separator (false)
+\item[\Opt{-L},\LOptArg{lower-count}{=double}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=double}] \noindent Don't output k-mer with count > upper-count
+\item[\Opt{-v},\LOpt{verbose}] \noindent Be verbose (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qmerge}
+\noindent Usage: jellyfish merge [options] db:string+
+
+\noindent Merge quake databases
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-s},\LOptArg{size}{=uint64}] \noindent *Merged hash table size
+\item[\Opt{-m},\LOptArg{mer-len}{=uint32}] \noindent *Mer length
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file (merged.jf)
+\item[\Opt{-p},\LOptArg{reprobes}{=uint32}] \noindent Maximum number of reprobes (62)
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{cite}
+\noindent Usage: jellyfish cite [options]
+
+\noindent How to cite Jellyfish's paper
+
+\noindent Citation of paper
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-b},\LOpt{bibtex}] \noindent Bibtex format (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
diff --git a/doc/transfile b/doc/transfile
new file mode 100644
index 0000000..964dbde
--- /dev/null
+++ b/doc/transfile
@@ -0,0 +1,19 @@
+my @opt1_types = ('Opt', 'oOpt');
+for my $otype (@opt1_types) {
+    $manMacro1a{'L' . $otype} = $manMacro1a{$otype} . '--';
+    $manMacro1b{'L' . $otype} = $manMacro1b{$otype};
+
+    $htmlMacro1a{'L' . $otype} = $htmlMacro1a{$otype} . '--';
+    $htmlMacro1b{'L' . $otype} = $htmlMacro1b{$otype};
+}
+
+my @opt2_types = ('OptArg', 'oOptArg', 'OptoArg', 'oOptoArg');
+for my $otype (@opt2_types) {
+    $manMacro2a{'L' . $otype} = $manMacro2a{$otype} . '--';
+    $manMacro2b{'L' . $otype} = $manMacro2b{$otype};
+    $manMacro2c{'L' . $otype} = $manMacro2c{$otype};
+
+    $htmlMacro2a{'L' . $otype} = $htmlMacro2a{$otype} . '--';
+    $htmlMacro2b{'L' . $otype} = $htmlMacro2b{$otype};
+    $htmlMacro2c{'L' . $otype} = $htmlMacro2c{$otype};
+}
diff --git a/examples/README b/examples/README
new file mode 100644
index 0000000..0be53be
--- /dev/null
+++ b/examples/README
@@ -0,0 +1,15 @@
+What is it?
+===========
+
+Here are some examples on how to use the Jellyfish library and
+potentially useful programs to compute data from Jellyfish
+output. Each directory is an independent project which relies on
+Jellyfish between installed and is available with pkg-config. Meaning
+'pkg-config --print-provides jellyfish-2.0' returns something like
+'jellyfish-2.0 = 2.1.1'.
+
+Disclaimer
+==========
+
+Notice that the code in these directory is not as well tested as the
+rest of the Jellyfish code. It should work but no guaranteed is made.
diff --git a/examples/count_in_file/Makefile b/examples/count_in_file/Makefile
new file mode 100644
index 0000000..4b6358c
--- /dev/null
+++ b/examples/count_in_file/Makefile
@@ -0,0 +1,7 @@
+CC = g++
+CXXFLAGS = $(shell pkg-config --cflags jellyfish-2.0) -std=c++0x -Wall -O3
+LDFLAGS = $(shell pkg-config --libs jellyfish-2.0) -Wl,--rpath=$(shell pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L//g')
+
+all: count_in_file
+clean:
+	rm -f *.o count_in_file
diff --git a/examples/count_in_file/README b/examples/count_in_file/README
new file mode 100644
index 0000000..139df1b
--- /dev/null
+++ b/examples/count_in_file/README
@@ -0,0 +1,40 @@
+What is it?
+===========
+
+Given a number of jellyfish databases, it outputs for all the k-mers
+(in the union of the database) the number of occurrences in each of
+the database.
+
+LIMITATION: all the database must have been created with the same size
+parameter to Jellyfish. It is adivsed to use the --disk switch of
+'jellyfish count' to ensure that all the database are created with the
+same size. For example: jellyfish count -s 100M --disk ...
+
+The output is a column format where the first column is
+the k-mer and the remaining columns are the counts in each of the
+databases, in the same order as given on the command line.
+
+For example:
+
+$ ./count_in_file db1.jf db2.jf
+GCCACGACTCGTGCA 1 0
+CAAGCTGTGTGGCCG 0 2
+CATAGAAATCGATAA 3 5
+TACTATATAAGCAAA 2 0
+...
+
+Some details
+============
+
+The Jellyfish database are sorted list of k-mers. The sorting order is
+based on the hash function (a random binary matrix). The program works
+similarly to how merging sorted lists is done, but instead of summing
+the count of each k-mers, it displays the count in each of the sorted
+list.
+
+Because all the files must be sorted according to the same criteria,
+the size of the hash (and therefore the hash function) must be the
+same for all the input files. See the LIMITATION paragraph above to
+run Jellyfish properly. Note that the size passed to 'jellyfish count'
+is NOT a limit on the number k-mers in the file (only a limit on the
+number of mers in memory).
diff --git a/examples/count_in_file/count_in_file.cc b/examples/count_in_file/count_in_file.cc
new file mode 100644
index 0000000..095204f
--- /dev/null
+++ b/examples/count_in_file/count_in_file.cc
@@ -0,0 +1,158 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <memory>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+// From a list of jellyfish database, output for each mers how many
+// times it occurs in each db. It is very similar to merging (and the
+// code is copied/adapted from jellyfish/merge_files.cc).
+
+namespace err = jellyfish::err;
+
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using jellyfish::cpp_array;
+typedef std::unique_ptr<binary_reader>           binary_reader_ptr;
+typedef std::unique_ptr<text_reader>             text_reader_ptr;
+
+struct file_info {
+  std::ifstream is;
+  file_header   header;
+
+  file_info(const char* path) :
+    is(path),
+    header(is)
+  { }
+};
+
+
+struct common_info {
+  unsigned int            key_len;
+  size_t                  max_reprobe_offset;
+  size_t                  size;
+  unsigned int            out_counter_len;
+  std::string             format;
+  RectangularBinaryMatrix matrix;
+
+  common_info(RectangularBinaryMatrix&& m) : matrix(std::move(m))
+  { }
+};
+
+common_info read_headers(int argc, char* input_files[], cpp_array<file_info>& files) {
+  // Read first file
+  files.init(0, input_files[0]);
+  if(!files[0].is.good())
+    err::die(err::msg() << "Failed to open input file '" << input_files[0] << "'");
+
+  file_header& h = files[0].header;
+  common_info res(h.matrix());
+  res.key_len            = h.key_len();
+  res.max_reprobe_offset = h.max_reprobe_offset();
+  res.size               = h.size();
+  res.format = h.format();
+  size_t reprobes[h.max_reprobe() + 1];
+  h.get_reprobes(reprobes);
+  res.out_counter_len = h.counter_len();
+
+  // Other files must match
+  for(int i = 1; i < argc; i++) {
+    files.init(i, input_files[i]);
+    file_header& nh = files[i].header;
+    if(!files[i].is.good())
+      err::die(err::msg() << "Failed to open input file '" << input_files[i] << "'");
+    if(res.format != nh.format())
+      err::die(err::msg() << "Can't compare files with different formats (" << res.format << ", " << nh.format() << ")");
+    if(res.key_len != nh.key_len())
+      err::die(err::msg() << "Can't compare hashes of different key lengths (" << res.key_len << ", " << nh.key_len() << ")");
+    if(res.max_reprobe_offset != nh.max_reprobe_offset())
+      err::die("Can't compare hashes with different reprobing strategies");
+    if(res.size != nh.size())
+      err::die(err::msg() << "Can't compare hash with different size (" << res.size << ", " << nh.size() << ")");
+    if(res.matrix != nh.matrix())
+      err::die("Can't compare hash with different hash function");
+  }
+
+  return res;
+}
+
+template<typename reader_type>
+void output_counts(cpp_array<file_info>& files) {
+  cpp_array<reader_type> readers(files.size());
+  typedef jellyfish::mer_heap::heap<mer_dna, reader_type> heap_type;
+  typedef typename heap_type::const_item_t heap_item;
+  heap_type heap(files.size());
+
+  // Prime heap
+  for(size_t i = 0; i < files.size(); ++i) {
+    readers.init(i, files[i].is, &files[i].header);
+    if(readers[i].next())
+      heap.push(readers[i]);
+  }
+
+  heap_item          head      = heap.head();
+  mer_dna            key;
+  const int          num_files = files.size();
+  const reader_type* base      = &readers[0];
+  uint64_t           counts[num_files];
+  while(heap.is_not_empty()) {
+    key = head->key_;
+    memset(counts, '\0', sizeof(uint64_t) * num_files);
+    do {
+      counts[head->it_ - base] = head->val_;
+      heap.pop();
+      if(head->it_->next())
+        heap.push(*head->it_);
+      head = heap.head();
+    } while(head->key_ == key && heap.is_not_empty());
+    std::cout << key;
+    for(int i = 0; i < num_files; ++i)
+      std::cout << " " << counts[i];
+    std::cout << "\n";
+  }
+}
+
+int main(int argc, char *argv[])
+{
+  // Check number of input files
+  if(argc < 3)
+    err::die(err::msg() << "Usage: " << argv[0] << " file1 file2 ...");
+
+  // Read the header of each input files and do sanity checks.
+  cpp_array<file_info> files(argc - 1);
+  common_info cinfo = read_headers(argc - 1, argv + 1, files);
+  mer_dna::k(cinfo.key_len / 2);
+
+  if(cinfo.format == binary_dumper::format)
+    output_counts<binary_reader>(files);
+  else if(cinfo.format == text_dumper::format)
+    output_counts<text_reader>(files);
+  else
+    err::die(err::msg() << "Format '" << cinfo.format << "' not supported\n");
+
+  return 0;
+}
diff --git a/examples/query_per_sequence/Makefile b/examples/query_per_sequence/Makefile
new file mode 100644
index 0000000..b9d824d
--- /dev/null
+++ b/examples/query_per_sequence/Makefile
@@ -0,0 +1,10 @@
+CC = g++
+CXXFLAGS = $(shell pkg-config --cflags jellyfish-2.0) -std=c++0x -Wall -O3
+LDFLAGS = $(shell pkg-config --libs jellyfish-2.0) -Wl,--rpath=$(shell pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L//g')
+
+all: query_per_sequence
+query_per_sequence: query_per_sequence.cc sequence_mers.hpp
+clean:
+	rm -f *.o query_per_sequence
+
+
diff --git a/examples/query_per_sequence/README b/examples/query_per_sequence/README
new file mode 100644
index 0000000..49af770
--- /dev/null
+++ b/examples/query_per_sequence/README
@@ -0,0 +1,18 @@
+What is it?
+===========
+
+Given a jellyfish database and one or more input fast[aq] files, it
+output for each sequence in the fast[aq] files the count in the
+database of each of the k-mers. The output format is fasta, where the
+header is copied from the input files and the content is a number for
+each of the k-mers. If the sequence has length n, there will be n-k+1
+numbers, corresponding in order to the n-k+1 k-mers in the sequence.
+
+For example:
+
+$ ./query_per_sequence db.jf sequence.fa
+>read1
+0 0 0 1 1 2 3 3 3 4 2
+>read2
+15 16 17 13 12 11 12 12 10 7 6
+...
diff --git a/examples/query_per_sequence/query_per_sequence.cc b/examples/query_per_sequence/query_per_sequence.cc
new file mode 100644
index 0000000..f6ba59f
--- /dev/null
+++ b/examples/query_per_sequence/query_per_sequence.cc
@@ -0,0 +1,86 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include "sequence_mers.hpp"
+
+namespace err = jellyfish::err;
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef jellyfish::whole_sequence_parser<jellyfish::stream_manager<char**> > sequence_parser;
+
+template<typename PathIterator, typename Database>
+void query_from_sequence(PathIterator file_begin, PathIterator file_end, const Database& db,
+                         bool canonical) {
+  jellyfish::stream_manager<PathIterator> streams(file_begin, file_end);
+  sequence_parser                         parser(4, 100, 1, streams);
+  sequence_mers                           mers(canonical);
+  const sequence_mers                     mers_end(canonical);
+
+  while(true) {
+    sequence_parser::job j(parser);
+    if(j.is_empty()) break;
+    for(size_t i = 0; i < j->nb_filled; ++i) {
+      std::cout << ">" << j->data[i].header << "\n";
+      mers = j->data[i].seq;
+      if(mers != mers_end) {
+        std::cout << db.check(*mers);
+        ++mers;
+      }
+      for( ; mers != mers_end; ++mers)
+        std::cout << " " << db.check(*mers);
+      std::cout << "\n";
+    }
+  }
+}
+
+int main(int argc, char *argv[])
+{
+  if(argc < 3)
+    err::die(err::msg() << "Usage: " << argv[0] << "db.jf file.fa [...]");
+
+  std::ifstream in(argv[1], std::ios::in|std::ios::binary);
+  jellyfish::file_header header(in);
+  if(!in.good())
+    err::die(err::msg() << "Failed to parse header of file '" << argv[1] << "'");
+  mer_dna::k(header.key_len() / 2);
+  if(header.format() == "bloomcounter") {
+    jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+    mer_dna_bloom_counter filter(header.size(), header.nb_hashes(), in, fns);
+    if(!in.good())
+      err::die("Bloom filter file is truncated");
+    in.close();
+    query_from_sequence(argv + 2, argv + argc, filter, header.canonical());
+  } else if(header.format() == binary_dumper::format) {
+    jellyfish::mapped_file binary_map(argv[1]);
+    binary_query bq(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+                    header.size() - 1, binary_map.length() - header.offset());
+    query_from_sequence(argv + 2, argv + argc, bq, header.canonical());
+  } else {
+    err::die(err::msg() << "Unsupported format '" << header.format() << "'. Must be a bloom counter or binary list.");
+  }
+
+  return 0;
+}
diff --git a/examples/query_per_sequence/sequence_mers.hpp b/examples/query_per_sequence/sequence_mers.hpp
new file mode 100644
index 0000000..4eb3a9a
--- /dev/null
+++ b/examples/query_per_sequence/sequence_mers.hpp
@@ -0,0 +1,99 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __SEQUENCE_MERS_H__
+#define __SEQUENCE_MERS_H__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+class sequence_mers : public std::iterator<std::input_iterator_tag, jellyfish::mer_dna> {
+public:
+  typedef jellyfish::mer_dna mer_type;
+
+private:
+  const char*  cseq_;
+  const char*  eseq_;
+  const bool   canonical_;
+  unsigned int filled_;
+  mer_type      m_;              // mer
+  mer_type      rcm_;            // reverse complement mer
+
+public:
+  explicit sequence_mers(bool canonical = false) :
+    cseq_(0), eseq_(0), canonical_(canonical), filled_(0)
+  { }
+
+  sequence_mers(const sequence_mers& rhs) :
+    cseq_(rhs.cseq_), eseq_(rhs.eseq_), canonical_(rhs.canonical_), filled_(rhs.filled_),
+    m_(rhs.m_), rcm_(rhs.rcm_)
+  { }
+
+  sequence_mers(sequence_mers&& rhs) :
+    cseq_(rhs.cseq_), eseq_(rhs.eseq_), canonical_(rhs.canonical_), filled_(rhs.filled_),
+    m_(std::move(rhs.m_)), rcm_(std::move(rcm_))
+  { }
+
+  void reset(const char* seq, const char* seqe) {
+    cseq_   = seq;
+    eseq_   = seqe;
+    filled_ = 0;
+    this->operator++();
+  }
+
+  sequence_mers& operator=(const std::string& seq) {
+    reset(seq.c_str(), seq.c_str() + seq.size());
+    return *this;
+  }
+
+  sequence_mers& operator=(const char* seq) {
+    reset(seq, seq + strlen(seq));
+    return *this;
+  }
+
+  bool operator==(const sequence_mers& rhs) const { return cseq_ == rhs.cseq_; }
+  bool operator!=(const sequence_mers& rhs) const { return cseq_ != rhs.cseq_; }
+
+  operator void*() const { return (void*)cseq_; }
+  const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+  const mer_type* operator->() const { return &this->operator*(); }
+  sequence_mers& operator++() {
+    if(cseq_ >= eseq_) {
+      cseq_ = eseq_ = 0;
+      return *this;
+    }
+
+    do {
+      int code = m_.code(*cseq_++);
+      if(code >= 0) {
+        m_.shift_left(code);
+        if(canonical_)
+          rcm_.shift_right(rcm_.complement(code));
+        filled_ = std::min(filled_ + 1, jellyfish::mer_dna::k());
+      } else
+        filled_ = 0;
+    } while(filled_ < jellyfish::mer_dna::k() && cseq_ < eseq_);
+
+    return *this;
+  }
+  sequence_mers operator++(int) {
+    sequence_mers res(*this);
+    ++*this;
+    return res;
+  }
+};
+
+#endif /* __SEQUENCE_MERS_H__ */
diff --git a/gtest.mk b/gtest.mk
index 007e84d..9ae1440 100755
--- a/gtest.mk
+++ b/gtest.mk
@@ -2,48 +2,17 @@
 # Gtest build.
 ##############################
 # Build rules for libraries.
-# check_LTLIBRARIES = libgtest.la libgtest_main.la
-check_LIBRARIES = libgtest.a libgtest_main.a
+check_LTLIBRARIES = libgtest.la libgtest_main.la
 
-libgtest_a_SOURCES = unit_tests/gtest/src/gtest-all.cc
-libgtest_main_a_SOURCES = unit_tests/gtest/src/gtest_main.cc
-libgtest_main_a_LIBADD = libgtest.a
-libgtest_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest	\
--I$(top_srcdir)/unit_tests/gtest/include
-libgtest_main_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest	\
--I$(top_srcdir)/unit_tests/gtest/include
+libgtest_la_SOURCES = unit_tests/gtest/src/gtest-all.cc
+libgtest_main_la_SOURCES = unit_tests/gtest/src/gtest_main.cc
+libgtest_main_la_LIBADD = libgtest.la
+libgtest_la_CXXFLAGS = -I$(top_srcdir)/unit_tests
+libgtest_main_la_CXXFLAGS = -I$(top_srcdir)/unit_tests
 
-# gtest source files that we don't compile directly.  They are
-# #included by gtest-all.cc.
-GTEST_SRC = unit_tests/gtest/src/gtest-death-test.cc	\
-	    unit_tests/gtest/src/gtest-filepath.cc	\
-	    unit_tests/gtest/src/gtest-internal-inl.h	\
-	    unit_tests/gtest/src/gtest-port.cc		\
-	    unit_tests/gtest/src/gtest-printers.cc	\
-	    unit_tests/gtest/src/gtest-test-part.cc	\
-	    unit_tests/gtest/src/gtest-typed-test.cc	\
-	    unit_tests/gtest/src/gtest.cc
+GTEST_SRC = unit_tests/gtest/src/gtest-all.cc	\
+	    unit_tests/gtest/src/gtest_main.cc	\
+	    unit_tests/gtest/gtest.h
 
 EXTRA_DIST += $(GTEST_SRC)
 
-# Headers, not installed
-GTEST_I = unit_tests/gtest/include/gtest
-noinst_HEADERS = $(GTEST_I)/gtest-death-test.h				\
-                 $(GTEST_I)/gtest-message.h				\
-                 $(GTEST_I)/gtest-param-test.h				\
-                 $(GTEST_I)/gtest-printers.h $(GTEST_I)/gtest-spi.h	\
-                 $(GTEST_I)/gtest-test-part.h				\
-                 $(GTEST_I)/gtest-typed-test.h $(GTEST_I)/gtest.h	\
-                 $(GTEST_I)/gtest_pred_impl.h $(GTEST_I)/gtest_prod.h	\
-                 $(GTEST_I)/internal/gtest-death-test-internal.h	\
-                 $(GTEST_I)/internal/gtest-filepath.h			\
-                 $(GTEST_I)/internal/gtest-internal.h			\
-                 $(GTEST_I)/internal/gtest-linked_ptr.h			\
-                 $(GTEST_I)/internal/gtest-param-util-generated.h	\
-                 $(GTEST_I)/internal/gtest-param-util.h			\
-                 $(GTEST_I)/internal/gtest-port.h			\
-                 $(GTEST_I)/internal/gtest-string.h			\
-                 $(GTEST_I)/internal/gtest-tuple.h			\
-                 $(GTEST_I)/internal/gtest-type-util.h
-
-
diff --git a/jellyfish/reversible_hash_function.hpp b/header-license
similarity index 82%
rename from jellyfish/reversible_hash_function.hpp
rename to header-license
index c6ad942..7e35220 100644
--- a/jellyfish/reversible_hash_function.hpp
+++ b/header-license
@@ -13,10 +13,3 @@
     You should have received a copy of the GNU General Public License
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
-
-#ifndef __JELLYFISH_REVERSIBLE_HASH_FUNCTION_HPP__
-#define __JELLYFISH_REVERSIBLE_HASH_FUNCTION_HPP__
-
-
-
-#endif // __REVERSIBLE_HASH_FUNCTION_HPP__
diff --git a/include/jellyfish/allocators_mmap.hpp b/include/jellyfish/allocators_mmap.hpp
new file mode 100644
index 0000000..041e9fd
--- /dev/null
+++ b/include/jellyfish/allocators_mmap.hpp
@@ -0,0 +1,78 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_ALLOCATORS_MMAP_HPP__
+#define __JELLYFISH_ALLOCATORS_MMAP_HPP__
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <algorithm>
+
+namespace allocators {
+class mmap {
+  void   *ptr_;
+  size_t  size_;
+
+public:
+  mmap() : ptr_(MAP_FAILED), size_(0) {}
+  explicit mmap(size_t _size) : ptr_(MAP_FAILED), size_(0) {
+    realloc(_size);
+  }
+  mmap(mmap&& rhs) : ptr_(rhs.ptr_), size_(rhs.size_) {
+    rhs.ptr_  = MAP_FAILED;
+    rhs.size_ = 0;
+  }
+  ~mmap() { free(); }
+
+  mmap& operator=(mmap&& rhs) {
+    swap(rhs);
+    return *this;
+  }
+
+  void swap(mmap& rhs) {
+    std::swap(ptr_, rhs.ptr_);
+    std::swap(size_, rhs.size_);
+  }
+
+  void *get_ptr() const { return ptr_ != MAP_FAILED ? ptr_ : NULL; }
+  size_t get_size() const { return size_; }
+  void free();
+  void *realloc(size_t new_size);
+  int lock() { return mlock(ptr_, size_); }
+  int unlock() { return munlock(ptr_, size_); }
+
+  // Return a a number of bytes which is a number of whole pages at
+  // least as large as size.
+  static size_t round_to_page(size_t _size);
+
+private:
+  static const int nb_threads = 4;
+  struct tinfo {
+    pthread_t  thid;
+    char      *start, *end;
+    size_t     pgsize;
+  };
+  void fast_zero();
+  static void * _fast_zero(void *_info);
+};
+inline void swap(mmap& a, mmap& b) { a.swap(b); }
+}
+
+#endif
diff --git a/include/jellyfish/atomic_bits_array.hpp b/include/jellyfish/atomic_bits_array.hpp
new file mode 100644
index 0000000..9b27165
--- /dev/null
+++ b/include/jellyfish/atomic_bits_array.hpp
@@ -0,0 +1,202 @@
+/* Quorum
+ * Copyright (C) 2012  Genome group at University of Maryland.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__
+#define __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__
+
+#include <stdexcept>
+#include <iterator>
+
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jellyfish {
+template<typename Value, typename T, typename Derived>
+class atomic_bits_array_base {
+  static const int       w_ = sizeof(T) * 8;
+  const int              bits_;
+  const size_t           size_;
+  const T                mask_;
+  const jflib::divisor64 d_;
+  size_t                 size_bytes_;
+  T*                     data_;
+  static atomic::gcc     atomic_;
+
+  friend class iterator;
+  class iterator : public std::iterator<std::input_iterator_tag, Value> {
+    friend class atomic_bits_array_base;
+    const atomic_bits_array_base& ary_;
+    T*                            word_;
+    T                             mask_;
+    int                           off_;
+
+    iterator(const atomic_bits_array_base& a, T* w, T m, int o) : ary_(a), word_(w), mask_(m), off_(o) { }
+  public:
+    bool operator==(const iterator& rhs) const { return word_ == rhs.word_ && off_ == rhs.off_; }
+    bool operator!=(const iterator& rhs) const { return word_ != rhs.word_ || off_ != rhs.off_; }
+    Value operator*() const { return static_cast<Value>((*word_ & mask_) >> off_); }
+    Value* operator->() const { return 0; }
+    iterator& operator++() {
+      off_ += ary_.bits_;
+      if(off_ + ary_.bits_ < w_) {
+        mask_ <<= ary_.bits_;
+      } else {
+        ++word_;
+        mask_ = ary_.mask_;
+        off_  = 0;
+      }
+      return *this;
+    }
+    iterator operator++(int) {
+      iterator res(*this);
+      ++*this;
+      return res;
+    }
+  };
+
+  class element_proxy {
+    T*        word_;
+    const T   mask_;
+    const int off_;
+    T         prev_word_;
+
+    Value get_val(T v) const {
+      return static_cast<Value>((v & mask_) >> off_);
+    }
+
+  public:
+    element_proxy(T* word, T mask, int off) :
+      word_(word), mask_(mask), off_(off)
+    { }
+
+    operator Value() const { return get_val(*word_); }
+    Value get() {
+      prev_word_ = *word_;
+      return get_val(prev_word_);
+    }
+
+    bool set(Value& nval) {
+      Value pval;
+      Value cval = get_val(prev_word_);
+      do {
+        pval = cval;
+        const T new_word    = (prev_word_ & ~mask_) | ((static_cast<T>(nval) << off_) & mask_);
+        const T actual_word = atomic_.cas(word_, prev_word_, new_word);
+        if(__builtin_expect(actual_word == prev_word_, 1))
+          return true;
+        prev_word_ = actual_word;
+        cval = get_val(prev_word_);
+      } while(pval == cval);
+      nval = cval;
+      return false;
+    }
+  };
+
+public:
+  atomic_bits_array_base(int bits, // Number of bits per entry
+                         size_t size) : // Number of entries
+    bits_(bits),
+    size_(size),
+    mask_((T)-1 >> (w_ - bits)), // mask of one entry at the LSB of a word
+    d_(w_ / bits),              // divisor of the number of entries per word
+    size_bytes_((size / d_ + (size % d_ != 0)) * sizeof(T)),
+    data_(static_cast<Derived*>(this)->alloc_data(size_bytes_))
+  {
+    static_assert(sizeof(T) >= sizeof(Value), "Container type T must have at least as many bits as value type");
+    if((size_t)bits > sizeof(Value) * 8)
+      throw std::runtime_error("The number of bits per entry must be less than the number of bits in the value type");
+    if(!data_)
+      throw std::runtime_error("Can't allocate memory for atomic_bits_array");
+  }
+
+  // Return the element at position pos. No check for out of bounds.
+  element_proxy operator[](size_t pos) {
+    uint64_t q, r;
+    d_.division(pos, q, r);
+    const int off = r * bits_;
+    return element_proxy(data_ + q, mask_ << off, off);
+  }
+  const element_proxy operator[](size_t pos) const {
+    uint64_t q, r;
+    d_.division(pos, q, r);
+    const int off = r * bits_;
+    return element_proxy(data_ + q, mask_ << off, off);
+  }
+  void write(std::ostream& os) const {
+    os.write((const char*)data_, size_bytes_);
+  }
+  size_t size_bytes() const { return size_bytes_; }
+  int bits() const { return bits_; }
+
+  iterator begin() const { return iterator(*this, data_, mask_, 0); }
+  iterator end() const {
+    uint64_t q, r;
+    d_.division(size_, q, r);
+    const int off = r * bits_;
+    return iterator(*this, data_ + q, mask_ << off, off);
+  }
+};
+
+template<typename Value, typename T = uint64_t>
+class atomic_bits_array :
+    protected allocators::mmap,
+    public atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> >
+{
+  typedef atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> > super;
+  friend class atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> >;
+public:
+  atomic_bits_array(int bits, size_t size) :
+    allocators::mmap(),
+    super(bits, size)
+  { }
+
+protected:
+  T* alloc_data(size_t s) {
+    allocators::mmap::realloc(s);
+    return (T*)allocators::mmap::get_ptr();
+  }
+};
+
+struct mem_info {
+  void*  ptr_;
+  size_t bytes_;
+  mem_info(void* ptr, size_t bytes) : ptr_(ptr), bytes_(bytes) { }
+};
+template<typename Value, typename T = uint64_t>
+class atomic_bits_array_raw :
+    protected mem_info,
+    public atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> >
+{
+  typedef atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> > super;
+  friend class atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> >;
+public:
+  atomic_bits_array_raw(void* ptr, size_t bytes, int bits, size_t size) :
+    mem_info(ptr, bytes),
+    super(bits, size)
+  { }
+
+protected:
+  T* alloc_data(size_t s) {
+    assert(bytes_ == s);
+    return (T*)ptr_;
+  }
+};
+
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__ */
diff --git a/include/jellyfish/atomic_field.hpp b/include/jellyfish/atomic_field.hpp
new file mode 100644
index 0000000..5fcc297
--- /dev/null
+++ b/include/jellyfish/atomic_field.hpp
@@ -0,0 +1,157 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_ATOMIC_FIELD_HPP__
+#define __JELLYFISH_ATOMIC_FIELD_HPP__
+
+#include <jellyfish/compare_and_swap.hpp>
+
+namespace jflib {
+  /* Define a_get, a_set and a_update
+   */
+  template <typename T>
+  T a_load(T *x) { return *(volatile T*)x; }
+  template<typename T, typename U>
+  T a_store(T* lhs, const U& rhs) {
+    return (*(volatile T*)lhs = rhs);
+  }
+  template<typename T>
+  T* a_load_ptr(T* x) { return a_load((T**)&x); }
+  template<typename T, typename U>
+  T* a_store_ptr(T* x, const U& rhs) { return a_store((T**)&x, rhs); }
+
+  /** Set value to f(value).
+   * @return f(value)
+   *
+   * The function f may be called more than once. Be careful about
+   * side effects (probably better if f has no side effects).
+   */
+  template<typename T>
+  T a_update(T* x, T (*f)(T)) {
+    T ov(a_load(x));
+    T nv(f(ov));
+    while(!cas(x, ov, nv, &ov)) { nv = f(ov); }
+    return nv;
+  }
+  template<typename T>
+  T a_load(T &x) { return a_load(&x); }
+  template<typename T, typename U>
+  T a_store(T &lhs, const U& rhs) { return a_store(&lhs, rhs); }
+
+  /* POD with atomic operators.
+   */
+  template<typename T>
+  struct atomic_pod {
+    typedef T type;
+    T x;
+  };
+
+#define AF_COMPOUND_ASSIGN(op)                                          \
+  template<typename T, typename U>                                      \
+  T operator op ## = (atomic_pod<T> &x, const U &rhs) { \
+    T ov(a_load(&x.x));                                 \
+    T nv(ov op rhs);                                                    \
+    while(!cas(&x.x, ov, nv, &ov)) { nv = ov op rhs; }                  \
+    return nv;                                                          \
+  }
+  AF_COMPOUND_ASSIGN(+);
+  AF_COMPOUND_ASSIGN(-);
+  AF_COMPOUND_ASSIGN(*);
+  AF_COMPOUND_ASSIGN(/);
+  AF_COMPOUND_ASSIGN(%);
+  AF_COMPOUND_ASSIGN(>>);
+  AF_COMPOUND_ASSIGN(<<);
+  AF_COMPOUND_ASSIGN(&);
+  AF_COMPOUND_ASSIGN(|);
+  AF_COMPOUND_ASSIGN(^);
+
+  /** Set value to f(value).
+   * @return f(value)
+   *
+   * The function f may be called more than once. Be careful about
+   * side effects (probably better if f has no side effects).
+   */
+  template<typename T>
+  T a_load(atomic_pod<T> &x) { return a_load(&x.x); }
+  template<typename T, typename U>
+  T a_store(atomic_pod<T> &lhs, const U &rhs) {
+    return a_store(&lhs.x, rhs);
+  }
+  template<typename T>
+  T a_update(atomic_pod<T> &x, T (*f)(T)) {
+    return a_update(&x.x, f);
+  }
+
+  /* Similar to an atomic_pod, but not a POD, because of its
+     constructor and other member functions. Easier to use.
+   */
+  template<typename T>
+  class atomic_field : public atomic_pod<T> {
+  public:
+    typedef typename atomic_pod<T>::type type;
+    explicit atomic_field() { }
+    explicit atomic_field(const T& v) { a_store(&this->x, v); }
+    atomic_field& operator=(const atomic_pod<T>& rhs) { a_store(&this->x, rhs.x); return *this; }
+    atomic_field& operator=(const T& v) { a_store(&this->x, v); return *this; }
+    operator T() const { return a_load(&this->x); }
+    T update(T (*f)(T)) { return a_update(&this->x, f); }
+  };
+
+  template<typename T>
+  T a_load(atomic_field<T> &x) { return a_load((atomic_pod<T>&)x); }
+  template<typename T, typename U>
+  atomic_field<T>& a_store(atomic_field<T>& lhs, const U& rhs) { a_store((atomic_pod<T>&)lhs, rhs); return lhs; }
+  template<typename T>
+  T a_update(atomic_field<T>& x, T (*f)(T)) { return a_update((atomic_pod<T>&)x, f); }
+
+
+  /* Allows atomic operation on any (already allocated) data.
+   */
+  template<typename T>
+  class atomic_ref {
+    T *ptr;
+  public:
+    typedef T type;
+    explicit atomic_ref(T& x) : ptr(&x) { }
+    explicit atomic_ref(T* x) : ptr(x) { }
+    atomic_ref& operator=(const T& v) { a_store(ptr, v); return *this; }
+    operator T() const { assert(ptr != 0); return a_load(ptr); }
+    T* operator&() const { return ptr; }
+  };
+
+#define AR_COMPOUND_ASSIGN(op)                          \
+  template<typename T, typename U>                      \
+  T operator op ## = (atomic_ref<T> &x, const U &rhs) { \
+    T ov(x);                                            \
+    T nv(ov op rhs);                                    \
+    while(!cas(&x, ov, nv, &ov)) { nv = ov op rhs; }    \
+    return nv;                                          \
+  }
+  AR_COMPOUND_ASSIGN(+);
+  AR_COMPOUND_ASSIGN(-);
+  AR_COMPOUND_ASSIGN(*);
+  AR_COMPOUND_ASSIGN(/);
+  AR_COMPOUND_ASSIGN(%);
+  AR_COMPOUND_ASSIGN(>>);
+  AR_COMPOUND_ASSIGN(<<);
+  AR_COMPOUND_ASSIGN(&);
+  AR_COMPOUND_ASSIGN(|);
+  AR_COMPOUND_ASSIGN(^);
+}
+
+
+#endif /* __JELLYFISH_ATOMIC_FIELD_HPP__ */
diff --git a/jellyfish/atomic_gcc.hpp b/include/jellyfish/atomic_gcc.hpp
similarity index 97%
rename from jellyfish/atomic_gcc.hpp
rename to include/jellyfish/atomic_gcc.hpp
index aafa968..f888dd5 100644
--- a/jellyfish/atomic_gcc.hpp
+++ b/include/jellyfish/atomic_gcc.hpp
@@ -47,7 +47,7 @@ namespace atomic
       T ncount = *ptr, count;
       do {
 	count = ncount;
-	ncount = cas((T *)ptr, count, count + x);
+	ncount = cas((T *)ptr, count, (T)(count + x));
       } while(ncount != count);
       return count;
     }
diff --git a/jellyfish/backtrace.hpp b/include/jellyfish/backtrace.hpp
similarity index 100%
rename from jellyfish/backtrace.hpp
rename to include/jellyfish/backtrace.hpp
diff --git a/include/jellyfish/binary_dumper.hpp b/include/jellyfish/binary_dumper.hpp
new file mode 100644
index 0000000..09cb610
--- /dev/null
+++ b/include/jellyfish/binary_dumper.hpp
@@ -0,0 +1,224 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BINARY_DUMPER_HPP__
+#define __JELLYFISH_BINARY_DUMPER_HPP__
+
+#include <iostream>
+#include <cmath>
+
+#include <jellyfish/sorted_dumper.hpp>
+
+namespace jellyfish {
+template<typename Key, typename Val>
+class binary_writer {
+  int val_len_;
+  Val max_val_;
+  int key_len_;                 // length of output key field in bytes
+
+public:
+  binary_writer(int val_len,   // length of value field in bytes
+                int key_len) : // length of key field in bits
+    val_len_(val_len),
+    max_val_(((Val)1 << (8 * val_len)) - 1),
+    key_len_(key_len / 8 + (key_len % 8 != 0))
+  { }
+
+  int val_len() const { return val_len_; }
+  Val max_val() const { return max_val_; }
+  int key_len() const { return key_len_; }
+
+  void write(std::ostream& out, const Key& key, const Val val) {
+    out.write((const char*)key.data(), key_len_);
+    Val v = std::min(max_val_, val);
+    out.write((const char*)&v, val_len_);
+  }
+};
+
+/// Dump a hash array in sorted binary format. The key/value pairs are
+/// written in a sorted list according to the hash function order. The
+/// k-mer and count are written in binary, byte aligned.
+template<typename storage_t>
+class binary_dumper : public sorted_dumper<binary_dumper<storage_t>, storage_t> {
+  typedef sorted_dumper<binary_dumper<storage_t>, storage_t> super;
+  binary_writer<typename super::key_type, uint64_t> writer;
+
+public:
+  static const char* format;
+
+  binary_dumper(int val_len, // length of value field in bytes
+                int key_len, // length of key field in bits
+                int nb_threads, const char* file_prefix,
+                file_header* header = 0) :
+    super(nb_threads, file_prefix, header),
+    writer(val_len, key_len)
+  { }
+
+  virtual void _dump(storage_t* ary) {
+    if(super::header_) {
+      super::header_->update_from_ary(*ary);
+      super::header_->format(format);
+      super::header_->counter_len(writer.val_len());
+    }
+    super::_dump(ary);
+  }
+
+  void write_key_value_pair(std::ostream& out, typename super::heap_item item) {
+    writer.write(out, item->key_, item->val_);
+  }
+};
+template<typename storage_t>
+const char* jellyfish::binary_dumper<storage_t>::format = "binary/sorted";
+
+/// Reader of the format written by binary_dumper. Behaves like an
+/// iterator (has next() method which behaves similarly to the next()
+/// method of the hash array).
+/// The header should be of format binary/sorted, but no check is made.
+template<typename Key, typename Val>
+class binary_reader {
+  std::istream&                 is_;
+  const int                     val_len_;
+  Key                           key_;
+  Val                           val_;
+  const RectangularBinaryMatrix m_;
+  const size_t                  size_mask_;
+
+public:
+  binary_reader(std::istream& is, // stream containing data (past any header)
+                file_header* header) :  // header which contains counter_len, matrix, size and key_len
+    is_(is), val_len_(header->counter_len()), key_(header->key_len() / 2),
+    m_(header->matrix()),
+    size_mask_(header->size() - 1)
+  { }
+
+  const Key& key() const { return key_; }
+  const Val& val() const { return val_; }
+  size_t pos() const { return m_.times(key_) & size_mask_; }
+
+  bool next() {
+    key_.template read<1>(is_);
+    val_ = 0;
+    is_.read((char*)&val_, val_len_);
+    return is_.good();
+  }
+};
+
+template<typename Key, typename Val>
+class binary_query_base {
+  const char* const             data_;
+  const unsigned int            val_len_; // In bytes
+  const unsigned int            key_len_; // In bytes
+  const RectangularBinaryMatrix m_;
+  const size_t                  mask_;
+  const size_t                  record_len_;
+  const size_t                  last_id_;
+  Key                           first_key_, last_key_;
+  mutable Key                   mid_key_;
+  uint64_t                      first_pos_, last_pos_;
+
+public:
+  // key_len passed in bits
+  binary_query_base(const char* data, unsigned int key_len, unsigned int val_len, const RectangularBinaryMatrix& m, size_t mask,
+                    size_t size) :
+    data_(data),
+    val_len_(val_len),
+    key_len_(key_len / 8 + (key_len % 8 != 0)),
+    m_(m),
+    mask_(mask),
+    record_len_(val_len + key_len_),
+    last_id_(size / record_len_),
+    first_key_(key_len / 2),
+    last_key_(key_len / 2),
+    mid_key_(key_len / 2)
+  {
+    if(size % record_len_ != 0)
+      throw std::length_error(err::msg() << "Size of database (" << size << ") must be a multiple of the length of a record ("
+                              << record_len_ << ")");
+    key_at(0, first_key_);
+    first_pos_ = key_pos(first_key_);
+    key_at(last_id_ - 1, last_key_);
+    last_pos_  = key_pos(last_key_);
+  }
+
+  bool val_id(const Key& key,  Val* res, uint64_t* id) const {
+    if(last_id_ == 0) return false;
+    uint64_t first     = 0;
+    uint64_t last      = last_id_;
+    uint64_t first_pos = first_pos_;
+    uint64_t last_pos  = last_pos_;
+    const uint64_t pos = key_pos(key);
+    uint64_t cid       = 0;
+    if(key == first_key_) goto found;
+    cid = last_id_ - 1;
+    if(key == last_key_) goto found;
+    if(pos < first_pos_ || pos > last_pos_) return false;
+
+    // First a guided binary search
+    for(uint64_t diff = last - first; diff >= 8; diff = last - first) {
+      cid = first + lrint(diff * ((double)(pos - first_pos) / (double)(last_pos - first_pos)));
+      cid = std::max(first + 1, cid);
+      cid = std::min(cid, last - 1);
+      key_at(cid, mid_key_);
+      if(key == mid_key_) goto found;
+      uint64_t mid_pos = key_pos(mid_key_);
+      if(mid_pos > pos || (mid_pos == pos && mid_key_ > key)) {
+        last     = cid;
+        last_pos = mid_pos;
+      } else {
+        first     = cid;
+        first_pos = mid_pos;
+      }
+    }
+
+    // Then a linear search (avoids matrix computation)
+    for(cid = first + 1; cid < last; ++cid) {
+      key_at(cid, mid_key_);
+      if(key == mid_key_) goto found;
+    }
+    return false;
+
+  found:
+    val_at(cid, res);
+    *id = cid;
+    return true;
+  }
+
+  Val operator[](const Key& key) const {
+    Val res;
+    uint64_t id;
+    if(!val_id(key, &res, &id))
+      return 0;
+    return res;
+  }
+
+  inline Val check(const Key& key) const { return (*this)[key]; }
+
+protected:
+  void key_at(size_t id, Key& key) const {
+    memcpy(key.data__(), data_ + id * record_len_, key_len_);
+    key.clean_msw();
+  }
+  void val_at(size_t id, Val* val) const {
+    *val = 0;
+    memcpy(val, data_ + id * record_len_ + key_len_, val_len_);
+  }
+  uint64_t key_pos(const Key& key) const {
+    return m_.times(key) & mask_;
+  }
+};
+}
+
+#endif /* __JELLYFISH_BINARY_DUMPER_HPP__ */
diff --git a/include/jellyfish/bloom_common.hpp b/include/jellyfish/bloom_common.hpp
new file mode 100644
index 0000000..cc3804a
--- /dev/null
+++ b/include/jellyfish/bloom_common.hpp
@@ -0,0 +1,129 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BLOOM_COMMON_HPP__
+#define __JELLYFISH_BLOOM_COMMON_HPP__
+
+#include <math.h>
+#include <jellyfish/divisor.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+
+namespace jellyfish {
+template<typename Key>
+struct hash_pair { };
+
+template<typename Key, typename Derived, typename HashPair = hash_pair<Key> >
+class bloom_base {
+protected:
+  struct prefetch_info {
+    size_t         boff;
+    unsigned char* pos;
+  };
+
+  // The number of bits in the structure, previously known as m_, is
+  // know stored as d_.d()
+  const jflib::divisor64 d_;
+  const unsigned long    k_;
+  unsigned char * const  data_;
+  HashPair               hash_fns_;
+
+public:
+  typedef Key key_type;
+
+  bloom_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+    d_(m), k_(k), data_(ptr), hash_fns_(fns)
+  { }
+
+  bloom_base(const bloom_base& rhs) = delete;
+  bloom_base(bloom_base&& rhs) :
+    d_(rhs.d_), k_(rhs.k_), data_(rhs.data_), hash_fns_(std::move(rhs.hash_fns_))
+  { }
+
+
+  void write_bits(std::ostream& out) {
+    out.write((char*)data_, static_cast<Derived*>(this)->nb_bytes());
+  }
+
+  // Number of hash functions
+  unsigned long k() const { return k_; }
+  // Size of bit vector
+  size_t m() const { return d_.d(); }
+  const HashPair& hash_functions() const { return hash_fns_; }
+
+  static const double LOG2;
+  static const double LOG2_SQ;
+
+  static size_t opt_m(const double fp, const size_t n) {
+    return n * (size_t)lrint(-log(fp) / LOG2_SQ);
+  }
+  static unsigned long opt_k(const double fp) {
+    return lrint(-log(fp) / LOG2);
+  }
+
+  // Insert key k. Returns previous value of k
+  unsigned int insert(const Key &k) {
+    uint64_t hashes[2];
+    hash_fns_(k, hashes);
+    return static_cast<Derived*>(this)->insert__(hashes);
+  }
+
+  unsigned int check(const Key &k) const {
+    uint64_t hashes[2];
+    hash_fns_(k, hashes);
+    return static_cast<const Derived*>(this)->check__(hashes);
+  }
+
+
+
+  // Limited std::map interface compatibility
+  class element_proxy {
+    Derived&   bc_;
+    const Key& k_;
+
+  public:
+    element_proxy(Derived& bc, const Key& k) : bc_(bc), k_(k) { }
+
+    unsigned int operator++() {
+      unsigned int res = bc_.insert(k_);
+      return res == 0 ? 1 : 2;
+    }
+
+    unsigned int operator++(int) { return bc_.insert(k_); }
+    unsigned int operator*() const { return bc_.check(k_); }
+    operator unsigned int() const { return bc_.check(k_); }
+  };
+
+  class const_element_proxy {
+    const Derived& bc_;
+    const Key&     k_;
+
+  public:
+    const_element_proxy(const Derived& bc, const Key& k) : bc_(bc), k_(k) { }
+
+    unsigned int operator*() const { return bc_.check(k_); }
+    operator unsigned int() const { return bc_.check(k_); }
+  };
+  element_proxy operator[](const Key& k) { return element_proxy(*static_cast<Derived*>(this), k); }
+  const_element_proxy operator[](const Key& k) const { return const_element_proxy(*static_cast<const Derived*>(this), k); }
+};
+template<typename Key, typename Derived, typename HashPair>
+const double bloom_base<Key, Derived, HashPair>::LOG2 = 0.6931471805599453;
+template<typename Key, typename Derived, typename HashPair>
+const double bloom_base<Key, Derived, HashPair>::LOG2_SQ = 0.4804530139182014;
+
+}
+
+#endif /* __JELLYFISH_BLOOM_COMMON_HPP__ */
diff --git a/include/jellyfish/bloom_counter2.hpp b/include/jellyfish/bloom_counter2.hpp
new file mode 100644
index 0000000..71a503a
--- /dev/null
+++ b/include/jellyfish/bloom_counter2.hpp
@@ -0,0 +1,221 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __BLOOM_COUNTER2_HPP__
+#define __BLOOM_COUNTER2_HPP__
+
+#include <assert.h>
+#include <math.h>
+#include <limits.h>
+#include <jellyfish/bloom_common.hpp>
+#include <jellyfish/mapped_file.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/divisor.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/atomic_field.hpp>
+
+#include <jellyfish/err.hpp>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jellyfish {
+/* Bloom counter with 3 values: 0, 1 or 2. It is thread safe and lock free.
+ */
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_counter2_base : public bloom_base<Key, bloom_counter2_base<Key, HashPair, atomic_t>, HashPair> {
+  typedef bloom_base<Key, bloom_counter2_base<Key, HashPair, atomic_t>, HashPair> super;
+
+  atomic_t atomic_;
+
+
+protected:
+  static size_t nb_bytes__(size_t l) {
+    return l / 5 + (l % 5 != 0);
+  }
+
+public:
+  bloom_counter2_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+    super(m, k, ptr, fns)
+  { }
+  bloom_counter2_base(bloom_counter2_base&& rhs) :
+    super(std::move(rhs))
+  { }
+  size_t nb_bytes() const {
+    return nb_bytes__(super::d_.d());
+  }
+
+  // Insert key with given hashes
+  unsigned int insert__(const uint64_t* hashes) {
+    // Prefetch memory locations
+    static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+    typename super::prefetch_info pinfo[super::k_];
+    const size_t base = super::d_.remainder(hashes[0]);
+    const size_t inc  = super::d_.remainder(hashes[1]);
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      const size_t p   = super::d_.remainder(base + i * inc);
+      const size_t off = p / 5;
+      pinfo[i].boff    = p % 5;
+      pinfo[i].pos     = super::data_ + off;
+      //      prefetch_write_no(pinfo[i].pos);
+      __builtin_prefetch(pinfo[i].pos, 1, 0);
+    }
+
+    // Insert element
+    unsigned char res = 2;
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      size_t        boff = pinfo[i].boff;
+      unsigned char v    = jflib::a_load(pinfo[i].pos);
+
+      while(true) {
+        unsigned char w = v;
+        switch(boff) {
+        case 0:          break;
+        case 1: w /= 3;  break;
+        case 2: w /= 9;  break;
+        case 3: w /= 27; break;
+        case 4: w /= 81; break;
+        }
+        w = w % 3;
+        if(w == 2) break;
+        unsigned char nv = v;
+
+        switch(boff) {
+        case 0: nv += 1;  break;
+        case 1: nv += 3;  break;
+        case 2: nv += 9;  break;
+        case 3: nv += 27; break;
+        case 4: nv += 81; break;
+        }
+        unsigned char cv = atomic_.cas(pinfo[i].pos, v, nv);
+        if(cv == v) {
+          if(w < res)
+            res = w;
+          break;
+        }
+        v = cv;
+      }
+    }
+    return res;
+  }
+
+  unsigned int check__(uint64_t *hashes) const {
+    // Prefetch memory locations
+    static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+    typename super::prefetch_info pinfo[super::k_];
+    const size_t base = super::d_.remainder(hashes[0]);
+    const size_t inc  = super::d_.remainder(hashes[1]);
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      const size_t p   = super::d_.remainder(base + i * inc);
+      const size_t off = p / 5;
+      pinfo[i].boff    = p % 5;
+      pinfo[i].pos     = super::data_ + off;
+      //      prefetch_read_no(pinfo[i].pos);
+      __builtin_prefetch(pinfo[i].pos, 0, 0);
+    }
+
+    // Check element
+    unsigned char res = 2;
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      size_t        boff = pinfo[i].boff;
+      unsigned char w    = jflib::a_load(pinfo[i].pos);
+
+      switch(boff) {
+      case 0:          break;
+      case 1: w /= 3;  break;
+      case 2: w /= 9;  break;
+      case 3: w /= 27; break;
+      case 4: w /= 81; break;
+      }
+      w = w % 3;
+      if(w < res)
+        res = w;
+    }
+    return res;
+  }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc,
+         typename mem_block_t = allocators::mmap>
+class bloom_counter2:
+    protected mem_block_t,
+    public bloom_counter2_base<Key, HashPair, atomic_t>
+{
+  typedef bloom_counter2_base<Key, HashPair, atomic_t> super;
+
+public:
+  typedef typename super::key_type key_type;
+
+  bloom_counter2(const double fp, const size_t n, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(super::opt_m(fp, n))),
+    super(super::opt_m(fp, n), super::opt_k(fp), (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(super::opt_m(fp, n))
+                               << " bytes of memory for bloom_counter");
+  }
+
+  bloom_counter2(size_t m, unsigned long k, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(m)),
+    super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_counter");
+  }
+
+  bloom_counter2(size_t m, unsigned long k, std::istream& is, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(m)),
+    super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_counter");
+
+    is.read((char*)mem_block_t::get_ptr(), mem_block_t::get_size());
+  }
+
+  bloom_counter2(const bloom_counter2& rhs) = delete;
+  bloom_counter2(bloom_counter2&& rhs) :
+    mem_block_t(std::move(rhs)),
+    super(std::move(rhs))
+  { }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_counter2_file :
+    protected mapped_file,
+    public bloom_counter2_base<Key, HashPair, atomic_t>
+{
+  typedef bloom_counter2_base<Key, HashPair, atomic_t> super;
+public:
+  typedef typename super::key_type key_type;
+
+  bloom_counter2_file(size_t m, unsigned long k, const char* path, const HashPair& fns = HashPair(), off_t offset = 0) :
+    mapped_file(path),
+    super(m, k, (unsigned char*)mapped_file::base() + offset, fns)
+  { }
+
+  bloom_counter2_file(const bloom_counter2_file& rhs) = delete;
+  bloom_counter2_file(bloom_counter2_file&& rhs) :
+    mapped_file(std::move(rhs)),
+    super(std::move(rhs))
+  { }
+};
+
+} // namespace jellyfish {
+
+#endif // __BLOOM_COUNTER2_HPP__
diff --git a/include/jellyfish/bloom_filter.hpp b/include/jellyfish/bloom_filter.hpp
new file mode 100644
index 0000000..4d3d7c8
--- /dev/null
+++ b/include/jellyfish/bloom_filter.hpp
@@ -0,0 +1,164 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BLOOM_FILTER_HPP__
+#define __JELLYFISH_BLOOM_FILTER_HPP__
+
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/bloom_common.hpp>
+
+namespace jellyfish {
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_filter_base :
+    public bloom_base<Key, bloom_filter_base<Key, HashPair>, HashPair>
+{
+  typedef bloom_base<Key, bloom_filter_base<Key, HashPair>, HashPair> super;
+
+protected:
+  static size_t nb_bytes__(size_t l) {
+    return l / 8 + (l % 8 != 0);
+  }
+
+public:
+  bloom_filter_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+    super(m, k, ptr, fns)
+  { }
+
+  bloom_filter_base(bloom_filter_base&& rhs) :
+  super(std::move(rhs))
+  { }
+
+  size_t nb_bytes() const {
+    return nb_bytes__(super::d_.d());
+  }
+
+  // Insert key with given hashes
+  unsigned int insert__(const uint64_t *hashes) {
+    // Prefetch memory locations
+    // This static_assert make clang++ happy...
+    static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+
+    typename super::prefetch_info pinfo[super::k_];
+    const size_t base    = super::d_.remainder(hashes[0]);
+    const size_t inc     = super::d_.remainder(hashes[1]);
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      const size_t pos   = super::d_.remainder(base + i * inc);
+      const size_t elt_i = pos / 8;
+      pinfo[i].boff      = pos % 8;
+      pinfo[i].pos       = super::data_ + elt_i;
+      __builtin_prefetch(pinfo[i].pos, 1, 0);
+    }
+
+    // Check if element present
+    bool present = true;
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      const char mask = (char)1 << pinfo[i].boff;
+      const char prev = __sync_fetch_and_or(pinfo[i].pos, mask);
+      present         = present && (prev & mask);
+    }
+
+    return present;
+  }
+
+  // Compute hashes of key k
+  void hash(const Key &k, uint64_t *hashes) const { hash_fns_(k, hashes); }
+
+  unsigned int check__(const uint64_t *hashes) const {
+    // Prefetch memory locations
+    typename super::prefetch_info pinfo[super::k_];
+    const size_t base    = super::d_.remainder(hashes[0]);
+    const size_t inc     = super::d_.remainder(hashes[1]);
+    for(unsigned long i = 0; i < super::k_; ++i) {
+      const size_t pos   = super::d_.remainder(base + i * inc);
+      const size_t elt_i = pos / 8;
+      pinfo[i].boff      = pos % 8;
+      pinfo[i].pos       = super::data_ + elt_i;
+      __builtin_prefetch(pinfo[i].pos, 0, 0);
+    }
+
+    for(unsigned long i = 0; i < super::k_; ++i)
+      if(!(jflib::a_load(pinfo[i].pos) & ((char)1 << pinfo[i].boff)))
+        return 0;
+    return 1;
+  }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc,
+         typename mem_block_t = allocators::mmap>
+class bloom_filter :
+  protected mem_block_t,
+  public bloom_filter_base<Key, HashPair, atomic_t>
+{
+  typedef bloom_filter_base<Key, HashPair, atomic_t> super;
+public:
+  bloom_filter(double fp, size_t n, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(super::opt_m(fp, n))),
+    super(super::opt_m(fp, n), super::opt_k(fp), (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(super::opt_m(fp, n))
+                               << " bytes of memory for bloom_filter");
+  }
+
+  bloom_filter(size_t m, unsigned long k, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(m)),
+    super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_filter");
+  }
+
+  bloom_filter(size_t m, unsigned long k, std::istream& is, const HashPair& fns = HashPair()) :
+    mem_block_t(super::nb_bytes__(m)),
+    super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+  {
+    if(!mem_block_t::get_ptr())
+      throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_filter");
+
+    is.read((char*)mem_block_t::get_ptr(), mem_block_t::get_size());
+  }
+
+  bloom_filter(bloom_filter&& rhs) :
+    mem_block_t(std::move(rhs)),
+    super(std::move(rhs))
+  { }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_filter_file :
+    protected mapped_file,
+    public bloom_filter_base<Key, HashPair, atomic_t>
+{
+  typedef bloom_filter_base<Key, HashPair, atomic_t> super;
+public:
+  typedef typename super::key_type key_type;
+
+  bloom_filter_file(size_t m, unsigned long k, const char* path, const HashPair& fns = HashPair(), off_t offset = 0) :
+    mapped_file(path),
+    super(m, k, (unsigned char*)mapped_file::base() + offset, fns)
+  { }
+
+  bloom_filter_file(const bloom_filter_file& rhs) = delete;
+  bloom_filter_file(bloom_filter_file&& rhs) :
+    mapped_file(std::move(rhs)),
+    super(std::move(rhs))
+  { }
+};
+
+}
+
+#endif /* __JELLYFISH_BLOOM_FILTER_HPP__ */
diff --git a/include/jellyfish/circular_buffer.hpp b/include/jellyfish/circular_buffer.hpp
new file mode 100644
index 0000000..a1fcd3c
--- /dev/null
+++ b/include/jellyfish/circular_buffer.hpp
@@ -0,0 +1,200 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_CIRCULAR_BUFFER_HPP__
+#define __JELLYFISH_CIRCULAR_BUFFER_HPP__
+
+#include <limits>
+
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/atomic_field.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jflib {
+  template<typename T, unsigned int n, T g = ((T)1 << n) - 1>
+  class basic_circular_buffer {
+    static const unsigned int m = std::numeric_limits<T>::digits - n;
+    struct splitT {
+      T id:m;
+      T val:n;
+    };
+    union elt {
+      T      binary;
+      splitT split;
+    };
+    //    size_t  _size;
+    divisor64  _size;
+    T         *_buffer;
+    size_t     _head;
+    size_t     _tail;
+    bool       _closed;
+
+  public:
+    typedef T value_type;
+    static const T guard = g;
+
+    basic_circular_buffer(size_t size) :
+    _size(size+1), _buffer(new T[_size.d()]),  _head(0), _tail(0), _closed(false)
+    {
+      elt init;
+      init.split.id  = 0;
+      init.split.val = guard;
+      for(size_t i = 0; i < _size.d(); ++i)
+        _buffer[i] = init.binary;
+    }
+    virtual ~basic_circular_buffer() {
+      if(_buffer)
+        delete [] _buffer;
+    }
+
+    /** Enqueue an element.
+     * @return false if the FIFO is full.
+     */
+    bool enqueue(const T &v);
+    /** Enqueue an element, optimization. No check is made that the
+     * FIFO is full. Undetermined behavior if an element is inserted
+     * in a full FIFO.
+     */
+    void enqueue_no_check(const T &v);
+    /** Dequeue an element.
+     * @return 0 if the FIFO is empty.
+     */
+    T dequeue();
+    bool is_closed() const { return a_load(_closed); }
+    void close() { a_store(_closed, true); }
+
+    /// Return capacity of circular buffer
+    size_t size() { return _size.d(); }
+    /// Return the number of element currently in circular buffer
+    size_t fill() {
+      size_t head, tail;
+      size_t nhead = a_load(_head);
+      do {
+        head = nhead;
+        tail = a_load(_tail);
+      } while(head != (nhead = a_load(_head)));
+
+      return head >= tail ? head - tail : head + _size.d() - tail;
+    }
+  };
+
+  template<typename T, T g = (T)-1>
+  class circular_buffer : public basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g> {
+  public:
+    circular_buffer(size_t size) :
+      basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>(size) { }
+    virtual ~circular_buffer() { }
+
+    bool enqueue(const T &v) {
+      return basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>::enqueue((uint64_t)v);
+    }
+    T dequeue() {
+      return basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>::dequeue();
+    }
+  };
+}
+
+template<typename T, unsigned int n, T guard>
+bool jflib::basic_circular_buffer<T,n,guard>::enqueue(const T &v) {
+  bool done = false;
+
+  size_t chead = a_load(_head);
+  while(!done) {
+    size_t ctail = a_load(_tail);
+    elt celt;
+    celt.binary = a_load(_buffer[chead % _size]);
+    size_t achead = a_load(_head);
+    if(achead != chead) {
+      chead = achead;
+      continue;
+    }
+    size_t nhead = chead + 1;
+    if(nhead % _size == ctail % _size)
+      return false;
+    if(celt.split.val == guard) {
+      // entry is empty
+      elt nelt;
+      nelt.split.id  = celt.split.id + 1;
+      nelt.split.val = v;
+      done = cas(&_buffer[chead % _size], celt.binary, nelt.binary);
+      // done == true <=> sucessfully written entry
+    }
+    cas(&_head, chead, nhead, &chead);
+  }
+
+  return true;
+}
+
+template<typename T, unsigned int n, T guard>
+void jflib::basic_circular_buffer<T,n,guard>::enqueue_no_check(const T &v) {
+  bool done = false;
+
+  size_t chead = a_load(_head);
+  while(!done) {
+    elt celt;
+    celt.binary = a_load(_buffer[chead % _size]);
+    size_t achead = a_load(_head);
+    if(achead != chead) {
+      chead = achead;
+      continue;
+    }
+    size_t nhead = chead + 1;
+    if(celt.split.val == guard) {
+      // entry is empty
+      elt nelt;
+      nelt.split.id  = celt.split.id + 1;
+      nelt.split.val = v;
+      done = cas(&_buffer[chead % _size], celt.binary, nelt.binary);
+      // done == true <=> sucessfully written entry
+    }
+    cas(&_head, chead, nhead, &chead);
+  }
+}
+
+template<typename T, unsigned int n, T guard>
+T jflib::basic_circular_buffer<T,n,guard>::dequeue() {
+  bool done = false;
+  elt res;
+
+  size_t ctail = a_load(_tail);
+  while(!done) {
+    bool dequeued = false;
+    do {
+      if(ctail % _size == a_load(_head) % _size)
+        return guard;
+      size_t ntail = ctail + 1;
+      dequeued = cas(&_tail, ctail, ntail, &ctail);
+    } while(!dequeued);
+
+    res.binary = a_load(_buffer[ctail % _size]);
+    elt nres;
+    nres.split.val = guard;
+    while(true) {
+      nres.split.id = res.split.id + 1;
+      if(res.split.val == guard) {
+        if(cas(&_buffer[ctail % _size], res.binary, nres.binary, &res.binary))
+          break;
+      } else {
+        done = cas(&_buffer[ctail % _size], res.binary, nres.binary);
+        break;
+      }
+    }
+  }
+
+  return res.split.val;
+}
+#endif /* __JELLYFISH_CIRCULAR_BUFFER_HPP__ */
diff --git a/include/jellyfish/compare_and_swap.hpp b/include/jellyfish/compare_and_swap.hpp
new file mode 100644
index 0000000..2defb97
--- /dev/null
+++ b/include/jellyfish/compare_and_swap.hpp
@@ -0,0 +1,80 @@
+/*  This file is part of Jflib.
+
+    Jflib is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jflib is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jflib.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef _JFLIB_COMPARE_AND_SWAP_H_
+#define _JFLIB_COMPARE_AND_SWAP_H_
+
+#include <sys/types.h>
+#include <stdint.h>
+
+namespace jflib {
+  // // Atomic load (get) and store (set). For now assume that the
+  // // architecture does this based on the virtual key word (true for
+  // // x86_64). TODO: improve on other architectures.
+  // template<typename T>
+  // T a_get(const T &x) { return *(volatile T*)&x; }
+  // template<typename T, typename U>
+  // T &a_set(T &lhs, const U &rhs) {
+  //   *(volatile T*)&lhs = rhs;
+  //   return lhs;
+  // }
+
+  // Numeric type of length rounded up to the size of a
+  // word. Undefined, and raise a compilation error, if the length is
+  // not a machine word size
+  template<typename T, size_t n> union word_t;
+  template<typename T> union word_t<T, 1> { typedef uint8_t  w_t; T v; w_t w; };
+  template<typename T> union word_t<T, 2> { typedef uint16_t w_t; T v; w_t w; };
+  template<typename T> union word_t<T, 4> { typedef uint32_t w_t; T v; w_t w; };
+  template<typename T> union word_t<T, 8> { typedef uint64_t w_t; T v; w_t w; };
+
+  /** Type safe version of CAS.
+   * @param [in] ptr Memory location.
+   * @param [in] ov  Presumed value at location.
+   * @param [in] nv  Value to write.
+   * @param [out] cv Value at location at time of call.
+   * @return true if CAS is successful.
+   *
+   * The CAS operation is successful if, at the time of call, ov is
+   * equal to *ptr, the value at the memory location. In that case, nv
+   * is written to *ptr, and when the call returns, cv == ov.
+   *
+   * If it fails, cv contains *ptr at the time of call.
+   */
+  template<typename T>
+  bool cas(T *ptr, const T &ov, const T &nv, T *cv) {
+    typedef word_t<T, sizeof(T)> val_t;
+    val_t _cv, _ov, _nv;
+    _ov.v = ov;
+    _nv.v = nv;
+    _cv.w = __sync_val_compare_and_swap((typename val_t::w_t *)ptr, _ov.w, _nv.w);
+    *cv = _cv.v;
+    return _cv.w == _ov.w;
+  }
+
+  /** Type safe version of CAS.  Identical to 4 argument version,
+   * except does not return the previous value.
+   */
+  template<typename T>
+  bool cas(T *ptr, const T &ov, const T &nv) {
+    T cv;
+    return cas(ptr, ov, nv, &cv);
+  }
+}
+
+
+#endif /* _JFLIB_COMPARE_AND_SWAP_H_ */
diff --git a/include/jellyfish/cooperative_pool.hpp b/include/jellyfish/cooperative_pool.hpp
new file mode 100644
index 0000000..788aea4
--- /dev/null
+++ b/include/jellyfish/cooperative_pool.hpp
@@ -0,0 +1,258 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_COOPERATIVE_POOL_HPP__
+#define __JELLYFISH_COOPERATIVE_POOL_HPP__
+
+#include <assert.h>
+#include <unistd.h>
+
+#include <jellyfish/circular_buffer.hpp>
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/locks_pthread.hpp>
+
+/// Cooperative pool. Provide a link between a producer and many
+/// consumers. It is cooperative in the sense that there is no
+/// dedicated thread to the producer. When the number of elements in
+/// the queue from the producer to the consumer is less than half,
+/// then the thread requesting an element attempts to become the
+/// producer. It stays a producer until the producer to consumer queue
+/// is full.
+///
+/// This class must be subclassed using CRTP. `T` is the type of the
+/// element passed around in the queues. The derived class must
+/// implement the method `bool produce(T& e)`. It is called when a
+/// thread has become a producer. It must set in `e` the new element,
+/// unless there is nothing more to produce. It returns `true` if
+/// there is nothing more to produce (and `e` is not used), `false`
+/// otherwise.
+///
+/// The following example will produce the integers `[0, 1000000]`:
+///
+/// ~~~{.cc}
+/// class sequence : public cooperative_bool<sequence, int> {
+///   int cur_;
+/// public:
+///   sequence() : cur_(0) { }
+///   bool produce(int& e) {
+///     if(cur_ <= 1000000) {
+///       e = cur_++;
+///       return false;
+///     }
+///     return true;
+///   }
+/// };
+/// ~~~
+///
+/// To access the elements (or the jobs) of the sequence, instantiate
+/// a `sequence::job` object and check that it is not empty. If empty,
+/// the sequence is over.
+///
+/// ~~~{.cc}
+/// sequence seq; // Sequence, instantiated in main thread
+/// // In each consumer thread:
+/// while(true) {
+///   sequence::job j(seq);
+///   if(j.is_empty())
+///     break;
+///   // Do computation using *j and j->
+/// }
+/// ~~~
+
+namespace jellyfish {
+template<typename D, typename T>
+class cooperative_pool {
+public:
+  typedef jflib::circular_buffer<uint32_t> cbT;
+  typedef T                                element_type;
+
+private:
+  uint32_t      size_;
+  element_type* elts_;
+  cbT           cons_prod_;     // FIFO from Consumers to Producers
+  cbT           prod_cons_;     // FIFO from Producers to Consumers
+  int           has_producer_;  // Tell whether a thread is acting as a producer
+
+  // RAII token.
+  class take_token {
+    int* const token_;
+    const bool has_token_;
+  public:
+    take_token(int* token) : token_(token), has_token_(jflib::cas(token_, 0, 1)) { }
+    ~take_token() {
+      if(has_token_)
+        //        cas(token_, 1, 0); // Guaranteed to succeed. Memory barrier
+        jflib::a_store(token_, 0);
+    }
+    bool has_token() const { return has_token_; }
+  };
+
+  explicit cooperative_pool(const cooperative_pool& rhs) : size_(0), elts_(0), cons_prod_(0), prod_cons_(0), has_producer_(0) { }
+public:
+  cooperative_pool(uint32_t size) :
+    size_(size),
+    elts_(new element_type[size_]),
+    cons_prod_(size_ + 100),
+    prod_cons_(size_ + 100),
+    has_producer_(0)
+  {
+    // Every element is empty and ready to be filled by the producer
+    for(size_t i = 0; i < size_; ++i)
+      cons_prod_.enqueue_no_check(i);
+  }
+
+  ~cooperative_pool() { delete [] elts_; }
+
+  uint32_t size() const { return size_; }
+
+  element_type* element_begin() { return elts_; }
+  element_type* element_end() { return elts_ + size_; }
+
+  // Contains a filled element or is empty. In which case the producer
+  // is done and we should stop processing.
+  class job {
+    cooperative_pool& cp_;
+    uint32_t          i_;       // Index of element
+  public:
+    job(cooperative_pool& cp) : cp_(cp), i_(cp_.get_element()) { }
+    ~job() { release(); }
+
+    void release() {
+      if(!is_empty()) {
+        cp_.cons_prod_.enqueue_no_check(i_);
+      }
+    }
+    bool is_empty() const { return i_ == cbT::guard; }
+    void next() {
+      release();
+      i_ = cp_.get_element();
+    }
+
+    element_type& operator*() { return cp_.elts_[i_]; }
+    element_type* operator->() { return &cp_.elts_[i_]; }
+
+  private:
+    // Disable copy of job
+    job(const job& rhs) { }
+    job& operator=(const job& rhs) { }
+  };
+  friend class job;
+
+  /// STL compliant iterator
+  class iterator : public std::iterator<std::input_iterator_tag, element_type> {
+    job* j_;
+  public:
+    iterator() : j_(0) { }
+    iterator(cooperative_pool& cp) : j_(new job(cp)) { }
+    iterator(const iterator& rhs) : j_(rhs.j_) { }
+
+    bool operator==(const iterator& rhs) const { return j_ == rhs.j_; }
+    bool operator!=(const iterator& rhs) const { return j_ != rhs.j_; }
+    element_type& operator*() { return j_->operator*(); }
+    element_type* operator->() { return j_->operator->(); }
+
+    iterator& operator++() {
+      j_->next();
+      if(j_->is_empty()) {
+        delete j_;
+        j_ = 0;
+      }
+      return *this;
+    }
+
+    iterator operator++(int) {
+      iterator res(*this);
+      ++*this;
+      return res;
+    }
+  };
+  iterator begin() { return iterator(*this); }
+  const iterator begin() const { return iterator(*this); }
+  const iterator end() const { return iterator(); }
+
+private:
+  enum PRODUCER_STATUS { PRODUCER_PRODUCED, PRODUCER_DONE, PRODUCER_EXISTS };
+  uint32_t get_element() {
+    int iteration = 0;
+
+    while(true) {
+      // If less than half full -> try to fill up producer to consumer
+      // queue. Disregard return value: in any every case will
+      // attempt to get an element for ourselves
+      if(prod_cons_.fill() < prod_cons_.size() / 2)
+        become_producer();
+
+      uint32_t i = prod_cons_.dequeue();
+      if(i != cbT::guard)
+        return i;
+
+      // Try to become producer
+      switch(become_producer()) {
+      case PRODUCER_PRODUCED:
+        iteration = 0; // Produced. Attempt anew to get an element
+        break;
+      case PRODUCER_DONE:
+        return prod_cons_.dequeue();
+      case PRODUCER_EXISTS:
+        delay(iteration++); // Already a producer. Wait a bit it adds things to queue
+        break;
+      }
+    }
+  }
+
+  PRODUCER_STATUS become_producer() {
+    if(prod_cons_.is_closed())
+      return PRODUCER_DONE;
+
+    // Mark that we have a produce (myself). If not, return. Token
+    // will be release automatically at end of method.
+    take_token producer_token(&has_producer_);
+    if(!producer_token.has_token())
+      return PRODUCER_EXISTS;
+
+    uint32_t i = cbT::guard;
+    try {
+      while(true) { // Only way out is if produce method is done (returns true or throw an exception)
+        i = cons_prod_.dequeue();
+        if(i == cbT::guard)
+          return PRODUCER_PRODUCED;
+
+        if(static_cast<D*>(this)->produce(elts_[i])) // produce returns true if done
+          break;
+
+        prod_cons_.enqueue_no_check(i);
+      }
+    } catch(...) { }       // Threw an exception -> same as being done
+
+    // Producing is done
+    cons_prod_.enqueue_no_check(i);
+    prod_cons_.close();
+
+    return PRODUCER_DONE;
+  }
+
+  // First 16 operations -> no delay. Then exponential back-off up to a second.
+  void delay(int iteration) {
+    if(iteration < 16)
+      return;
+    int shift = 10 - std::min(iteration - 16, 10);
+    usleep((1000000 - 1) >> shift);
+  }
+};
+
+} // namespace jellyfish {
+#endif /* __JELLYFISH_COOPERATIVE_POOL_HPP__ */
diff --git a/include/jellyfish/cooperative_pool2.hpp b/include/jellyfish/cooperative_pool2.hpp
new file mode 100644
index 0000000..2872f63
--- /dev/null
+++ b/include/jellyfish/cooperative_pool2.hpp
@@ -0,0 +1,283 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_COOPERATIVE_POOL2_HPP__
+#define __JELLYFISH_COOPERATIVE_POOL2_HPP__
+
+#include <assert.h>
+#include <unistd.h>
+
+#include <jellyfish/circular_buffer.hpp>
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/locks_pthread.hpp>
+
+/// Cooperative pool. Provide a link between many producers and many
+/// consumers. It is cooperative in the sense that there is no
+/// dedicated threads as producer. When the number of elements in the
+/// queue from the producer to the consumer is less than half, then
+/// the thread requesting an element attempts to become an additional
+/// producer. It stays a producer until the producer to consumer queue
+/// is full.
+///
+/// This class must be subclassed using CRTP. `T` is the type of the
+/// element passed around in the queues. The derived class must
+/// implement the method `bool produce(uint32_t i, T& e)`. It is
+/// called when a thread has become a producer. It must set in `e` the
+/// new element, unless there is nothing more to produce. It returns
+/// `true` if there is nothing more to produce (and `e` is not used),
+/// `false` otherwise.
+///
+/// The maximum number of producers is specified to the constructor of
+/// the class (`max_producers`). The parameter `i` passed to `produce`
+/// is in [0, max_producers) and it is guaranteed that at any given
+/// time, no two producers have the same `i`.
+///
+/// The following example will produce the integers `[0, 1000 * max)`,
+/// with max producers.
+///
+/// ~~~{.cc}
+/// class sequence : public cooperative_bool<sequence, int> {
+///   const uint32_t max_;
+///   std::vector    cur_;
+///   uint32_t       done_;
+/// public:
+///   sequence(uint32_t max) : max_(max), cur_(max, 0), done_(0) { }
+///   bool produce(uint32_t i, int& e) {
+///     int& cur = cur_[i];
+///     if(cur < max_) {
+///       e = i * max_ + cur++;
+///       return false;
+///     }
+///     return true;
+///   }
+/// };
+/// ~~~
+///
+/// To access the elements (or the jobs) of the sequence, instantiate
+/// a `sequence::job` object and check that it is not empty. If empty,
+/// the sequence is over.
+///
+/// ~~~{.cc}
+/// sequence seq; // Sequence, instantiated in main thread
+/// // In each consumer thread:
+/// while(true) {
+///   sequence::job j(seq);
+///   if(j.is_empty())
+///     break;
+///   // Do computation using *j and j->
+/// }
+/// ~~~
+
+namespace jellyfish {
+template<typename D, typename T>
+class cooperative_pool2 {
+public:
+  typedef jflib::circular_buffer<uint32_t> cbT;
+  typedef T                                element_type;
+
+private:
+  uint32_t       size_;
+  element_type*  elts_;
+  cbT            cons_prod_;    // FIFO from Consumers to Producers
+  cbT            prod_cons_;    // FIFO from Producers to Consumers
+  cbT            tokens_;       // FIFO with producer tokens
+  const uint32_t max_producers_;
+  uint32_t       done_;         // Number of producer that are done
+
+  // RAII token.
+  struct take_token {
+    cbT&     tokens_;
+    uint32_t token_;
+    bool     drop_;
+
+    take_token(cbT& tokens) : tokens_(tokens), token_(tokens.dequeue()), drop_(false) { }
+    ~take_token() {
+      if(has_token() && !drop_) {
+        tokens_.enqueue_no_check(token_);
+        //        assert(tokens_.enqueue(token_));
+      }
+    }
+    bool has_token() const { return token_ != cbT::guard; }
+    void drop() { drop_ = true; }
+  };
+
+  //  explicit cooperative_pool2(const cooperative_pool2& rhs) : size_(0), elts_(0), cons_prod_(0), prod_cons_(0) { }
+public:
+  cooperative_pool2(uint32_t max_producers, uint32_t size) :
+    size_(size),
+    elts_(new element_type[size_]),
+    cons_prod_(size_ + 100),
+    prod_cons_(size_ + 100),
+    tokens_(max_producers + 1),
+    max_producers_(max_producers),
+    done_(0)
+  {
+    // Every element is empty and ready to be filled by the producer
+    for(size_t i = 0; i < size_; ++i)
+      cons_prod_.enqueue_no_check(i);
+
+    // Every producer token is free
+    for(uint32_t i = 0; i < max_producers_; ++i)
+      tokens_.enqueue(i);
+    //      tokens_.enqueue_no_check(i);
+  }
+
+  ~cooperative_pool2() { delete [] elts_; }
+
+  uint32_t size() const { return size_; }
+
+  element_type* element_begin() { return elts_; }
+  element_type* element_end() { return elts_ + size_; }
+
+  // Contains a filled element or is empty. In which case the producer
+  // is done and we should stop processing.
+  class job {
+    cooperative_pool2& cp_;
+    uint32_t          i_;       // Index of element
+  public:
+    job(cooperative_pool2& cp) : cp_(cp), i_(cp_.get_element()) { }
+    ~job() { release(); }
+
+    void release() {
+      if(!is_empty()) {
+        cp_.cons_prod_.enqueue_no_check(i_);
+      }
+    }
+    bool is_empty() const { return i_ == cbT::guard; }
+    void next() {
+      release();
+      i_ = cp_.get_element();
+    }
+
+    element_type& operator*() { return cp_.elts_[i_]; }
+    element_type* operator->() { return &cp_.elts_[i_]; }
+
+  private:
+    // Disable copy of job
+    job(const job& rhs) { }
+    job& operator=(const job& rhs) { }
+  };
+  friend class job;
+
+  /// STL compliant iterator
+  class iterator : public std::iterator<std::input_iterator_tag, element_type> {
+    job* j_;
+  public:
+    iterator() : j_(0) { }
+    iterator(cooperative_pool2& cp) : j_(new job(cp)) { }
+    iterator(const iterator& rhs) : j_(rhs.j_) { }
+
+    bool operator==(const iterator& rhs) const { return j_ == rhs.j_; }
+    bool operator!=(const iterator& rhs) const { return j_ != rhs.j_; }
+    element_type& operator*() { return j_->operator*(); }
+    element_type* operator->() { return j_->operator->(); }
+
+    iterator& operator++() {
+      j_->next();
+      if(j_->is_empty()) {
+        delete j_;
+        j_ = 0;
+      }
+      return *this;
+    }
+
+    iterator operator++(int) {
+      iterator res(*this);
+      ++*this;
+      return res;
+    }
+  };
+  iterator begin() { return iterator(*this); }
+  const iterator begin() const { return iterator(*this); }
+  const iterator end() const { return iterator(); }
+
+private:
+  enum PRODUCER_STATUS { PRODUCER_PRODUCED, PRODUCER_DONE, PRODUCER_EXISTS };
+  uint32_t get_element() {
+    int iteration = 0;
+
+    while(true) {
+      // If less than half full -> try to fill up producer to consumer
+      // queue. Disregard return value: in any every case will
+      // attempt to get an element for ourselves
+      if(prod_cons_.fill() < prod_cons_.size() / 2)
+        become_producer();
+
+      uint32_t i = prod_cons_.dequeue();
+      if(i != cbT::guard)
+        return i;
+
+      // Try to become producer
+      switch(become_producer()) {
+      case PRODUCER_PRODUCED:
+        iteration = 0; // Produced. Attempt anew to get an element
+        break;
+      case PRODUCER_DONE:
+        return prod_cons_.dequeue();
+      case PRODUCER_EXISTS:
+        delay(iteration++); // Already a producer. Wait a bit it adds things to queue
+        break;
+      }
+    }
+  }
+
+  PRODUCER_STATUS become_producer() {
+    if(prod_cons_.is_closed())
+      return PRODUCER_DONE;
+
+    // Mark that we have a produce (myself). If not, return. Token
+    // will be release automatically at end of method.
+    take_token producer_token(tokens_);
+    if(!producer_token.has_token())
+      return PRODUCER_EXISTS;
+
+    uint32_t i = cbT::guard;
+    try {
+      while(true) { // Only way out is if produce method is done (returns true or throw an exception)
+        i = cons_prod_.dequeue();
+        if(i == cbT::guard)
+          return PRODUCER_PRODUCED;
+
+        if(static_cast<D*>(this)->produce(producer_token.token_, elts_[i])) // produce returns true if done
+          break;
+
+        prod_cons_.enqueue_no_check(i);
+      }
+    } catch(...) { }       // Threw an exception -> same as being done
+
+    // Producing is done for this producer
+    cons_prod_.enqueue_no_check(i);
+    producer_token.drop();
+    uint32_t is_done = __sync_add_and_fetch(&done_, (uint32_t)1);
+    if(is_done < max_producers_)
+      return PRODUCER_PRODUCED;
+
+    prod_cons_.close();
+    return PRODUCER_DONE;
+  }
+
+  // First 16 operations -> no delay. Then exponential back-off up to a second.
+  void delay(int iteration) {
+    if(iteration < 16)
+      return;
+    int shift = 10 - std::min(iteration - 16, 10);
+    usleep((1000000 - 1) >> shift);
+  }
+};
+
+} // namespace jellyfish {
+#endif /* __JELLYFISH_COOPERATIVE_POOL2_HPP__ */
diff --git a/include/jellyfish/cpp_array.hpp b/include/jellyfish/cpp_array.hpp
new file mode 100644
index 0000000..952827a
--- /dev/null
+++ b/include/jellyfish/cpp_array.hpp
@@ -0,0 +1,156 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_CPP_ARRAY_HPP_
+#define __JELLYFISH_CPP_ARRAY_HPP_
+
+#include <cstddef>
+#include <memory>
+
+namespace jellyfish {
+
+/// Fix length array of type T. An element is initialized with the init method.
+///   new (this->data() + i) T(
+template<typename T>
+class cpp_array {
+protected:
+  std::pair<T*, ptrdiff_t> data_;
+  std::pair<bool*, ptrdiff_t> init_;
+  size_t size_;
+
+public:
+  cpp_array(size_t size) :
+  data_(std::get_temporary_buffer<T>(size)),
+  init_(std::get_temporary_buffer<bool>(size)),
+  size_(size) {
+    if(data_.first == 0 || init_.first == 0) {
+      std::return_temporary_buffer(data_.first);
+      std::return_temporary_buffer(init_.first);
+      throw std::bad_alloc();
+    }
+    memset(init_.first, '\0', sizeof(bool) * size_);
+  }
+
+  ~cpp_array() {
+    clear();
+    std::return_temporary_buffer(data_.first);
+    std::return_temporary_buffer(init_.first);
+  }
+
+  /// Initialize element i with 0 argument
+  void init(size_t i) {
+    release(i);
+    new (data_.first + i) T();
+    init_.first[i] = true;
+  }
+
+  /// Initialize element i with 1 argument
+  template<typename A1>
+  void init(size_t i, A1& a1) {
+    release(i);
+    new (data_.first + i) T(a1);
+    init_.first[i] = true;
+  }
+  template<typename A1>
+  void init(size_t i, A1* a1) {
+    release(i);
+    new (data_.first + i) T(a1);
+    init_.first[i] = true;
+  }
+  /// Initialize element i with 2 arguments
+  template<typename A1, typename A2>
+  void init(size_t i, A1& a1, A2& a2) {
+    release(i);
+    new (data_.first + i) T(a1, a2);
+    init_.first[i] = true;
+  }
+  template<typename A1, typename A2>
+  void init(size_t i, A1* a1, A2& a2) {
+    release(i);
+    new (data_.first + i) T(a1, a2);
+    init_.first[i] = true;
+  }
+  template<typename A1, typename A2>
+  void init(size_t i, A1& a1, A2* a2) {
+    release(i);
+    new (data_.first + i) T(a1, a2);
+    init_.first[i] = true;
+  }
+  template<typename A1, typename A2>
+  void init(size_t i, A1* a1, A2* a2) {
+    release(i);
+    new (data_.first + i) T(a1, a2);
+    init_.first[i] = true;
+  }
+
+  /// Initialize element i with 3 arguments
+  template<typename A1, typename A2, typename A3>
+  void init(size_t i, A1 a1, A2 a2, A3 a3) {
+    release(i);
+    new (data_.first + i) T(a1, a2, a3);
+    init_.first[i] = true;
+  }
+  /// Initialize element i with 4 arguments
+  template<typename A1, typename A2, typename A3, typename A4>
+  void init(size_t i, A1 a1, A2 a2, A3 a3, A4 a4) {
+    release(i);
+    new (data_.first + i) T(a1, a2, a3, a4);
+    init_.first[i] = true;
+  }
+  /// Initialize element i with 5 arguments
+  template<typename A1, typename A2, typename A3, typename A4, typename A5>
+  void init(size_t i, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
+    release(i);
+    new (data_.first + i) T(a1, a2, a3, a4, a5);
+    init_.first[i] = true;
+  }
+
+  void release(size_t i) {
+    if(init_.first[i]) {
+      data_.first[i].~T();
+      init_.first[i] = false;
+    }
+  }
+
+  size_t size() const { return size_; }
+  bool empty() const { return size_ == 0; }
+  T& operator[](size_t i) { return data_.first[i]; }
+  const T& operator[](size_t i) const { return data_.first[i]; }
+  bool initialized(size_t i) const { return init_.first[i]; }
+
+  T* begin() { return data_.first; }
+  T* end() { return data_.first + size_; }
+  const T* begin() const { return data_.first; }
+  const T* end() const { return data_.end + size_; }
+  const T* cbegin() const { return data_.first; }
+  const T* cend() const { return data_.end + size_; }
+
+  T* data() { return data_.first; }
+  const T* data() const { return data_.first; }
+
+  T& front() { return data_.first[0]; }
+  T& back() { return data_.first[size_ - 1]; }
+  const T& front() const { return data_.first[0]; }
+  const T& back() const { return data_.first[size_ - 1]; }
+
+  void clear() {
+    for(size_t i = 0; i < size_; ++i)
+      release(i);
+  }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_CPP_ARRAY_HPP_ */
diff --git a/include/jellyfish/divisor.hpp b/include/jellyfish/divisor.hpp
new file mode 100644
index 0000000..6c47b31
--- /dev/null
+++ b/include/jellyfish/divisor.hpp
@@ -0,0 +1,150 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+
+#ifndef __JELLYFISH_DIVISOR_HPP__
+#define __JELLYFISH_DIVISOR_HPP__
+
+#include <stdint.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jflib {
+class divisor64 {
+  const uint64_t d_;
+#ifdef HAVE_INT128
+  const uint16_t p_;
+  const unsigned __int128 m_;
+#endif
+  template<typename T>
+  static T div_ceil(T x, T y) {
+    T q = x / y;
+    T r = x % y;
+    return q + (r > 0);
+  }
+
+  template<typename T>
+  static uint16_t ceilLog2(T x, uint16_t r = 0, uint16_t i = 0) {
+    if(x > 1)
+      return ceilLog2(x >> 1, r + 1, i | (x & 1));
+    return r + i;
+  }
+
+public:
+  explicit divisor64(uint64_t d) :
+    d_(d)
+#ifdef HAVE_INT128
+    , p_(ceilLog2(d_)),
+    m_((div_ceil((unsigned __int128)1 << (64 + p_), (unsigned __int128)d_)) & (uint64_t)-1)
+#endif
+  { }
+
+  divisor64() :
+    d_(0)
+#ifdef HAVE_INT128
+    , p_(0), m_(0)
+#endif
+  { }
+
+  explicit divisor64(const divisor64& rhs) :
+    d_(rhs.d_)
+#ifdef HAVE_INT128
+    , p_(rhs.p_),
+    m_(rhs.m_)
+#endif
+  { }
+
+  inline uint64_t divide(const uint64_t n) const {
+#ifdef HAVE_INT128
+    switch(m_) {
+    case 0:
+      return n >> p_;
+    default:
+      const unsigned __int128 n_ = (unsigned __int128)n;
+      return (n_ + ((n_ * m_) >> 64)) >> p_;
+    }
+#else
+    return n / d_;
+#endif
+  }
+
+  inline uint64_t remainder(uint64_t n) const {
+#ifdef HAVE_INT128
+    switch(m_) {
+    case 0:
+      return n & (((uint64_t)1 << p_) - 1);
+    default:
+      return n - divide(n) * d_;
+    }
+#else
+    return n % d_;
+#endif
+  }
+
+  // Euclidian division: d.division(n, q, r) sets q <- n / d and r
+  // <- n % d. This is faster than doing each independently.
+  inline void division(uint64_t n, uint64_t &q, uint64_t &r) const {
+#ifdef HAVE_INT128
+    switch(m_) {
+    case 0:
+      q = n >> p_;
+      r = n & (((uint64_t)1 << p_) - 1);
+      break;
+    default:
+      q = divide(n);
+      r = n - q * d_;
+      break;
+    }
+#else
+    q = n / d_;
+    r = n % d_;
+#endif
+  }
+
+  uint64_t d() const { return d_; }
+  uint64_t p() const {
+#ifdef HAVE_INT128
+    return p_;
+#else
+    return 0;
+#endif
+  }
+  uint64_t m() const {
+#ifdef HAVE_INT128
+    return m_;
+#else
+    return 0;
+#endif
+  }
+};
+
+inline uint64_t operator/(uint64_t n, const divisor64& d) {
+  return d.divide(n);
+}
+inline uint64_t operator%(uint64_t n, const divisor64& d) {
+  return d.remainder(n);
+}
+
+inline std::ostream& operator<<(std::ostream& os, const divisor64& d) {
+  return os << "d:" << d.d() << ",p:" << d.p() << ",m:" << d.m();
+}
+
+} // namespace jflib
+
+#endif /* __JELLYFISH_DIVISOR_HPP__ */
+
diff --git a/include/jellyfish/dumper.hpp b/include/jellyfish/dumper.hpp
new file mode 100644
index 0000000..f12d604
--- /dev/null
+++ b/include/jellyfish/dumper.hpp
@@ -0,0 +1,103 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_DUMPER_HPP__
+#define __JELLYFISH_DUMPER_HPP__
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <vector>
+#include <string>
+#include <jellyfish/err.hpp>
+#include <jellyfish/time.hpp>
+
+/**
+ * A dumper is responsible to dump the hash array to permanent storage
+ * and zero out the array.
+ **/
+namespace jellyfish {
+template<typename storage_t>
+class dumper_t {
+  Time                     writing_time_;
+  int                      index_;
+  bool                     one_file_;
+  std::vector<std::string> file_names_;
+
+protected:
+  uint64_t                 min_;
+  uint64_t                 max_;
+
+public:
+  define_error_class(ErrorWriting);
+
+protected:
+  /// Open the next file with given prefix. If one_file is false,
+  /// append _0, _1, etc. to the prefix for actual file name. If
+  /// one_file is true, the prefix is the file name. The first time
+  /// the file is open in trunc mode, the subsequent times in append
+  /// mode.
+  void open_next_file(const char *prefix, std::ofstream &out) {
+    std::ostringstream name;
+    name << prefix;
+    std::ios::openmode mode = std::ios::out;
+    if(one_file_) {
+      mode |= (index_++ ? std::ios::ate : std::ios::trunc);
+    } else {
+      name << index_++;
+      mode |= std::ios::trunc;
+    }
+    file_names_.push_back(name.str());
+
+    out.open(name.str().c_str());
+    if(out.fail())
+      throw ErrorWriting(err::msg() << "'" << name.str() << "': "
+                         << "Can't open file for writing" << err::no);
+  }
+
+public:
+  dumper_t() : writing_time_(::Time::zero), index_(0), one_file_(false),
+               min_(0), max_(std::numeric_limits<uint64_t>::max())
+  {}
+
+  void dump(storage_t* ary) {
+    Time start;
+    _dump(ary);
+    Time end;
+    writing_time_ += end - start;
+  }
+
+  bool one_file() const { return one_file_; }
+  void one_file(bool v) { one_file_ = v; }
+
+  virtual void _dump(storage_t* ary) = 0;
+  uint64_t min() const { return min_; }
+  void min(uint64_t m) { min_ = m; }
+  uint64_t max() const { return max_; }
+  void max(uint64_t m) { max_ = m; }
+  Time get_writing_time() const { return writing_time_; }
+  int nb_files() const { return index_; }
+  std::vector<std::string> file_names() { return file_names_; }
+  std::vector<const char*> file_names_cstr() {
+    std::vector<const char*> res;
+    for(size_t i = 0; i < file_names_.size(); ++i)
+      res.push_back(file_names_[i].c_str());
+    return res;
+  }
+  virtual ~dumper_t() {};
+};
+}
+#endif // __DUMPER_HPP__
diff --git a/include/jellyfish/err.hpp b/include/jellyfish/err.hpp
new file mode 100644
index 0000000..d30c026
--- /dev/null
+++ b/include/jellyfish/err.hpp
@@ -0,0 +1,99 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_ERR_HPP__
+#define __JELLYFISH_ERR_HPP__
+
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+#include <exception>
+#include <stdexcept>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+
+namespace jellyfish {
+namespace err {
+struct msg {
+  std::ostringstream msg_;
+
+  msg() { }
+  explicit msg(const std::exception& e) { *this << e; }
+  template<typename T>
+  explicit msg(const T& x) { *this << x; }
+
+  operator std::string() const { return msg_.str(); }
+
+  template<typename T>
+  msg& operator<<(const T& x) {
+    msg_ << x;
+    return *this;
+  }
+
+  msg& operator<<(const std::exception& e) {
+    msg_ << e.what();
+    // try {
+    //   std::rethrow_if_nested(e);
+    // } catch (const std::exception& nested) {
+    //   msg_ << '\n';
+    //   return *this << nested;
+    // }
+    return *this;
+  }
+
+  msg& operator<<(msg& (*pf)(msg&)) { return pf(*this); }
+
+};
+
+// Select the correct version (GNU or XSI) version of
+// ::strerror_r. err::strerror_ behaves like the GNU version of strerror_r,
+// regardless of which version is provided by the system.
+inline const char* strerror__(char* buf, int res) {
+  return res != -1 ? buf : "error";
+}
+inline const char* strerror__(char* buf, char* res) {
+  return res;
+}
+inline const char* strerror_r(int err, char* buf, size_t buflen) {
+  return strerror__(buf, ::strerror_r(err, buf, buflen));
+}
+
+inline std::ostream& no(std::ostream& os) {
+  char buf[128];
+  return os << strerror_r(errno, buf, sizeof(buf));
+}
+
+inline msg& no(msg& m) {
+  char buf[128];
+  return m << strerror_r(errno, buf, sizeof(buf));
+}
+
+inline void die(int code, std::string msg) {
+  std::cerr << msg << '\n';
+  exit(code);
+}
+
+inline void die(std::string msg) { die(1, msg); }
+} // namespace err
+} // namespace jellyfish
+
+#define define_error_class(name)                                        \
+  class name : public std::runtime_error {                              \
+  public: explicit name(const std::string &txt) : std::runtime_error(txt) {} \
+  }
+
+#endif // __JELLYFISH_ERR_HPP__
diff --git a/include/jellyfish/file_header.hpp b/include/jellyfish/file_header.hpp
new file mode 100644
index 0000000..c43f736
--- /dev/null
+++ b/include/jellyfish/file_header.hpp
@@ -0,0 +1,112 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_FILE_HEADER_HPP__
+#define __JELLYFISH_FILE_HEADER_HPP__
+
+#include <string>
+#include <jellyfish/generic_file_header.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+
+namespace jellyfish {
+/// A header with jellyfish hash specific entries: size, matrix, etc.
+class file_header : public generic_file_header {
+public:
+  file_header() : generic_file_header(sizeof(uint64_t)) { }
+  file_header(std::istream& is) : generic_file_header(sizeof(uint64_t)) {
+    this->read(is);
+  }
+
+  template<typename storage>
+  void update_from_ary(const storage& ary) {
+    this->size(ary.size());
+    this->key_len(ary.key_len());
+    this->val_len(ary.val_len());
+    this->matrix(ary.matrix());
+    this->max_reprobe(ary.max_reprobe());
+    this->set_reprobes(ary.reprobes());
+  }
+
+  RectangularBinaryMatrix matrix(int i = 1) const {
+    std::string name("matrix");
+    name += std::to_string((long long int)i); // Cast to make gcc4.4 happy!
+    const unsigned int r = root_[name]["r"].asUInt();
+    const unsigned int c = root_[name]["c"].asUInt();
+    std::vector<uint64_t> raw(c, (uint64_t)0);
+    for(unsigned int i = 0; i < c; ++i)
+      raw[i] = root_[name]["columns"][i].asUInt64();
+    return RectangularBinaryMatrix(raw.data(), r, c);
+  }
+
+  void matrix(const RectangularBinaryMatrix& m, int i = 1) {
+    std::string name("matrix");
+    name += std::to_string((long long int)i);
+    root_[name].clear();
+    root_[name]["r"] = m.r();
+    root_[name]["c"] = m.c();
+    for(unsigned int i = 0; i < m.c(); ++i) {
+      Json::UInt64 x = m[i];
+      root_[name]["columns"].append(x);
+    }
+  }
+
+  size_t size() const { return root_["size"].asLargestUInt(); }
+  void size(size_t s) { root_["size"] = (Json::UInt64)s; }
+
+  unsigned int key_len() const { return root_["key_len"].asUInt(); }
+  void key_len(unsigned int k) { root_["key_len"] = (Json::UInt)k; }
+
+  unsigned int val_len() const { return root_["val_len"].asUInt(); }
+  void val_len(unsigned int k) { root_["val_len"] = (Json::UInt)k; }
+
+  unsigned int max_reprobe() const { return root_["max_reprobe"].asUInt(); }
+  void max_reprobe(unsigned int m) { root_["max_reprobe"] = (Json::UInt)m; }
+
+  size_t max_reprobe_offset() const { return root_["reprobes"][max_reprobe()].asLargestUInt(); }
+
+  double fpr() const { return root_["fpr"].asDouble(); }
+  void fpr(double f) { root_["fpr"] = f; }
+
+  unsigned long nb_hashes() const { return root_["nb_hashes"].asUInt(); }
+  void nb_hashes(unsigned long nbh) { root_["nb_hashes"] = (Json::UInt)nbh; }
+
+  bool canonical() const { return root_.get("canonical", false).asBool(); }
+  void canonical(bool v) { root_["canonical"] = v; }
+
+  /// reprobes must be at least max_reprobe() + 1 long
+  void get_reprobes(size_t* reprobes) const {
+    for(unsigned int i = 0; i <= max_reprobe(); ++i)
+      reprobes[i] = root_["reprobes"][i].asLargestUInt();
+  }
+
+  /// This must be call after max_reprobe has been set. reprobes must
+  /// be at least max_reprobe() + 1 long.
+  void set_reprobes(const size_t* reprobes) {
+    root_["reprobes"].clear();
+    for(unsigned int i = 0; i <= max_reprobe(); ++i)
+      root_["reprobes"].append((Json::UInt64)reprobes[i]);
+  }
+
+  /// Length of counter field in binary/sorted format
+  unsigned int counter_len() const { return root_["counter_len"].asUInt(); }
+  void counter_len(unsigned int l) { root_["counter_len"] = (Json::UInt)l; }
+
+  std::string format() const { return root_["format"].asString(); }
+  void format(const std::string& s) { root_["format"] = s; }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_FILE_HEADER_HPP__ */
diff --git a/include/jellyfish/generator_manager.hpp b/include/jellyfish/generator_manager.hpp
new file mode 100644
index 0000000..ece2dd5
--- /dev/null
+++ b/include/jellyfish/generator_manager.hpp
@@ -0,0 +1,163 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_SPAWN_EXTERNAL_HPP_
+#define __JELLYFISH_SPAWN_EXTERNAL_HPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <stdexcept>
+
+#ifdef HAVE_EXT_STDIO_FILEBUF_H
+#include <ext/stdio_filebuf.h>
+#define STDIO_FILEBUF_TYPE __gnu_cxx::stdio_filebuf<std::istream::char_type>
+#else
+#include <jellyfish/stdio_filebuf.hpp>
+#define STDIO_FILEBUF_TYPE jellyfish::stdio_filebuf<std::istream::char_type>
+#endif
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+// Open a path and set CLOEXEC flags
+int open_cloexec(const char* path, int flags);
+
+// Input stream (inherit from std::istream, behaves mostly like an
+// ifstream), with flag O_CLOEXEC (close-on-exec) turned on.
+class cloexec_istream : public std::istream
+{
+  static std::streambuf* open_file(const char* path) {
+    int fd = open_cloexec(path, O_RDONLY);
+    return new STDIO_FILEBUF_TYPE(fd, std::ios::in);
+  }
+
+public:
+  cloexec_istream(const cloexec_istream&) = delete;
+  cloexec_istream(const char* path) :
+  std::istream((open_file(path)))
+  { }
+  cloexec_istream(const std::string& path) :
+    std::istream(open_file(path.c_str()))
+  { }
+  virtual ~cloexec_istream() { close(); }
+  void close() { delete std::istream::rdbuf(0); }
+};
+
+
+// This class is responsible for creating a tmp directory and
+// populating it with fifos.
+class tmp_pipes {
+  static std::string create_tmp_dir();
+  std::vector<std::string> create_pipes(const std::string& tmpdir, int nb_pipes);
+
+  std::string              tmpdir_;
+  std::vector<std::string> pipes_;
+  std::vector<const char*> pipes_paths_;
+
+public:
+  tmp_pipes(int nb_pipes):
+  tmpdir_(create_tmp_dir()),
+  pipes_(create_pipes(tmpdir_, nb_pipes))
+  {
+    for(auto it = pipes_.cbegin(); it != pipes_.cend(); ++it)
+      pipes_paths_.push_back(it->c_str());
+  }
+  ~tmp_pipes() { cleanup(); }
+
+  size_t size() const { return pipes_.size(); }
+  const char* operator[](int i) const { return pipes_[i].c_str(); }
+  std::vector<const char*>::const_iterator begin() const { return pipes_paths_.cbegin(); }
+  std::vector<const char*>::const_iterator end() const { return pipes_paths_.cend(); }
+
+  // Discard a pipe: unlink it while it is open for writing. The
+  // reading process will get no data and won't be able to reopen the
+  // file, marking the end of this pipe.
+  void discard(int i);
+  // Discard all pipes
+  void cleanup();
+};
+
+// This class creates a new process which manages a bunch of
+// "generators", sub-processes that writes into a fifo (named pipe)
+// and generate sequence.
+class generator_manager {
+  cloexec_istream cmds_;
+  tmp_pipes       pipes_;
+  pid_t           manager_pid_;
+  const char*     shell_;
+  int             kill_signal_; // if >0, process has received that signal
+
+  struct cmd_info_type {
+    std::string command;
+    int         pipe;
+  };
+  typedef std::map<pid_t, cmd_info_type> pid2pipe_type;
+  pid2pipe_type pid2pipe_;
+
+public:
+  generator_manager(const char* cmds, int nb_pipes, const char* shell = 0) :
+    cmds_(cmds),
+    pipes_(nb_pipes),
+    manager_pid_(-1),
+    shell_(shell),
+    kill_signal_(0)
+  {
+    if(!cmds_.good())
+      throw std::runtime_error(err::msg() << "Failed to open cmds file '" << cmds << "'");
+    if(!shell_)
+      shell_ = getenv("SHELL");
+    if(!shell_)
+      shell_ = "/bin/sh";
+  }
+  ~generator_manager() { wait(); }
+
+  const tmp_pipes& pipes() const { return pipes_; }
+  pid_t pid() const { return manager_pid_; }
+
+  // Start the manager process
+  void start();
+  // Wait for manager process to finish. Return true if it finishes
+  // with no error, false otherwise.
+  bool wait();
+
+private:
+  /// Read commands from the cmds stream. There is one command per
+  /// line. Empty lines or lines whose first non-white space character
+  /// is a # are ignored. Return an empty string when no more commands
+  /// are available.
+  std::string get_cmd();
+  void start_commands();
+  void start_one_command(const std::string& command, int pipe);
+  bool display_status(int status, const std::string& command);
+  void setup_signal_handlers();
+  void unset_signal_handlers();
+  static void signal_handler(int signal);
+  void cleanup();
+};
+}
+
+#endif /* __JELLYFISH_SPAWN_EXTERNAL_HPP_ */
diff --git a/include/jellyfish/generic_file_header.hpp b/include/jellyfish/generic_file_header.hpp
new file mode 100644
index 0000000..a8ddf82
--- /dev/null
+++ b/include/jellyfish/generic_file_header.hpp
@@ -0,0 +1,255 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_GENERIC_FILE_HEADER_HPP__
+#define __JELLYFISH_GENERIC_FILE_HEADER_HPP__
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_NSGETEXECUTABLEPATH
+#include <mach-o/dyld.h>
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/utsname.h>
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include <jellyfish/json.h>
+
+namespace jellyfish {
+/// Generic file header. It contains by default the hostname, the
+/// current time, the current working directory and the path to the
+/// executable.
+class generic_file_header {
+protected:
+  static const int MAX_HEADER_DIGITS = 9;
+  Json::Value      root_;
+  size_t           offset_;     // Nb of bytes past header
+
+  struct buffer {
+    char* data;
+    buffer(size_t size) : data(new char[size]) { }
+    ~buffer() { delete [] data; }
+  };
+
+  struct restore_fmtflags {
+    std::ostream&      os_;
+    std::ios::fmtflags flags_;
+    std::streamsize    width_;
+    char               fill_;
+    restore_fmtflags(std::ostream& os) :
+      os_(os), flags_(os.flags(std::ios::fmtflags())), width_(os.width()), fill_(os.fill())
+    { }
+    ~restore_fmtflags() {
+      os_.flags(flags_);
+      os_.width(width_);
+      os_.fill(fill_);
+    }
+  };
+
+  static void chomp(std::string& s) {
+    size_t found  = s.find_last_not_of(" \t\f\v\n\r");
+    if (found != std::string::npos)
+      s.erase(found+1);
+    else
+      s.clear();
+  }
+
+public:
+  explicit generic_file_header(int alignment = 0)
+  {
+    root_["alignment"] = alignment;
+  }
+
+  bool operator==(const generic_file_header& rhs) const {
+    std::cerr << "operator== " << (root_ == rhs.root_) << "\n";
+    return root_ == rhs.root_;
+  }
+  bool operator!=(const generic_file_header& rhs) const { return root_ != rhs.root_; }
+
+  /// Write the header to an output stream. The format will be: the
+  /// length written in text and decimal, followed by the header in
+  /// terse JSON format, followed by some padding to align according
+  /// to the `alignment_` member.
+  void write(std::ostream& os) {
+    restore_fmtflags flags(os);
+    Json::FastWriter writer;
+    std::string      header = writer.write(root_);
+    chomp(header);
+
+    int align   = alignment();
+    int padding = 0;
+    size_t hlen = header.size();
+    if(align > 0) {
+      padding = (MAX_HEADER_DIGITS + header.size()) % align;
+      if(padding)
+        hlen += align - padding;
+    }
+    os << std::dec << std::right << std::setw(MAX_HEADER_DIGITS) << std::setfill('0') << hlen;
+    os.write(header.c_str(), header.size());
+    offset_ = MAX_HEADER_DIGITS + hlen;
+
+    if(padding) {
+      char pad[align - padding];
+      memset(pad, '\0', align - padding);
+      os.write(pad, align - padding);
+    }
+  }
+
+  /// Read an input stream to search for a header. If one is found,
+  /// true is returned. In that case, the position in the input stream points after the header and padding.
+  ///
+  /// If false is returned, the parsing failed. The
+  /// position in the input stream may have changed and the keys
+  /// present in this header may be anything.
+  bool read(std::istream& is) {
+    std::string len;
+    int i;
+    for(i = 0; i < MAX_HEADER_DIGITS && isdigit(is.peek()); ++i)
+      len += is.get();
+    if(is.peek() != '{')
+      return false;
+    unsigned long hlen = atol(len.c_str());
+    if(hlen < 2)
+      return false;
+
+    offset_ = MAX_HEADER_DIGITS + hlen;
+    buffer hbuf(hlen);
+    is.read(hbuf.data, hlen);
+    if(!is.good())
+      return false;
+    const char* end = hbuf.data + hlen;
+    while(end > hbuf.data && *(end - 1) == '\0') --end;
+
+    Json::Reader reader;
+    if(!reader.parse(hbuf.data, end, root_, false))
+      return false;
+
+    return true;
+  }
+
+  const Json::Value root() const { return root_; }
+
+  void fill_standard() {
+    root_["hostname"] = get_hostname();
+    root_["pwd"]      = get_pwd();
+    root_["time"]     = get_localtime();
+    root_["exe_path"] = get_exe_path();
+  }
+
+  std::string operator[](const std::string& key) const { return root_.get(key, "").asString(); }
+  std::string operator[](const char* key) const { return root_.get(key, "").asString(); }
+  int alignment() const { return std::max(0, root_.get("alignment", 0).asInt()); }
+  size_t offset() const { return offset_; }
+
+  std::vector<std::string> cmdline() const {
+    std::vector<std::string> res;
+    for(unsigned int i = 0; i < root_["cmdline"].size(); ++i)
+      res.push_back(root_["cmdline"][i].asString());
+    return res;
+  }
+
+
+  void set_cmdline(int argc, char* argv[]) {
+    root_["cmdline"].clear();
+    for(int i = 0; i < argc; i++)
+      root_["cmdline"].append(argv[i]);
+  }
+
+protected:
+  std::string get_hostname() const {
+    struct utsname buf;
+    if(uname(&buf) == -1)
+      return "";
+    return buf.nodename;
+  }
+
+  std::string get_pwd() const {
+#ifdef PATH_MAX
+    size_t len = PATH_MAX;
+#else
+    size_t len = 1024;
+#endif
+    char path[len + 1];
+
+    if(!getcwd(path, len + 1))
+      path[0] = '\0';
+    return path;
+  }
+
+  std::string get_localtime() const {
+    time_t t = time(0);
+    std::string res(ctime(&t));
+    chomp(res);
+    return res;
+  }
+
+  std::string get_exe_path() const {
+#ifdef HAVE_NSGETEXECUTABLEPATH
+    return get_exe_path_macosx();
+#else
+    return get_exe_path_linux();
+#endif
+  }
+
+#ifdef HAVE_NSGETEXECUTABLEPATH
+  std::string get_exe_path_macosx() const {
+#ifdef MAXPATHLEN
+    size_t len = MAXPATHLEN;
+#else
+    size_t len = 1024;
+#endif
+
+    char path[len + 1];
+    if(_NSGetExecutablePath(path, (uint32_t*)&len) == -1)
+      return "";
+
+    return std::string(path);
+  }
+#endif // HAVE_NSGETEXECUTABLEPATH
+
+  std::string get_exe_path_linux() const {
+#ifdef PATH_MAX
+    size_t len = PATH_MAX;
+#else
+    size_t len = 1024;
+#endif
+
+    char path[len + 1];
+    ssize_t l = readlink("/proc/self/exe", path, len + 1);
+    if(l == -1)
+      return "";
+    return std::string(path, l);
+  }
+};
+
+inline std::ostream& operator<<(std::ostream& os, const generic_file_header& h) {
+  Json::StyledWriter w;
+  return os << w.write(h.root());
+}
+
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_GENERIC_FILE_HEADER_HPP__ */
diff --git a/include/jellyfish/hash_counter.hpp b/include/jellyfish/hash_counter.hpp
new file mode 100644
index 0000000..9b18bab
--- /dev/null
+++ b/include/jellyfish/hash_counter.hpp
@@ -0,0 +1,244 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __HASH_COUNTER_HPP__
+#define __HASH_COUNTER_HPP__
+
+#include <stdexcept>
+
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/dumper.hpp>
+
+/// Cooperative version of the hash_counter. In this implementation,
+/// it is expected that the given number of threads will call the
+/// `add` method regularly. In case the hash table is full, it gets
+/// enlarged using all the threads. After the work is done, every
+/// thread must call promptly the `done` method.
+
+namespace jellyfish{ namespace cooperative {
+
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc, typename mem_block_t = ::allocators::mmap>
+class hash_counter {
+public:
+  typedef typename large_hash::array<Key, word, atomic_t, mem_block_t> array;
+  typedef typename array::key_type                                     key_type;
+  typedef typename array::mapped_type                                  mapped_type;
+  typedef typename array::value_type                                   value_type;
+  typedef typename array::reference                                    reference;
+  typedef typename array::const_reference                              const_reference;
+  typedef typename array::pointer                                      pointer;
+  typedef typename array::const_pointer                                const_pointer;
+  typedef typename array::eager_iterator                               eager_iterator;
+  typedef typename array::lazy_iterator                                lazy_iterator;
+
+protected:
+  array*                  ary_;
+  array*                  new_ary_;
+  uint16_t                nb_threads_;
+  locks::pthread::barrier size_barrier_;
+  volatile uint16_t       size_thid_, done_threads_;
+  bool                    do_size_doubling_;
+  dumper_t<array>*        dumper_;
+
+public:
+  hash_counter(size_t size, // Size of hash. To be rounded up to a power of 2
+               uint16_t key_len, // Size of key in bits
+               uint16_t val_len, // Size of val in bits
+               uint16_t nb_threads, // Number of threads accessing this hash
+               uint16_t reprobe_limit = 126, // Maximum reprobe
+               const size_t* reprobes = jellyfish::quadratic_reprobes) :
+    ary_(new array(size, key_len, val_len, reprobe_limit, reprobes)),
+    new_ary_(0),
+    nb_threads_(nb_threads),
+    size_barrier_(nb_threads),
+    size_thid_(0),
+    done_threads_(0),
+    do_size_doubling_(true),
+    dumper_(0)
+  { }
+
+  ~hash_counter() {
+    delete ary_;
+  }
+
+  array* ary() { return ary_; }
+  const array* ary() const { return ary_; }
+  size_t size() const { return ary_->size(); }
+  uint16_t key_len() const { return ary_->key_len(); }
+  uint16_t val_len() const { return ary_->val_len(); }
+  uint16_t nb_threads() const { return nb_threads; }
+  uint16_t reprobe_limit() const { return ary_->max_reprobe(); }
+
+
+  /// Whether we attempt to double the size of the hash when full.
+  bool do_size_doubling() const { return do_size_doubling_; }
+  /// Set whether we attempt to double the size of the hash when full.
+  void do_size_doubling(bool v) { do_size_doubling_ = v; }
+
+  /// Set dumper responsible for cleaning out the array.
+  void dumper(dumper_t<array> *d) { dumper_ = d; }
+
+  /// Add `v` to the entry `k`. It returns in `is_new` true if the
+  /// entry `k` did not exist in the hash. In `id` is returned the
+  /// final position of `k` in the hash array.
+  void add(const Key& k, uint64_t v, bool* is_new, size_t* id) {
+    unsigned int carry_shift  = 0;
+    bool*        is_new_ptr   = is_new;
+    size_t*      id_ptr       = id;
+    bool         is_new_void  = false;
+    size_t       id_void      = false;
+
+    while(!ary_->add(k, v, &carry_shift, is_new_ptr, id_ptr)) {
+      handle_full_ary();
+      v &= ~(uint64_t)0 << carry_shift;
+      // If carry_shift == 0, failed to allocate the first field for
+      // key, hence status of is_new and value for id are not
+      // determined yet. On the other hand, if carry_shift > 0, we
+      // failed while adding extra field for large key, so the status
+      // of is_new and value of id are known. We do not update them in future
+      // calls.
+      if(carry_shift) {
+        is_new_ptr = &is_new_void;
+        id_ptr     = &id_void;
+      }
+    }
+  }
+
+  /// Add `v` to the entry `k`. This method is multi-thread safe. If
+  /// the entry for `k` does not exists, it is inserted.
+  ///
+  /// @param k Key to add to
+  /// @param v Value to add
+  inline void add(const Key& k, uint64_t v) {
+    bool   is_new;
+    size_t id;
+    add(k, v, &is_new, &id);
+  }
+
+  /// Insert the key `k` in the hash. The value is not changed or set
+  /// to 0 if not already in the hash.
+  ///
+  /// @param k Key to insert
+  inline void set(const Key& k) {
+    bool   is_new;
+    size_t id;
+    set(k, &is_new, &id);
+  }
+
+  /// Insert the key `k` in the hash. The value is not changed or set
+  /// to 0 if not already in the hash. Set `is_new` to true if `k` did
+  /// not already exist in the hash. In `id` is returned the final
+  /// position of `k` in the hash.
+  void set(const Key& k, bool* is_new, size_t* id) {
+    while(!ary_->set(k, is_new, id))
+      handle_full_ary();
+  }
+
+  /// Update the value of key `k` by adding `v`, if `k` is already
+  /// present in the hash, otherwise this nothing happens. Returns
+  /// true if `k` is already in the hash, false otherwise.
+  bool update_add(const Key& k, uint64_t v) {
+    Key tmp_key;
+    return update_add(k, v, tmp_key);
+  }
+
+  bool update_add(const Key& k, uint64_t v, Key& tmp_key) {
+    unsigned int carry_shift = 0;
+
+    while(true) {
+      if(ary_->update_add(k, v, &carry_shift, tmp_key))
+        return true;
+      if(carry_shift == 0)
+        return false;
+      handle_full_ary();
+      v &= ~(uint64_t)0 << carry_shift;
+    }
+  }
+
+  /// Signify that thread is done and wait for all threads to be done.
+  void done() {
+    atomic_t::fetch_add(&done_threads_, (uint16_t)1);
+    while(!handle_full_ary()) ;
+  }
+
+protected:
+  // Double the size of the hash and return false. Unless all the
+  // thread have reported they are done, in which case do nothing and
+  // return true.
+  bool handle_full_ary() {
+    bool serial_thread = size_barrier_.wait();
+    if(done_threads_ >= nb_threads_) // All done?
+      return true;
+
+    bool success = false;
+    if(do_size_doubling_)
+      success = success || double_size(serial_thread);
+
+    if(!success && dumper_) {
+      if(serial_thread)
+        dumper_->dump(ary_);
+      success = true;
+      size_barrier_.wait();
+    }
+
+    if(!success)
+      throw std::runtime_error("Hash full");
+
+    return false;
+  }
+
+  bool double_size(bool serial_thread) {
+    if(serial_thread) {// Allocate new array for size doubling
+      try {
+        new_ary_   = new array(ary_->size() * 2, ary_->key_len(), ary_->val_len(),
+                               ary_->max_reprobe(), ary_->reprobes());
+       } catch(typename array::ErrorAllocation e) {
+        new_ary_ = 0;
+      }
+    }
+    size_thid_ = 0;
+
+    size_barrier_.wait();
+    array* my_ary = *(array* volatile*)&new_ary_;
+    if(!my_ary) // Allocation failed
+      return false;
+
+    // Copy data from old to new
+    uint16_t       id = atomic_t::fetch_add(&size_thid_, (uint16_t)1);
+    // Why doesn't the following work? Seems like a bug to
+    // me. Equivalent call works in test_large_hash_array. Or am I
+    // missing something?
+    // eager_iterator it = ary_->iterator_slice<eager_iterator>(id, nb_threads_);
+    eager_iterator it = ary_->eager_slice(id, nb_threads_);
+    while(it.next())
+      my_ary->add(it.key(), it.val());
+
+    size_barrier_.wait();
+
+    if(serial_thread) { // Set new ary to be current and free old
+      delete ary_;
+      ary_ = new_ary_;
+    }
+
+    // Done. Last sync point
+    size_barrier_.wait();
+    return true;
+  }
+};
+
+} } // namespace jellyfish { namespace cooperative {
+#endif /* __HASH_COUNTER_HPP__ */
diff --git a/include/jellyfish/int128.hpp b/include/jellyfish/int128.hpp
new file mode 100644
index 0000000..56ab25a
--- /dev/null
+++ b/include/jellyfish/int128.hpp
@@ -0,0 +1,203 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _INT128_H_
+#define _INT128_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#ifndef HAVE_INT128
+#error "The type __int128 is not supported"
+#endif
+#endif
+
+#include <unistd.h>
+#include <stdint.h>
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <cstring>
+
+// Output of __int128: this might be slow
+namespace __int128_ns {
+template<int base>
+void __print_digits(std::ostream& os, unsigned __int128 x,
+                    bool lower = true) {
+  char buf[50];
+  char* ptr = buf + sizeof(buf);
+  do {
+    int o  = x % base;
+    if(o < 10) {
+      *--ptr = '0' + o;
+    } else {
+      *--ptr = (lower ? 'a' : 'A') + o - 10;
+    }
+    x     /= base;
+  } while (x > 0);
+  os.write(ptr, buf + sizeof(buf) - ptr);
+}
+
+inline bool is_negative(unsigned __int128 x) { return false; }
+inline bool is_negative(__int128 x) { return x < 0; }
+
+template<typename T>
+void __print_decimal(std::ostream& prefix, std::ostream& os, T x,
+                     const std::ios::fmtflags& ff) {
+  if((ff & std::ios::showpos) && x > 0)
+    prefix << "+";
+  if(x == 0) {
+    os << "0";
+    return;
+  }
+  if(is_negative(x)) {
+    prefix << "-";
+    x = -x;
+  }
+  __print_digits<10>(os, x);
+}
+
+void __print_bases(std::ostream& prefix, std::ostream& os,
+                   unsigned __int128 x, 
+                   const std::ios::fmtflags& ff);
+
+template<typename T>
+void __print_buf(std::ostream& prefix, std::ostream& os, T x,
+                 const std::ios::fmtflags& ff) {
+  if(ff & std::ios::dec)
+    __print_decimal(prefix, os, x, ff);
+  else
+    __print_bases(prefix, os, (unsigned __int128)x, ff);
+}
+
+template<typename T>
+void __print(std::ostream&os, T x) {
+  const std::ios_base::fmtflags ff = os.flags();
+
+  if(!(ff & std::ios::adjustfield))
+    return __print_buf(os, os, x, ff);
+
+  std::ostringstream prefix;
+  std::ostringstream buf;
+  __print_buf(prefix, buf, x, ff);
+  ssize_t nb_padding = os.width() - (prefix.str().size() + buf.str().size());
+  if(nb_padding <= 0) {
+    os.write(prefix.str().c_str(), prefix.tellp());
+    os.write(buf.str().c_str(), buf.tellp());
+    return;
+  }
+
+  char padding[nb_padding];
+  memset(padding, os.fill(), nb_padding);
+  if(ff & std::ios::right)
+    os.write(padding, nb_padding);
+  os.write(prefix.str().c_str(), prefix.tellp());
+  if(ff & std::ios::internal)
+    os.write(padding, nb_padding);
+  os.write(buf.str().c_str(), buf.tellp());
+  if(ff & std::ios::left)
+    os.write(padding, nb_padding);
+}
+}
+
+inline
+std::ostream& operator<<(std::ostream& os, __int128 x) {
+  __int128_ns::__print(os, x);
+  return os;
+}
+
+inline
+std::ostream& operator<<(std::ostream& os, unsigned __int128 x) {
+  __int128_ns::__print(os, x);
+  return os;
+}
+
+#ifndef HAVE_NUMERIC_LIMITS128
+namespace std {
+template<>
+class numeric_limits<__int128> {
+public:
+  static const bool is_specialized = true;
+  static __int128 max() { return (unsigned __int128)-1 >> 1; }
+  static __int128 min() { return  max() + 1; }
+  static const int  digits     = 127;
+  static const int  digits10   = 38;
+#define NLS64 numeric_limits<int64_t>
+  static const bool is_signed  = NLS64::is_signed;
+  static const bool is_integer = NLS64::is_integer;
+  static const bool is_exact   = NLS64::is_exact;
+  static const int  radix      = NLS64::radix;
+  static __int128 epsilon() { return NLS64::epsilon(); }
+  static __int128 round_error() { return NLS64::round_error(); }
+  static const int                min_exponent      = NLS64::min_exponent;
+  static const int                min_exponent10    = NLS64::min_exponent10;
+  static const int                max_exponent      = NLS64::max_exponent;
+  static const int                max_exponent10    = NLS64::max_exponent10;
+  static const bool               has_infinity      = NLS64::has_infinity;
+  static const bool               has_quiet_NaN     = NLS64::has_quiet_NaN;
+  static const bool               has_signaling_NaN = NLS64::has_signaling_NaN;
+  static const float_denorm_style has_denorm        = NLS64::has_denorm;
+  static const bool               has_denorm_loss   = NLS64::has_denorm_loss;
+  static __int128 infinity() { return NLS64::infinity(); }
+  static __int128 quiet_NaN() { return NLS64::quiet_NaN(); }
+  static __int128 signaling_NaN() { return NLS64::signaling_NaN(); }
+  static __int128 denorm_min() { return NLS64::denorm_min(); }
+  static const bool              is_iec559       = NLS64::is_iec559;
+  static const bool              is_bounded      = NLS64::is_bounded;
+  static const bool              is_modulo       = NLS64::is_modulo;
+  static const bool              traps           = NLS64::traps;
+  static const bool              tinyness_before = NLS64::tinyness_before;
+  static const float_round_style round_style     = NLS64::round_style;
+};
+
+template<>
+class numeric_limits<unsigned __int128> {
+public:
+  static const bool is_specialized = true;
+  static __int128 max() { return (unsigned __int128)-1; }
+  static __int128 min() { return  0; }
+  static const int  digits     = 128;
+  static const int  digits10   = 39;
+#define NLU64 numeric_limits<uint64_t>
+  static const bool is_signed  = NLU64::is_signed;
+  static const bool is_integer = NLU64::is_integer;
+  static const bool is_exact   = NLU64::is_exact;
+  static const int  radix      = NLU64::radix;
+  static __int128 epsilon() { return NLU64::epsilon(); }
+  static __int128 round_error() { return NLU64::round_error(); }
+  static const int                min_exponent      = NLU64::min_exponent;
+  static const int                min_exponent10    = NLU64::min_exponent10;
+  static const int                max_exponent      = NLU64::max_exponent;
+  static const int                max_exponent10    = NLU64::max_exponent10;
+  static const bool               has_infinity      = NLU64::has_infinity;
+  static const bool               has_quiet_NaN     = NLU64::has_quiet_NaN;
+  static const bool               has_signaling_NaN = NLU64::has_signaling_NaN;
+  static const float_denorm_style has_denorm        = NLU64::has_denorm;
+  static const bool               has_denorm_loss   = NLU64::has_denorm_loss;
+  static __int128 infinity() { return NLU64::infinity(); }
+  static __int128 quiet_NaN() { return NLU64::quiet_NaN(); }
+  static __int128 signaling_NaN() { return NLU64::signaling_NaN(); }
+  static __int128 denorm_min() { return NLU64::denorm_min(); }
+  static const bool              is_iec559       = NLU64::is_iec559;
+  static const bool              is_bounded      = NLU64::is_bounded;
+  static const bool              is_modulo       = NLU64::is_modulo;
+  static const bool              traps           = NLU64::traps;
+  static const bool              tinyness_before = NLU64::tinyness_before;
+  static const float_round_style round_style     = NLU64::round_style;
+};
+} // namespace std
+#endif /* HAVE_NUMERIC_LIMITS128 */
+
+#endif /* _INT128_H_ */
diff --git a/include/jellyfish/jellyfish.hpp b/include/jellyfish/jellyfish.hpp
new file mode 100644
index 0000000..eec4e84
--- /dev/null
+++ b/include/jellyfish/jellyfish.hpp
@@ -0,0 +1,37 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_JELLYFISH_HPP__
+#define __JELLYFISH_JELLYFISH_HPP__
+
+#include <stdint.h>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/binary_dumper.hpp>
+
+typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> mer_hash;
+typedef mer_hash::array mer_array;
+typedef jellyfish::text_dumper<mer_array> text_dumper;
+typedef jellyfish::text_reader<jellyfish::mer_dna, uint64_t> text_reader;
+typedef jellyfish::binary_dumper<mer_array> binary_dumper;
+typedef jellyfish::binary_reader<jellyfish::mer_dna, uint64_t> binary_reader;
+typedef jellyfish::binary_query_base<jellyfish::mer_dna, uint64_t> binary_query;
+typedef jellyfish::binary_writer<jellyfish::mer_dna, uint64_t> binary_writer;
+typedef jellyfish::text_writer<jellyfish::mer_dna, uint64_t> text_writer;
+
+
+#endif /* __JELLYFISH_JELLYFISH_HPP__ */
diff --git a/include/jellyfish/json.h b/include/jellyfish/json.h
new file mode 100644
index 0000000..3f81d01
--- /dev/null
+++ b/include/jellyfish/json.h
@@ -0,0 +1,1855 @@
+/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).
+/// It is intented to be used with #include <jellyfish/json.h>
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+/*
+The JsonCpp library's source code, including accompanying documentation, 
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all 
+jurisdictions which recognize such a disclaimer. In such jurisdictions, 
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this 
+software may choose to accept it either as 1) Public Domain, 2) under the 
+conditions of the MIT License (see below), or 3) under the terms of dual 
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+   http://en.wikipedia.org/wiki/MIT_License
+   
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+*/
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+#ifndef JSON_AMALGATED_H_INCLUDED
+# define JSON_AMALGATED_H_INCLUDED
+/// If defined, indicates that the source file is amalgated
+/// to prevent private header inclusion.
+#define JSON_IS_AMALGATED
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/config.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_CONFIG_H_INCLUDED
+# define JSON_CONFIG_H_INCLUDED
+
+/// If defined, indicates that json library is embedded in CppTL library.
+//# define JSON_IN_CPPTL 1
+
+/// If defined, indicates that json may leverage CppTL library
+//#  define JSON_USE_CPPTL 1
+/// If defined, indicates that cpptl vector based map should be used instead of std::map
+/// as Value container.
+//#  define JSON_USE_CPPTL_SMALLMAP 1
+/// If defined, indicates that Json specific container should be used
+/// (hash table & simple deque container with customizable allocator).
+/// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
+//#  define JSON_VALUE_USE_INTERNAL_MAP 1
+/// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
+/// The memory pools allocator used optimization (initializing Value and ValueInternalLink
+/// as if it was a POD) that may cause some validation tool to report errors.
+/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
+//#  define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
+
+/// If defined, indicates that Json use exception to report invalid type manipulation
+/// instead of C assert macro.
+/// # define JSON_USE_EXCEPTION 1
+
+/// If defined, indicates that the source file is amalgated
+/// to prevent private header inclusion.
+/// Remarks: it is automatically defined in the generated amalgated header.
+#define JSON_IS_AMALGAMATION 1
+
+
+# ifdef JSON_IN_CPPTL
+#  include <cpptl/config.h>
+#  ifndef JSON_USE_CPPTL
+#   define JSON_USE_CPPTL 1
+#  endif
+# endif
+
+# ifdef JSON_IN_CPPTL
+#  define JSON_API CPPTL_API
+# elif defined(JSON_DLL_BUILD)
+#  define JSON_API __declspec(dllexport)
+# elif defined(JSON_DLL)
+#  define JSON_API __declspec(dllimport)
+# else
+#  define JSON_API
+# endif
+
+// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
+// Storages, and 64 bits integer support is disabled.
+// #define JSON_NO_INT64 1
+
+#if defined(_MSC_VER)  &&  _MSC_VER <= 1200 // MSVC 6
+// Microsoft Visual Studio 6 only support conversion from __int64 to double
+// (no conversion from unsigned __int64).
+#define JSON_USE_INT64_DOUBLE_CONVERSION 1
+#endif // if defined(_MSC_VER)  &&  _MSC_VER < 1200 // MSVC 6
+
+#if defined(_MSC_VER)  &&  _MSC_VER >= 1500 // MSVC 2008
+/// Indicates that the following function is deprecated.
+# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
+#endif
+
+#if !defined(JSONCPP_DEPRECATED)
+# define JSONCPP_DEPRECATED(message)
+#endif // if !defined(JSONCPP_DEPRECATED)
+
+namespace Json {
+   typedef int Int;
+   typedef unsigned int UInt;
+# if defined(JSON_NO_INT64)
+   typedef int LargestInt;
+   typedef unsigned int LargestUInt;
+#  undef JSON_HAS_INT64
+# else // if defined(JSON_NO_INT64)
+   // For Microsoft Visual use specific types as long long is not supported
+#  if defined(_MSC_VER) // Microsoft Visual Studio
+   typedef __int64 Int64;
+   typedef unsigned __int64 UInt64;
+#  else // if defined(_MSC_VER) // Other platforms, use long long
+   typedef long long int Int64;
+   typedef unsigned long long int UInt64;
+#  endif // if defined(_MSC_VER)
+   typedef Int64 LargestInt;
+   typedef UInt64 LargestUInt;
+#  define JSON_HAS_INT64
+# endif // if defined(JSON_NO_INT64)
+} // end namespace Json
+
+
+#endif // JSON_CONFIG_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/config.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/forwards.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_FORWARDS_H_INCLUDED
+# define JSON_FORWARDS_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "config.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+   // writer.h
+   class FastWriter;
+   class StyledWriter;
+
+   // reader.h
+   class Reader;
+
+   // features.h
+   class Features;
+
+   // value.h
+   typedef unsigned int ArrayIndex;
+   class StaticString;
+   class Path;
+   class PathArgument;
+   class Value;
+   class ValueIteratorBase;
+   class ValueIterator;
+   class ValueConstIterator;
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   class ValueMapAllocator;
+   class ValueInternalLink;
+   class ValueInternalArray;
+   class ValueInternalMap;
+#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+} // namespace Json
+
+
+#endif // JSON_FORWARDS_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/forwards.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/features.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_FEATURES_H_INCLUDED
+# define CPPTL_JSON_FEATURES_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "forwards.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+   /** \brief Configuration passed to reader and writer.
+    * This configuration object can be used to force the Reader or Writer
+    * to behave in a standard conforming way.
+    */
+   class JSON_API Features
+   {
+   public:
+      /** \brief A configuration that allows all features and assumes all strings are UTF-8.
+       * - C & C++ comments are allowed
+       * - Root object can be any JSON value
+       * - Assumes Value strings are encoded in UTF-8
+       */
+      static Features all();
+
+      /** \brief A configuration that is strictly compatible with the JSON specification.
+       * - Comments are forbidden.
+       * - Root object must be either an array or an object value.
+       * - Assumes Value strings are encoded in UTF-8
+       */
+      static Features strictMode();
+
+      /** \brief Initialize the configuration like JsonConfig::allFeatures;
+       */
+      Features();
+
+      /// \c true if comments are allowed. Default: \c true.
+      bool allowComments_;
+
+      /// \c true if root must be either an array or an object value. Default: \c false.
+      bool strictRoot_;
+   };
+
+} // namespace Json
+
+#endif // CPPTL_JSON_FEATURES_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/features.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/value.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_H_INCLUDED
+# define CPPTL_JSON_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "forwards.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <string>
+# include <vector>
+
+# ifndef JSON_USE_CPPTL_SMALLMAP
+#  include <map>
+# else
+#  include <cpptl/smallmap.h>
+# endif
+# ifdef JSON_USE_CPPTL
+#  include <cpptl/forwards.h>
+# endif
+
+/** \brief JSON (JavaScript Object Notation).
+ */
+namespace Json {
+
+   /** \brief Type of the value held by a Value object.
+    */
+   enum ValueType
+   {
+      nullValue = 0, ///< 'null' value
+      intValue,      ///< signed integer value
+      uintValue,     ///< unsigned integer value
+      realValue,     ///< double value
+      stringValue,   ///< UTF-8 string value
+      booleanValue,  ///< bool value
+      arrayValue,    ///< array value (ordered list)
+      objectValue    ///< object value (collection of name/value pairs).
+   };
+
+   enum CommentPlacement
+   {
+      commentBefore = 0,        ///< a comment placed on the line before a value
+      commentAfterOnSameLine,   ///< a comment just after a value on the same line
+      commentAfter,             ///< a comment on the line after a value (only make sense for root value)
+      numberOfCommentPlacement
+   };
+
+//# ifdef JSON_USE_CPPTL
+//   typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
+//   typedef CppTL::AnyEnumerator<const Value &> EnumValues;
+//# endif
+
+   /** \brief Lightweight wrapper to tag static string.
+    *
+    * Value constructor and objectValue member assignement takes advantage of the
+    * StaticString and avoid the cost of string duplication when storing the
+    * string or the member name.
+    *
+    * Example of usage:
+    * \code
+    * Json::Value aValue( StaticString("some text") );
+    * Json::Value object;
+    * static const StaticString code("code");
+    * object[code] = 1234;
+    * \endcode
+    */
+   class JSON_API StaticString
+   {
+   public:
+      explicit StaticString( const char *czstring )
+         : str_( czstring )
+      {
+      }
+
+      operator const char *() const
+      {
+         return str_;
+      }
+
+      const char *c_str() const
+      {
+         return str_;
+      }
+
+   private:
+      const char *str_;
+   };
+
+   /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
+    *
+    * This class is a discriminated union wrapper that can represents a:
+    * - signed integer [range: Value::minInt - Value::maxInt]
+    * - unsigned integer (range: 0 - Value::maxUInt)
+    * - double
+    * - UTF-8 string
+    * - boolean
+    * - 'null'
+    * - an ordered list of Value
+    * - collection of name/value pairs (javascript object)
+    *
+    * The type of the held value is represented by a #ValueType and 
+    * can be obtained using type().
+    *
+    * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. 
+    * Non const methods will automatically create the a #nullValue element 
+    * if it does not exist. 
+    * The sequence of an #arrayValue will be automatically resize and initialized 
+    * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
+    *
+    * The get() methods can be used to obtanis default value in the case the required element
+    * does not exist.
+    *
+    * It is possible to iterate over the list of a #objectValue values using 
+    * the getMemberNames() method.
+    */
+   class JSON_API Value 
+   {
+      friend class ValueIteratorBase;
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+      friend class ValueInternalLink;
+      friend class ValueInternalMap;
+# endif
+   public:
+      typedef std::vector<std::string> Members;
+      typedef ValueIterator iterator;
+      typedef ValueConstIterator const_iterator;
+      typedef Json::UInt UInt;
+      typedef Json::Int Int;
+# if defined(JSON_HAS_INT64)
+      typedef Json::UInt64 UInt64;
+      typedef Json::Int64 Int64;
+#endif // defined(JSON_HAS_INT64)
+      typedef Json::LargestInt LargestInt;
+      typedef Json::LargestUInt LargestUInt;
+      typedef Json::ArrayIndex ArrayIndex;
+
+      static const Value null;
+      /// Minimum signed integer value that can be stored in a Json::Value.
+      static const LargestInt minLargestInt;
+      /// Maximum signed integer value that can be stored in a Json::Value.
+      static const LargestInt maxLargestInt;
+      /// Maximum unsigned integer value that can be stored in a Json::Value.
+      static const LargestUInt maxLargestUInt;
+
+      /// Minimum signed int value that can be stored in a Json::Value.
+      static const Int minInt;
+      /// Maximum signed int value that can be stored in a Json::Value.
+      static const Int maxInt;
+      /// Maximum unsigned int value that can be stored in a Json::Value.
+      static const UInt maxUInt;
+
+      /// Minimum signed 64 bits int value that can be stored in a Json::Value.
+      static const Int64 minInt64;
+      /// Maximum signed 64 bits int value that can be stored in a Json::Value.
+      static const Int64 maxInt64;
+      /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
+      static const UInt64 maxUInt64;
+
+   private:
+#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+# ifndef JSON_VALUE_USE_INTERNAL_MAP
+      class CZString 
+      {
+      public:
+         enum DuplicationPolicy 
+         {
+            noDuplication = 0,
+            duplicate,
+            duplicateOnCopy
+         };
+         CZString( ArrayIndex index );
+         CZString( const char *cstr, DuplicationPolicy allocate );
+         CZString( const CZString &other );
+         ~CZString();
+         CZString &operator =( const CZString &other );
+         bool operator<( const CZString &other ) const;
+         bool operator==( const CZString &other ) const;
+         ArrayIndex index() const;
+         const char *c_str() const;
+         bool isStaticString() const;
+      private:
+         void swap( CZString &other );
+         const char *cstr_;
+         ArrayIndex index_;
+      };
+
+   public:
+#  ifndef JSON_USE_CPPTL_SMALLMAP
+      typedef std::map<CZString, Value> ObjectValues;
+#  else
+      typedef CppTL::SmallMap<CZString, Value> ObjectValues;
+#  endif // ifndef JSON_USE_CPPTL_SMALLMAP
+# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
+#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+   public:
+      /** \brief Create a default Value of the given type.
+
+        This is a very useful constructor.
+        To create an empty array, pass arrayValue.
+        To create an empty object, pass objectValue.
+        Another Value can then be set to this one by assignment.
+    This is useful since clear() and resize() will not alter types.
+
+        Examples:
+    \code
+    Json::Value null_value; // null
+    Json::Value arr_value(Json::arrayValue); // []
+    Json::Value obj_value(Json::objectValue); // {}
+    \endcode
+      */
+      Value( ValueType type = nullValue );
+      Value( Int value );
+      Value( UInt value );
+#if defined(JSON_HAS_INT64)
+      Value( Int64 value );
+      Value( UInt64 value );
+#endif // if defined(JSON_HAS_INT64)
+      Value( double value );
+      Value( const char *value );
+      Value( const char *beginValue, const char *endValue );
+      /** \brief Constructs a value from a static string.
+
+       * Like other value string constructor but do not duplicate the string for
+       * internal storage. The given string must remain alive after the call to this
+       * constructor.
+       * Example of usage:
+       * \code
+       * Json::Value aValue( StaticString("some text") );
+       * \endcode
+       */
+      Value( const StaticString &value );
+      Value( const std::string &value );
+# ifdef JSON_USE_CPPTL
+      Value( const CppTL::ConstString &value );
+# endif
+      Value( bool value );
+      Value( const Value &other );
+      ~Value();
+
+      Value &operator=( const Value &other );
+      /// Swap values.
+      /// \note Currently, comments are intentionally not swapped, for
+      /// both logic and efficiency.
+      void swap( Value &other );
+
+      ValueType type() const;
+
+      bool operator <( const Value &other ) const;
+      bool operator <=( const Value &other ) const;
+      bool operator >=( const Value &other ) const;
+      bool operator >( const Value &other ) const;
+
+      bool operator ==( const Value &other ) const;
+      bool operator !=( const Value &other ) const;
+
+      int compare( const Value &other ) const;
+
+      const char *asCString() const;
+      std::string asString() const;
+# ifdef JSON_USE_CPPTL
+      CppTL::ConstString asConstString() const;
+# endif
+      Int asInt() const;
+      UInt asUInt() const;
+      Int64 asInt64() const;
+      UInt64 asUInt64() const;
+      LargestInt asLargestInt() const;
+      LargestUInt asLargestUInt() const;
+      float asFloat() const;
+      double asDouble() const;
+      bool asBool() const;
+
+      bool isNull() const;
+      bool isBool() const;
+      bool isInt() const;
+      bool isUInt() const;
+      bool isIntegral() const;
+      bool isDouble() const;
+      bool isNumeric() const;
+      bool isString() const;
+      bool isArray() const;
+      bool isObject() const;
+
+      bool isConvertibleTo( ValueType other ) const;
+
+      /// Number of values in array or object
+      ArrayIndex size() const;
+
+      /// \brief Return true if empty array, empty object, or null;
+      /// otherwise, false.
+      bool empty() const;
+
+      /// Return isNull()
+      bool operator!() const;
+
+      /// Remove all object members and array elements.
+      /// \pre type() is arrayValue, objectValue, or nullValue
+      /// \post type() is unchanged
+      void clear();
+
+      /// Resize the array to size elements. 
+      /// New elements are initialized to null.
+      /// May only be called on nullValue or arrayValue.
+      /// \pre type() is arrayValue or nullValue
+      /// \post type() is arrayValue
+      void resize( ArrayIndex size );
+
+      /// Access an array element (zero based index ).
+      /// If the array contains less than index element, then null value are inserted
+      /// in the array so that its size is index+1.
+      /// (You may need to say 'value[0u]' to get your compiler to distinguish
+      ///  this from the operator[] which takes a string.)
+      Value &operator[]( ArrayIndex index );
+
+      /// Access an array element (zero based index ).
+      /// If the array contains less than index element, then null value are inserted
+      /// in the array so that its size is index+1.
+      /// (You may need to say 'value[0u]' to get your compiler to distinguish
+      ///  this from the operator[] which takes a string.)
+      Value &operator[]( int index );
+
+      /// Access an array element (zero based index )
+      /// (You may need to say 'value[0u]' to get your compiler to distinguish
+      ///  this from the operator[] which takes a string.)
+      const Value &operator[]( ArrayIndex index ) const;
+
+      /// Access an array element (zero based index )
+      /// (You may need to say 'value[0u]' to get your compiler to distinguish
+      ///  this from the operator[] which takes a string.)
+      const Value &operator[]( int index ) const;
+
+      /// If the array contains at least index+1 elements, returns the element value, 
+      /// otherwise returns defaultValue.
+      Value get( ArrayIndex index, 
+                 const Value &defaultValue ) const;
+      /// Return true if index < size().
+      bool isValidIndex( ArrayIndex index ) const;
+      /// \brief Append value to array at the end.
+      ///
+      /// Equivalent to jsonvalue[jsonvalue.size()] = value;
+      Value &append( const Value &value );
+
+      /// Access an object value by name, create a null member if it does not exist.
+      Value &operator[]( const char *key );
+      /// Access an object value by name, returns null if there is no member with that name.
+      const Value &operator[]( const char *key ) const;
+      /// Access an object value by name, create a null member if it does not exist.
+      Value &operator[]( const std::string &key );
+      /// Access an object value by name, returns null if there is no member with that name.
+      const Value &operator[]( const std::string &key ) const;
+      /** \brief Access an object value by name, create a null member if it does not exist.
+
+       * If the object as no entry for that name, then the member name used to store
+       * the new entry is not duplicated.
+       * Example of use:
+       * \code
+       * Json::Value object;
+       * static const StaticString code("code");
+       * object[code] = 1234;
+       * \endcode
+       */
+      Value &operator[]( const StaticString &key );
+# ifdef JSON_USE_CPPTL
+      /// Access an object value by name, create a null member if it does not exist.
+      Value &operator[]( const CppTL::ConstString &key );
+      /// Access an object value by name, returns null if there is no member with that name.
+      const Value &operator[]( const CppTL::ConstString &key ) const;
+# endif
+      /// Return the member named key if it exist, defaultValue otherwise.
+      Value get( const char *key, 
+                 const Value &defaultValue ) const;
+      /// Return the member named key if it exist, defaultValue otherwise.
+      Value get( const std::string &key,
+                 const Value &defaultValue ) const;
+# ifdef JSON_USE_CPPTL
+      /// Return the member named key if it exist, defaultValue otherwise.
+      Value get( const CppTL::ConstString &key,
+                 const Value &defaultValue ) const;
+# endif
+      /// \brief Remove and return the named member.  
+      ///
+      /// Do nothing if it did not exist.
+      /// \return the removed Value, or null.
+      /// \pre type() is objectValue or nullValue
+      /// \post type() is unchanged
+      Value removeMember( const char* key );
+      /// Same as removeMember(const char*)
+      Value removeMember( const std::string &key );
+
+      /// Return true if the object has a member named key.
+      bool isMember( const char *key ) const;
+      /// Return true if the object has a member named key.
+      bool isMember( const std::string &key ) const;
+# ifdef JSON_USE_CPPTL
+      /// Return true if the object has a member named key.
+      bool isMember( const CppTL::ConstString &key ) const;
+# endif
+
+      /// \brief Return a list of the member names.
+      ///
+      /// If null, return an empty list.
+      /// \pre type() is objectValue or nullValue
+      /// \post if type() was nullValue, it remains nullValue
+      Members getMemberNames() const;
+
+//# ifdef JSON_USE_CPPTL
+//      EnumMemberNames enumMemberNames() const;
+//      EnumValues enumValues() const;
+//# endif
+
+      /// Comments must be //... or /* ... */
+      void setComment( const char *comment,
+                       CommentPlacement placement );
+      /// Comments must be //... or /* ... */
+      void setComment( const std::string &comment,
+                       CommentPlacement placement );
+      bool hasComment( CommentPlacement placement ) const;
+      /// Include delimiters and embedded newlines.
+      std::string getComment( CommentPlacement placement ) const;
+
+      std::string toStyledString() const;
+
+      const_iterator begin() const;
+      const_iterator end() const;
+
+      iterator begin();
+      iterator end();
+
+   private:
+      Value &resolveReference( const char *key, 
+                               bool isStatic );
+
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+      inline bool isItemAvailable() const
+      {
+         return itemIsUsed_ == 0;
+      }
+
+      inline void setItemUsed( bool isUsed = true )
+      {
+         itemIsUsed_ = isUsed ? 1 : 0;
+      }
+
+      inline bool isMemberNameStatic() const
+      {
+         return memberNameIsStatic_ == 0;
+      }
+
+      inline void setMemberNameIsStatic( bool isStatic )
+      {
+         memberNameIsStatic_ = isStatic ? 1 : 0;
+      }
+# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+   private:
+      struct CommentInfo
+      {
+         CommentInfo();
+         ~CommentInfo();
+
+         void setComment( const char *text );
+
+         char *comment_;
+      };
+
+      //struct MemberNamesTransform
+      //{
+      //   typedef const char *result_type;
+      //   const char *operator()( const CZString &name ) const
+      //   {
+      //      return name.c_str();
+      //   }
+      //};
+
+      union ValueHolder
+      {
+         LargestInt int_;
+         LargestUInt uint_;
+         double real_;
+         bool bool_;
+         char *string_;
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+         ValueInternalArray *array_;
+         ValueInternalMap *map_;
+#else
+         ObjectValues *map_;
+# endif
+      } value_;
+      ValueType type_ : 8;
+      int allocated_ : 1;     // Notes: if declared as bool, bitfield is useless.
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+      unsigned int itemIsUsed_ : 1;      // used by the ValueInternalMap container.
+      int memberNameIsStatic_ : 1;       // used by the ValueInternalMap container.
+# endif
+      CommentInfo *comments_;
+   };
+
+
+   /** \brief Experimental and untested: represents an element of the "path" to access a node.
+    */
+   class PathArgument
+   {
+   public:
+      friend class Path;
+
+      PathArgument();
+      PathArgument( ArrayIndex index );
+      PathArgument( const char *key );
+      PathArgument( const std::string &key );
+
+   private:
+      enum Kind
+      {
+         kindNone = 0,
+         kindIndex,
+         kindKey
+      };
+      std::string key_;
+      ArrayIndex index_;
+      Kind kind_;
+   };
+
+   /** \brief Experimental and untested: represents a "path" to access a node.
+    *
+    * Syntax:
+    * - "." => root node
+    * - ".[n]" => elements at index 'n' of root node (an array value)
+    * - ".name" => member named 'name' of root node (an object value)
+    * - ".name1.name2.name3"
+    * - ".[0][1][2].name1[3]"
+    * - ".%" => member name is provided as parameter
+    * - ".[%]" => index is provied as parameter
+    */
+   class Path
+   {
+   public:
+      Path( const std::string &path,
+            const PathArgument &a1 = PathArgument(),
+            const PathArgument &a2 = PathArgument(),
+            const PathArgument &a3 = PathArgument(),
+            const PathArgument &a4 = PathArgument(),
+            const PathArgument &a5 = PathArgument() );
+
+      const Value &resolve( const Value &root ) const;
+      Value resolve( const Value &root, 
+                     const Value &defaultValue ) const;
+      /// Creates the "path" to access the specified node and returns a reference on the node.
+      Value &make( Value &root ) const;
+
+   private:
+      typedef std::vector<const PathArgument *> InArgs;
+      typedef std::vector<PathArgument> Args;
+
+      void makePath( const std::string &path,
+                     const InArgs &in );
+      void addPathInArg( const std::string &path, 
+                         const InArgs &in, 
+                         InArgs::const_iterator &itInArg, 
+                         PathArgument::Kind kind );
+      void invalidPath( const std::string &path, 
+                        int location );
+
+      Args args_;
+   };
+
+
+
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   /** \brief Allocator to customize Value internal map.
+    * Below is an example of a simple implementation (default implementation actually
+    * use memory pool for speed).
+    * \code
+      class DefaultValueMapAllocator : public ValueMapAllocator
+      {
+      public: // overridden from ValueMapAllocator
+         virtual ValueInternalMap *newMap()
+         {
+            return new ValueInternalMap();
+         }
+
+         virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
+         {
+            return new ValueInternalMap( other );
+         }
+
+         virtual void destructMap( ValueInternalMap *map )
+         {
+            delete map;
+         }
+
+         virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
+         {
+            return new ValueInternalLink[size];
+         }
+
+         virtual void releaseMapBuckets( ValueInternalLink *links )
+         {
+            delete [] links;
+         }
+
+         virtual ValueInternalLink *allocateMapLink()
+         {
+            return new ValueInternalLink();
+         }
+
+         virtual void releaseMapLink( ValueInternalLink *link )
+         {
+            delete link;
+         }
+      };
+    * \endcode
+    */ 
+   class JSON_API ValueMapAllocator
+   {
+   public:
+      virtual ~ValueMapAllocator();
+      virtual ValueInternalMap *newMap() = 0;
+      virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0;
+      virtual void destructMap( ValueInternalMap *map ) = 0;
+      virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0;
+      virtual void releaseMapBuckets( ValueInternalLink *links ) = 0;
+      virtual ValueInternalLink *allocateMapLink() = 0;
+      virtual void releaseMapLink( ValueInternalLink *link ) = 0;
+   };
+
+   /** \brief ValueInternalMap hash-map bucket chain link (for internal use only).
+    * \internal previous_ & next_ allows for bidirectional traversal.
+    */
+   class JSON_API ValueInternalLink
+   {
+   public:
+      enum { itemPerLink = 6 };  // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
+      enum InternalFlags { 
+         flagAvailable = 0,
+         flagUsed = 1
+      };
+
+      ValueInternalLink();
+
+      ~ValueInternalLink();
+
+      Value items_[itemPerLink];
+      char *keys_[itemPerLink];
+      ValueInternalLink *previous_;
+      ValueInternalLink *next_;
+   };
+
+
+   /** \brief A linked page based hash-table implementation used internally by Value.
+    * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked
+    * list in each bucket to handle collision. There is an addional twist in that
+    * each node of the collision linked list is a page containing a fixed amount of
+    * value. This provides a better compromise between memory usage and speed.
+    * 
+    * Each bucket is made up of a chained list of ValueInternalLink. The last
+    * link of a given bucket can be found in the 'previous_' field of the following bucket.
+    * The last link of the last bucket is stored in tailLink_ as it has no following bucket.
+    * Only the last link of a bucket may contains 'available' item. The last link always
+    * contains at least one element unless is it the bucket one very first link.
+    */
+   class JSON_API ValueInternalMap
+   {
+      friend class ValueIteratorBase;
+      friend class Value;
+   public:
+      typedef unsigned int HashKey;
+      typedef unsigned int BucketIndex;
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+      struct IteratorState
+      {
+         IteratorState() 
+            : map_(0)
+            , link_(0)
+            , itemIndex_(0)
+            , bucketIndex_(0) 
+         {
+         }
+         ValueInternalMap *map_;
+         ValueInternalLink *link_;
+         BucketIndex itemIndex_;
+         BucketIndex bucketIndex_;
+      };
+# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+      ValueInternalMap();
+      ValueInternalMap( const ValueInternalMap &other );
+      ValueInternalMap &operator =( const ValueInternalMap &other );
+      ~ValueInternalMap();
+
+      void swap( ValueInternalMap &other );
+
+      BucketIndex size() const;
+
+      void clear();
+
+      bool reserveDelta( BucketIndex growth );
+
+      bool reserve( BucketIndex newItemCount );
+
+      const Value *find( const char *key ) const;
+
+      Value *find( const char *key );
+
+      Value &resolveReference( const char *key, 
+                               bool isStatic );
+
+      void remove( const char *key );
+
+      void doActualRemove( ValueInternalLink *link, 
+                           BucketIndex index,
+                           BucketIndex bucketIndex );
+
+      ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex );
+
+      Value &setNewItem( const char *key, 
+                         bool isStatic, 
+                         ValueInternalLink *link, 
+                         BucketIndex index );
+
+      Value &unsafeAdd( const char *key, 
+                        bool isStatic, 
+                        HashKey hashedKey );
+
+      HashKey hash( const char *key ) const;
+
+      int compare( const ValueInternalMap &other ) const;
+
+   private:
+      void makeBeginIterator( IteratorState &it ) const;
+      void makeEndIterator( IteratorState &it ) const;
+      static bool equals( const IteratorState &x, const IteratorState &other );
+      static void increment( IteratorState &iterator );
+      static void incrementBucket( IteratorState &iterator );
+      static void decrement( IteratorState &iterator );
+      static const char *key( const IteratorState &iterator );
+      static const char *key( const IteratorState &iterator, bool &isStatic );
+      static Value &value( const IteratorState &iterator );
+      static int distance( const IteratorState &x, const IteratorState &y );
+
+   private:
+      ValueInternalLink *buckets_;
+      ValueInternalLink *tailLink_;
+      BucketIndex bucketsSize_;
+      BucketIndex itemCount_;
+   };
+
+   /** \brief A simplified deque implementation used internally by Value.
+   * \internal
+   * It is based on a list of fixed "page", each page contains a fixed number of items.
+   * Instead of using a linked-list, a array of pointer is used for fast item look-up.
+   * Look-up for an element is as follow:
+   * - compute page index: pageIndex = itemIndex / itemsPerPage
+   * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage]
+   *
+   * Insertion is amortized constant time (only the array containing the index of pointers
+   * need to be reallocated when items are appended).
+   */
+   class JSON_API ValueInternalArray
+   {
+      friend class Value;
+      friend class ValueIteratorBase;
+   public:
+      enum { itemsPerPage = 8 };    // should be a power of 2 for fast divide and modulo.
+      typedef Value::ArrayIndex ArrayIndex;
+      typedef unsigned int PageIndex;
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+      struct IteratorState // Must be a POD
+      {
+         IteratorState() 
+            : array_(0)
+            , currentPageIndex_(0)
+            , currentItemIndex_(0) 
+         {
+         }
+         ValueInternalArray *array_;
+         Value **currentPageIndex_;
+         unsigned int currentItemIndex_;
+      };
+# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+      ValueInternalArray();
+      ValueInternalArray( const ValueInternalArray &other );
+      ValueInternalArray &operator =( const ValueInternalArray &other );
+      ~ValueInternalArray();
+      void swap( ValueInternalArray &other );
+
+      void clear();
+      void resize( ArrayIndex newSize );
+
+      Value &resolveReference( ArrayIndex index );
+
+      Value *find( ArrayIndex index ) const;
+
+      ArrayIndex size() const;
+
+      int compare( const ValueInternalArray &other ) const;
+
+   private:
+      static bool equals( const IteratorState &x, const IteratorState &other );
+      static void increment( IteratorState &iterator );
+      static void decrement( IteratorState &iterator );
+      static Value &dereference( const IteratorState &iterator );
+      static Value &unsafeDereference( const IteratorState &iterator );
+      static int distance( const IteratorState &x, const IteratorState &y );
+      static ArrayIndex indexOf( const IteratorState &iterator );
+      void makeBeginIterator( IteratorState &it ) const;
+      void makeEndIterator( IteratorState &it ) const;
+      void makeIterator( IteratorState &it, ArrayIndex index ) const;
+
+      void makeIndexValid( ArrayIndex index );
+
+      Value **pages_;
+      ArrayIndex size_;
+      PageIndex pageCount_;
+   };
+
+   /** \brief Experimental: do not use. Allocator to customize Value internal array.
+    * Below is an example of a simple implementation (actual implementation use
+    * memory pool).
+      \code
+class DefaultValueArrayAllocator : public ValueArrayAllocator
+{
+public: // overridden from ValueArrayAllocator
+   virtual ~DefaultValueArrayAllocator()
+   {
+   }
+
+   virtual ValueInternalArray *newArray()
+   {
+      return new ValueInternalArray();
+   }
+
+   virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
+   {
+      return new ValueInternalArray( other );
+   }
+
+   virtual void destruct( ValueInternalArray *array )
+   {
+      delete array;
+   }
+
+   virtual void reallocateArrayPageIndex( Value **&indexes, 
+                                          ValueInternalArray::PageIndex &indexCount,
+                                          ValueInternalArray::PageIndex minNewIndexCount )
+   {
+      ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
+      if ( minNewIndexCount > newIndexCount )
+         newIndexCount = minNewIndexCount;
+      void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
+      if ( !newIndexes )
+         throw std::bad_alloc();
+      indexCount = newIndexCount;
+      indexes = static_cast<Value **>( newIndexes );
+   }
+   virtual void releaseArrayPageIndex( Value **indexes, 
+                                       ValueInternalArray::PageIndex indexCount )
+   {
+      if ( indexes )
+         free( indexes );
+   }
+
+   virtual Value *allocateArrayPage()
+   {
+      return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
+   }
+
+   virtual void releaseArrayPage( Value *value )
+   {
+      if ( value )
+         free( value );
+   }
+};
+      \endcode
+    */ 
+   class JSON_API ValueArrayAllocator
+   {
+   public:
+      virtual ~ValueArrayAllocator();
+      virtual ValueInternalArray *newArray() = 0;
+      virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0;
+      virtual void destructArray( ValueInternalArray *array ) = 0;
+      /** \brief Reallocate array page index.
+       * Reallocates an array of pointer on each page.
+       * \param indexes [input] pointer on the current index. May be \c NULL.
+       *                [output] pointer on the new index of at least 
+       *                         \a minNewIndexCount pages. 
+       * \param indexCount [input] current number of pages in the index.
+       *                   [output] number of page the reallocated index can handle.
+       *                            \b MUST be >= \a minNewIndexCount.
+       * \param minNewIndexCount Minimum number of page the new index must be able to
+       *                         handle.
+       */
+      virtual void reallocateArrayPageIndex( Value **&indexes, 
+                                             ValueInternalArray::PageIndex &indexCount,
+                                             ValueInternalArray::PageIndex minNewIndexCount ) = 0;
+      virtual void releaseArrayPageIndex( Value **indexes, 
+                                          ValueInternalArray::PageIndex indexCount ) = 0;
+      virtual Value *allocateArrayPage() = 0;
+      virtual void releaseArrayPage( Value *value ) = 0;
+   };
+#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+
+   /** \brief base class for Value iterators.
+    *
+    */
+   class ValueIteratorBase
+   {
+   public:
+      typedef unsigned int size_t;
+      typedef int difference_type;
+      typedef ValueIteratorBase SelfType;
+
+      ValueIteratorBase();
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+      explicit ValueIteratorBase( const Value::ObjectValues::iterator &current );
+#else
+      ValueIteratorBase( const ValueInternalArray::IteratorState &state );
+      ValueIteratorBase( const ValueInternalMap::IteratorState &state );
+#endif
+
+      bool operator ==( const SelfType &other ) const
+      {
+         return isEqual( other );
+      }
+
+      bool operator !=( const SelfType &other ) const
+      {
+         return !isEqual( other );
+      }
+
+      difference_type operator -( const SelfType &other ) const
+      {
+         return computeDistance( other );
+      }
+
+      /// Return either the index or the member name of the referenced value as a Value.
+      Value key() const;
+
+      /// Return the index of the referenced Value. -1 if it is not an arrayValue.
+      UInt index() const;
+
+      /// Return the member name of the referenced Value. "" if it is not an objectValue.
+      const char *memberName() const;
+
+   protected:
+      Value &deref() const;
+
+      void increment();
+
+      void decrement();
+
+      difference_type computeDistance( const SelfType &other ) const;
+
+      bool isEqual( const SelfType &other ) const;
+
+      void copy( const SelfType &other );
+
+   private:
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+      Value::ObjectValues::iterator current_;
+      // Indicates that iterator is for a null value.
+      bool isNull_;
+#else
+      union
+      {
+         ValueInternalArray::IteratorState array_;
+         ValueInternalMap::IteratorState map_;
+      } iterator_;
+      bool isArray_;
+#endif
+   };
+
+   /** \brief const iterator for object and array value.
+    *
+    */
+   class ValueConstIterator : public ValueIteratorBase
+   {
+      friend class Value;
+   public:
+      typedef unsigned int size_t;
+      typedef int difference_type;
+      typedef const Value &reference;
+      typedef const Value *pointer;
+      typedef ValueConstIterator SelfType;
+
+      ValueConstIterator();
+   private:
+      /*! \internal Use by Value to create an iterator.
+       */
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+      explicit ValueConstIterator( const Value::ObjectValues::iterator &current );
+#else
+      ValueConstIterator( const ValueInternalArray::IteratorState &state );
+      ValueConstIterator( const ValueInternalMap::IteratorState &state );
+#endif
+   public:
+      SelfType &operator =( const ValueIteratorBase &other );
+
+      SelfType operator++( int )
+      {
+         SelfType temp( *this );
+         ++*this;
+         return temp;
+      }
+
+      SelfType operator--( int )
+      {
+         SelfType temp( *this );
+         --*this;
+         return temp;
+      }
+
+      SelfType &operator--()
+      {
+         decrement();
+         return *this;
+      }
+
+      SelfType &operator++()
+      {
+         increment();
+         return *this;
+      }
+
+      reference operator *() const
+      {
+         return deref();
+      }
+   };
+
+
+   /** \brief Iterator for object and array value.
+    */
+   class ValueIterator : public ValueIteratorBase
+   {
+      friend class Value;
+   public:
+      typedef unsigned int size_t;
+      typedef int difference_type;
+      typedef Value &reference;
+      typedef Value *pointer;
+      typedef ValueIterator SelfType;
+
+      ValueIterator();
+      ValueIterator( const ValueConstIterator &other );
+      ValueIterator( const ValueIterator &other );
+   private:
+      /*! \internal Use by Value to create an iterator.
+       */
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+      explicit ValueIterator( const Value::ObjectValues::iterator &current );
+#else
+      ValueIterator( const ValueInternalArray::IteratorState &state );
+      ValueIterator( const ValueInternalMap::IteratorState &state );
+#endif
+   public:
+
+      SelfType &operator =( const SelfType &other );
+
+      SelfType operator++( int )
+      {
+         SelfType temp( *this );
+         ++*this;
+         return temp;
+      }
+
+      SelfType operator--( int )
+      {
+         SelfType temp( *this );
+         --*this;
+         return temp;
+      }
+
+      SelfType &operator--()
+      {
+         decrement();
+         return *this;
+      }
+
+      SelfType &operator++()
+      {
+         increment();
+         return *this;
+      }
+
+      reference operator *() const
+      {
+         return deref();
+      }
+   };
+
+
+} // namespace Json
+
+
+#endif // CPPTL_JSON_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/value.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/reader.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_READER_H_INCLUDED
+# define CPPTL_JSON_READER_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "features.h"
+# include "value.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <deque>
+# include <stack>
+# include <string>
+# include <iostream>
+
+namespace Json {
+
+   /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value.
+    *
+    */
+   class JSON_API Reader
+   {
+   public:
+      typedef char Char;
+      typedef const Char *Location;
+
+      /** \brief Constructs a Reader allowing all features
+       * for parsing.
+       */
+      Reader();
+
+      /** \brief Constructs a Reader allowing the specified feature set
+       * for parsing.
+       */
+      Reader( const Features &features );
+
+      /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
+       * \param document UTF-8 encoded string containing the document to read.
+       * \param root [out] Contains the root value of the document if it was
+       *             successfully parsed.
+       * \param collectComments \c true to collect comment and allow writing them back during
+       *                        serialization, \c false to discard comments.
+       *                        This parameter is ignored if Features::allowComments_
+       *                        is \c false.
+       * \return \c true if the document was successfully parsed, \c false if an error occurred.
+       */
+      bool parse( const std::string &document, 
+                  Value &root,
+                  bool collectComments = true );
+
+      /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
+       * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read.
+       * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read. 
+       \               Must be >= beginDoc.
+       * \param root [out] Contains the root value of the document if it was
+       *             successfully parsed.
+       * \param collectComments \c true to collect comment and allow writing them back during
+       *                        serialization, \c false to discard comments.
+       *                        This parameter is ignored if Features::allowComments_
+       *                        is \c false.
+       * \return \c true if the document was successfully parsed, \c false if an error occurred.
+       */
+      bool parse( const char *beginDoc, const char *endDoc, 
+                  Value &root,
+                  bool collectComments = true );
+
+      /// \brief Parse from input stream.
+      /// \see Json::operator>>(std::istream&, Json::Value&).
+      bool parse( std::istream &is,
+                  Value &root,
+                  bool collectComments = true );
+
+      /** \brief Returns a user friendly string that list errors in the parsed document.
+       * \return Formatted error message with the list of errors with their location in 
+       *         the parsed document. An empty string is returned if no error occurred
+       *         during parsing.
+       * \deprecated Use getFormattedErrorMessages() instead (typo fix).
+       */
+      JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead") 
+      std::string getFormatedErrorMessages() const;
+
+      /** \brief Returns a user friendly string that list errors in the parsed document.
+       * \return Formatted error message with the list of errors with their location in 
+       *         the parsed document. An empty string is returned if no error occurred
+       *         during parsing.
+       */
+      std::string getFormattedErrorMessages() const;
+
+   private:
+      enum TokenType
+      {
+         tokenEndOfStream = 0,
+         tokenObjectBegin,
+         tokenObjectEnd,
+         tokenArrayBegin,
+         tokenArrayEnd,
+         tokenString,
+         tokenNumber,
+         tokenTrue,
+         tokenFalse,
+         tokenNull,
+         tokenArraySeparator,
+         tokenMemberSeparator,
+         tokenComment,
+         tokenError
+      };
+
+      class Token
+      {
+      public:
+         TokenType type_;
+         Location start_;
+         Location end_;
+      };
+
+      class ErrorInfo
+      {
+      public:
+         Token token_;
+         std::string message_;
+         Location extra_;
+      };
+
+      typedef std::deque<ErrorInfo> Errors;
+
+      bool expectToken( TokenType type, Token &token, const char *message );
+      bool readToken( Token &token );
+      void skipSpaces();
+      bool match( Location pattern, 
+                  int patternLength );
+      bool readComment();
+      bool readCStyleComment();
+      bool readCppStyleComment();
+      bool readString();
+      void readNumber();
+      bool readValue();
+      bool readObject( Token &token );
+      bool readArray( Token &token );
+      bool decodeNumber( Token &token );
+      bool decodeString( Token &token );
+      bool decodeString( Token &token, std::string &decoded );
+      bool decodeDouble( Token &token );
+      bool decodeUnicodeCodePoint( Token &token, 
+                                   Location &current, 
+                                   Location end, 
+                                   unsigned int &unicode );
+      bool decodeUnicodeEscapeSequence( Token &token, 
+                                        Location &current, 
+                                        Location end, 
+                                        unsigned int &unicode );
+      bool addError( const std::string &message, 
+                     Token &token,
+                     Location extra = 0 );
+      bool recoverFromError( TokenType skipUntilToken );
+      bool addErrorAndRecover( const std::string &message, 
+                               Token &token,
+                               TokenType skipUntilToken );
+      void skipUntilSpace();
+      Value &currentValue();
+      Char getNextChar();
+      void getLocationLineAndColumn( Location location,
+                                     int &line,
+                                     int &column ) const;
+      std::string getLocationLineAndColumn( Location location ) const;
+      void addComment( Location begin, 
+                       Location end, 
+                       CommentPlacement placement );
+      void skipCommentTokens( Token &token );
+   
+      typedef std::stack<Value *> Nodes;
+      Nodes nodes_;
+      Errors errors_;
+      std::string document_;
+      Location begin_;
+      Location end_;
+      Location current_;
+      Location lastValueEnd_;
+      Value *lastValue_;
+      std::string commentsBefore_;
+      Features features_;
+      bool collectComments_;
+   };
+
+   /** \brief Read from 'sin' into 'root'.
+
+    Always keep comments from the input JSON.
+
+    This can be used to read a file into a particular sub-object.
+    For example:
+    \code
+    Json::Value root;
+    cin >> root["dir"]["file"];
+    cout << root;
+    \endcode
+    Result:
+    \verbatim
+    {
+    "dir": {
+        "file": {
+        // The input stream JSON would be nested here.
+        }
+    }
+    }
+    \endverbatim
+    \throw std::exception on parse error.
+    \see Json::operator<<()
+   */
+   std::istream& operator>>( std::istream&, Value& );
+
+} // namespace Json
+
+#endif // CPPTL_JSON_READER_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/reader.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/writer.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_WRITER_H_INCLUDED
+# define JSON_WRITER_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "value.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <vector>
+# include <string>
+# include <iostream>
+
+namespace Json {
+
+   class Value;
+
+   /** \brief Abstract class for writers.
+    */
+   class JSON_API Writer
+   {
+   public:
+      virtual ~Writer();
+
+      virtual std::string write( const Value &root ) = 0;
+   };
+
+   /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
+    *
+    * The JSON document is written in a single line. It is not intended for 'human' consumption,
+    * but may be usefull to support feature such as RPC where bandwith is limited.
+    * \sa Reader, Value
+    */
+   class JSON_API FastWriter : public Writer
+   {
+   public:
+      FastWriter();
+      virtual ~FastWriter(){}
+
+      void enableYAMLCompatibility();
+
+   public: // overridden from Writer
+      virtual std::string write( const Value &root );
+
+   private:
+      void writeValue( const Value &value );
+
+      std::string document_;
+      bool yamlCompatiblityEnabled_;
+   };
+
+   /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
+    *
+    * The rules for line break and indent are as follow:
+    * - Object value:
+    *     - if empty then print {} without indent and line break
+    *     - if not empty the print '{', line break & indent, print one value per line
+    *       and then unindent and line break and print '}'.
+    * - Array value:
+    *     - if empty then print [] without indent and line break
+    *     - if the array contains no object value, empty array or some other value types,
+    *       and all the values fit on one lines, then print the array on a single line.
+    *     - otherwise, it the values do not fit on one line, or the array contains
+    *       object or non empty array, then print one value per line.
+    *
+    * If the Value have comments then they are outputed according to their #CommentPlacement.
+    *
+    * \sa Reader, Value, Value::setComment()
+    */
+   class JSON_API StyledWriter: public Writer
+   {
+   public:
+      StyledWriter();
+      virtual ~StyledWriter(){}
+
+   public: // overridden from Writer
+      /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
+       * \param root Value to serialize.
+       * \return String containing the JSON document that represents the root value.
+       */
+      virtual std::string write( const Value &root );
+
+   private:
+      void writeValue( const Value &value );
+      void writeArrayValue( const Value &value );
+      bool isMultineArray( const Value &value );
+      void pushValue( const std::string &value );
+      void writeIndent();
+      void writeWithIndent( const std::string &value );
+      void indent();
+      void unindent();
+      void writeCommentBeforeValue( const Value &root );
+      void writeCommentAfterValueOnSameLine( const Value &root );
+      bool hasCommentForValue( const Value &value );
+      static std::string normalizeEOL( const std::string &text );
+
+      typedef std::vector<std::string> ChildValues;
+
+      ChildValues childValues_;
+      std::string document_;
+      std::string indentString_;
+      int rightMargin_;
+      int indentSize_;
+      bool addChildValues_;
+   };
+
+   /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
+        to a stream rather than to a string.
+    *
+    * The rules for line break and indent are as follow:
+    * - Object value:
+    *     - if empty then print {} without indent and line break
+    *     - if not empty the print '{', line break & indent, print one value per line
+    *       and then unindent and line break and print '}'.
+    * - Array value:
+    *     - if empty then print [] without indent and line break
+    *     - if the array contains no object value, empty array or some other value types,
+    *       and all the values fit on one lines, then print the array on a single line.
+    *     - otherwise, it the values do not fit on one line, or the array contains
+    *       object or non empty array, then print one value per line.
+    *
+    * If the Value have comments then they are outputed according to their #CommentPlacement.
+    *
+    * \param indentation Each level will be indented by this amount extra.
+    * \sa Reader, Value, Value::setComment()
+    */
+   class JSON_API StyledStreamWriter
+   {
+   public:
+      StyledStreamWriter( std::string indentation="\t" );
+      ~StyledStreamWriter(){}
+
+   public:
+      /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
+       * \param out Stream to write to. (Can be ostringstream, e.g.)
+       * \param root Value to serialize.
+       * \note There is no point in deriving from Writer, since write() should not return a value.
+       */
+      void write( std::ostream &out, const Value &root );
+
+   private:
+      void writeValue( const Value &value );
+      void writeArrayValue( const Value &value );
+      bool isMultineArray( const Value &value );
+      void pushValue( const std::string &value );
+      void writeIndent();
+      void writeWithIndent( const std::string &value );
+      void indent();
+      void unindent();
+      void writeCommentBeforeValue( const Value &root );
+      void writeCommentAfterValueOnSameLine( const Value &root );
+      bool hasCommentForValue( const Value &value );
+      static std::string normalizeEOL( const std::string &text );
+
+      typedef std::vector<std::string> ChildValues;
+
+      ChildValues childValues_;
+      std::ostream* document_;
+      std::string indentString_;
+      int rightMargin_;
+      std::string indentation_;
+      bool addChildValues_;
+   };
+
+# if defined(JSON_HAS_INT64)
+   std::string JSON_API valueToString( Int value );
+   std::string JSON_API valueToString( UInt value );
+# endif // if defined(JSON_HAS_INT64)
+   std::string JSON_API valueToString( LargestInt value );
+   std::string JSON_API valueToString( LargestUInt value );
+   std::string JSON_API valueToString( double value );
+   std::string JSON_API valueToString( bool value );
+   std::string JSON_API valueToQuotedString( const char *value );
+
+   /// \brief Output using the StyledStreamWriter.
+   /// \see Json::operator>>()
+   std::ostream& operator<<( std::ostream&, const Value &root );
+
+} // namespace Json
+
+
+
+#endif // JSON_WRITER_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/writer.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+#endif //ifndef JSON_AMALGATED_H_INCLUDED
diff --git a/include/jellyfish/large_hash_array.hpp b/include/jellyfish/large_hash_array.hpp
new file mode 100644
index 0000000..74f1000
--- /dev/null
+++ b/include/jellyfish/large_hash_array.hpp
@@ -0,0 +1,994 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_LARGE_HASH_ARRAY_HPP__
+#define __JELLYFISH_LARGE_HASH_ARRAY_HPP__
+
+#include <jellyfish/storage.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/offsets_key_value.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/err.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/simple_circular_buffer.hpp>
+#include <jellyfish/large_hash_iterator.hpp>
+
+namespace jellyfish { namespace large_hash {
+/* Contains an integer, the reprobe limit. It is capped based on the
+ * reprobe strategy to not be bigger than the size of the hash
+ * array. Also, the length to encode reprobe limit must not be larger
+ * than the length to encode _size.
+ */
+class reprobe_limit_t {
+  uint_t limit;
+public:
+  reprobe_limit_t(uint_t _limit, const size_t *_reprobes, size_t _size) :
+    limit(_limit)
+  {
+    while(_reprobes[limit] >= _size && limit >= 1)
+      limit--;
+  }
+  inline uint_t val() const { return limit; }
+};
+
+// Key is any type with the following two methods: get_bits(unsigned
+// int start, unsigned int len); and set_bits(unsigned int start,
+// unsigned int len, uint64_t bits). These methods get and set the
+// bits [start, start + len). Start and len may not be aligned to word
+// boundaries. On the other hand, len is guaranteed to be <
+// sizeof(uint64_t). I.e. never more than 1 word is fetched or set.
+template<typename Key, typename word, typename atomic_t, typename Derived>
+class array_base {
+  static const int  wsize = std::numeric_limits<word>::digits; // Word size in bits
+  // Can't be done. Resort to an evil macro!
+  //  static const word fmask = std::numeric_limits<word>::max(); // Mask full of ones
+#define fmask (std::numeric_limits<word>::max())
+
+public:
+  define_error_class(ErrorAllocation);
+
+  typedef word                             data_word;
+  typedef typename Offsets<word>::offset_t offset_t;
+  typedef struct offset_t::key             key_offsets;
+  typedef struct offset_t::val             val_offsets;
+
+  typedef Key key_type;
+  typedef uint64_t                      mapped_type;
+  typedef std::pair<Key&, mapped_type>  value_type;
+  typedef stl_iterator_base<array_base> iterator;
+  typedef stl_iterator_base<array_base> const_iterator;
+  typedef value_type&                   reference;
+  typedef const value_type&             const_reference;
+  typedef value_type*                   pointer;
+  typedef const value_type*             const_pointer;
+
+  typedef eager_iterator_base<array_base>  eager_iterator;
+  typedef lazy_iterator_base<array_base>   lazy_iterator;
+  typedef region_iterator_base<array_base> region_iterator;
+
+  /// Status of a (key,value) pair. LBSET means that the large bit is
+  /// set. Hence, it contains a pointer back to the original key and a
+  /// large value.
+  enum key_status { FILLED, EMPTY, LBSET};
+
+protected:
+  uint16_t                 lsize_; // log of size
+  size_t                   size_, size_mask_;
+  reprobe_limit_t          reprobe_limit_;
+  uint16_t                 key_len_; // Length of key in bits
+  uint16_t                 raw_key_len_; // Length of key stored raw (i.e. complement of implied length)
+  Offsets<word>            offsets_; // key len reduced by size of hash array
+  size_t                   size_bytes_;
+  word * const             data_;
+  atomic_t                 atomic_;
+  const size_t            *reprobes_;
+  RectangularBinaryMatrix  hash_matrix_;
+  RectangularBinaryMatrix  hash_inverse_matrix_;
+
+public:
+  /// Give information about memory usage and array size.
+  struct usage_info {
+    uint16_t      key_len_, val_len_, reprobe_limit_;
+    const size_t* reprobes_;
+
+    usage_info(uint16_t key_len, uint16_t val_len, uint16_t reprobe_limit,
+               const size_t* reprobes = jellyfish::quadratic_reprobes) :
+      key_len_(key_len), val_len_(val_len), reprobe_limit_(reprobe_limit), reprobes_(reprobes) { }
+
+    /// Memory usage for a given size.
+    size_t mem(size_t size) {
+      uint16_t lsize(ceilLog2(size));
+      size_t asize((size_t)1 << lsize);
+      reprobe_limit_t areprobe_limit(reprobe_limit_, reprobes_, asize);
+      uint16_t raw_key_len(key_len_ > lsize ? key_len_ - lsize : 0);
+      Offsets<word> offsets(raw_key_len + bitsize(areprobe_limit.val() + 1), val_len_,
+                            areprobe_limit.val() + 1);
+      return div_ceil(asize,
+                      (size_t)offsets.block_len()) * offsets.block_word_len() * sizeof(word) + sizeof(array_base) + sizeof(Offsets<word>);
+    }
+
+    /// Actual size for a given size.
+    size_t asize(size_t size) { return (size_t)1 << ceilLog2(size); }
+
+    struct fit_in {
+      usage_info* i_;
+      size_t      mem_;
+      fit_in(usage_info* i, size_t mem) : i_(i), mem_(mem) { }
+      bool operator()(uint16_t size_bits) const { return i_->mem((size_t)1 << size_bits) < mem_; }
+    };
+
+    /// Maximum size for a given maximum memory.
+    size_t size(size_t mem) { return (size_t)1 << size_bits(mem); }
+
+    /// Log of maximum size for a given maximum memory
+    uint16_t size_bits(size_t mem) {
+      uint16_t res = *binary_search_first_false(pointer_integer<uint16_t>(0), pointer_integer<uint16_t>(64),
+                                              fit_in(this, mem));
+      return res > 0 ? res - 1 : 0;
+    }
+
+    size_t size_bits_linear(size_t mem) {
+      fit_in predicate(this, mem);
+      uint16_t i = 0;
+      for( ; i < 64; ++i)
+        if(!predicate(i))
+           break;
+
+      return i > 0 ? i - 1 : 0;
+    }
+
+  };
+
+
+  array_base(size_t size, // Size of hash. To be rounded up to a power of 2
+             uint16_t key_len, // Size of key in bits
+             uint16_t val_len, // Size of val in bits
+             uint16_t reprobe_limit, // Maximum reprobe
+             RectangularBinaryMatrix m,
+             const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+    lsize_(ceilLog2(size)),
+    size_((size_t)1 << lsize_),
+    size_mask_(size_ - 1),
+    reprobe_limit_(reprobe_limit, reprobes, size_),
+    key_len_(key_len),
+    raw_key_len_(key_len_ > lsize_ ? key_len_ - lsize_ : 0),
+    offsets_(raw_key_len_ + bitsize(reprobe_limit_.val() + 1), val_len, reprobe_limit_.val() + 1),
+    size_bytes_(div_ceil(size_, (size_t)offsets_.block_len()) * offsets_.block_word_len() * sizeof(word)),
+    data_(static_cast<Derived*>(this)->alloc_data(size_bytes_)),
+    reprobes_(reprobes),
+    hash_matrix_(m),
+    hash_inverse_matrix_(hash_matrix_.pseudo_inverse())
+  {
+    if(!data_)
+      throw ErrorAllocation(err::msg() << "Failed to allocate "
+                            << (div_ceil(size, (size_t)offsets_.block_len()) * offsets_.block_word_len() * sizeof(word))
+                            << " bytes of memory");
+  }
+
+  array_base(array_base&& ary) :
+    lsize_(ary.lsize_),
+    size_(ary.size_),
+    size_mask_(size_ - 1),
+    reprobe_limit_(ary.reprobe_limit_),
+    key_len_(ary.key_len_),
+    raw_key_len_(ary.raw_key_len_),
+    offsets_(std::move(ary.offsets_)),
+    size_bytes_(ary.size_bytes_),
+    data_(ary.data_),
+    reprobes_(ary.reprobes_),
+    hash_matrix_(std::move(ary.hash_matrix_)),
+    hash_inverse_matrix_(std::move(ary.hash_inverse_matrix_))
+  { }
+
+  array_base& operator=(const array_base& rhs) = delete;
+  array_base& operator=(array_base&& rhs) = delete;
+
+  size_t size() const { return size_; }
+  size_t lsize() const { return lsize_; }
+  size_t size_mask() const { return size_mask_; }
+  uint_t key_len() const { return key_len_; }
+  uint_t val_len() const { return offsets_.val_len(); }
+
+  const size_t* reprobes() const { return reprobes_; }
+  uint_t max_reprobe() const { return reprobe_limit_.val(); }
+  size_t max_reprobe_offset() const { return reprobes_[reprobe_limit_.val()]; }
+
+  const RectangularBinaryMatrix& matrix() const { return hash_matrix_; }
+  const RectangularBinaryMatrix& inverse_matrix() const { return hash_inverse_matrix_; }
+  void matrix(const RectangularBinaryMatrix& m) {
+    hash_inverse_matrix_ = m.pseudo_inverse();
+    hash_matrix_         = m;
+  }
+
+  /**
+   * Clear hash table. Not thread safe.
+   */
+  void clear() {
+    memset(data_, '\0', size_bytes_);
+  }
+
+  /**
+   * Write the hash table raw to a stream. Not thread safe.
+   */
+  void write(std::ostream& os) const {
+    os.write((const char*)data_, size_bytes_);
+  }
+
+  size_t size_bytes() const { return size_bytes_; }
+
+  /* The storage of the hash is organized in "blocks". A (key,value)
+   * pair always start at bit 0 of the block. The following methods
+   * work with the blocks of the hash.
+   */
+
+  /**
+   * Number of blocks needed to fit at least a given number of
+   * records. Given a number of records, it returns the number of
+   * blocks necessary and the actual number of records these blocks
+   * contain.
+   */
+  std::pair<size_t, size_t> blocks_for_records(size_t nb_records) const {
+    return offsets_.blocks_for_records(nb_records);
+  }
+
+
+  /**
+   * Convert coordinate from (start, blen) given in blocks to
+   * coordinate in char* and length in bytes. It also makes sure that
+   * the pointer and length returned do not go beyond allocated
+   * memory.
+   */
+  void block_to_ptr(const size_t start, const size_t blen,
+                    char **start_ptr, size_t *memlen) const {
+    *start_ptr    = (char *)(data_ + start * offsets_.block_word_len());
+    char *end_ptr = (char *)data_ + size_bytes_;
+
+    if(*start_ptr >= end_ptr) {
+      *memlen = 0;
+      return;
+    }
+    *memlen = blen * offsets_.block_word_len() * sizeof(word);
+    if(*start_ptr + *memlen > end_ptr)
+      *memlen = end_ptr - *start_ptr;
+  }
+
+  /**
+   * Zero out blocks in [start, start+length), where start and
+   * length are given in number of blocks.
+   **/
+  void zero_blocks(const size_t start, const size_t length) {
+    char   *start_ptr;
+    size_t  memlen;
+    block_to_ptr(start, length, &start_ptr, &memlen);
+    memset(start_ptr, '\0', memlen);
+  }
+
+
+  /**
+   * Use hash values as counters.
+   *
+   * The matrix multiplication gets only a uint64_t. The lsb of the
+   * matrix product, the hsb are assume to be equal to the key itself
+   * (the matrix has a partial identity on the first rows).
+   *
+   * In case of failure (false is returned), carry_shift contains the
+   * number of bits of the value that were successfully stored in the
+   * hash (low significant bits). If carry_shift == 0, then nothing
+   * was stored and the key is not in the hash at all. In that case,
+   * the value of *is_new and *id are not valid. If carry_shift > 0,
+   * then the key is present but the value stored is not correct
+   * (missing the high significant bits of value), but *is_new and *id
+   * contain the proper information.
+   */
+  inline bool add(const key_type& key, mapped_type val, unsigned int* carry_shift, bool* is_new, size_t* id) {
+    uint64_t hash = hash_matrix_.times(key);
+    *carry_shift  = 0;
+    return add_rec(hash & size_mask_, key, val, false, is_new, id, carry_shift);
+  }
+
+  inline bool add(const key_type& key, mapped_type val, unsigned int* carry_shift) {
+    bool   is_new = false;
+    size_t id     = 0;
+    return add(key, val, carry_shift, &is_new, &id);
+  }
+
+  inline bool add(const key_type& key, mapped_type val) {
+    unsigned int carry_shift = 0;
+    return add(key, val, &carry_shift);
+  }
+
+  inline bool set(const key_type& key) {
+    bool   is_new;
+    size_t id;
+    return set(key, &is_new, &id);
+  }
+  bool set(const key_type& key, bool* is_new, size_t* id) {
+    word*           w;
+    const offset_t* o;
+
+    *id = hash_matrix_.times(key) & size_mask_;
+    return claim_key(key, is_new, id, &o, &w);
+  }
+
+  /**
+   * Use hash values as counters, if already exists
+   *
+   * Add val to the value associated with key if key is already in the
+   * hash. Returns true if the update was done, false otherwise.
+   */
+  inline bool update_add(const key_type& key, mapped_type val) {
+    key_type     tmp_key;
+    unsigned int carry_shift;
+    return update_add(key, val, &carry_shift, tmp_key);
+  }
+
+
+  // Optimization. Use tmp_key as buffer. Avoids allocation if update_add is called repeatedly.
+  bool update_add(const key_type& key, mapped_type val, unsigned int* carry_shift, key_type& tmp_key) {
+    size_t          id;
+    word*           w;
+    const offset_t* o;
+    *carry_shift = 0;
+
+    if(get_key_id(key, &id, tmp_key, (const word**)&w, &o))
+      return add_rec_at(id, key, val, o, w, carry_shift);
+    return false;
+  }
+
+  // Get the value, stored in *val, associated with key. If the key is
+  // not found, false is returned, otherwise true is returned and *val
+  // is updated. If carry_bit is true, then the first bit of the key
+  // field indicates whether we should reprobe to get the complete
+  // value.
+  inline bool get_val_for_key(const key_type& key, mapped_type* val, bool carry_bit = false) const {
+    key_type tmp_key;
+    size_t   id;
+    return get_val_for_key(key, val, tmp_key, &id, carry_bit);
+  }
+
+  // Optimization version. A tmp_key buffer is passed and the id where
+  // the key was found is return in *id. If get_val_for_key is called
+  // many times consecutively, it may be faster to pass the same
+  // tmp_key buffer instead of allocating it every time.
+  bool get_val_for_key(const key_type& key, mapped_type* val, key_type& tmp_key,
+                       size_t* id, bool carry_bit = false) const {
+    const word*     w;
+    const offset_t* o;
+    if(!get_key_id(key, id, tmp_key, &w, &o))
+      return false;
+    *val = get_val_at_id(*id, w, o, true, carry_bit);
+    return true;
+  }
+
+  // Return true if the key is present in the hash
+  inline bool has_key(const key_type& key) const {
+    size_t id;
+    return get_key_id(key, &id);
+  }
+
+  // Get the id of the key in the hash. Returns true if the key is
+  // found in the hash, false otherwise.
+  inline bool get_key_id(const key_type& key, size_t* id) const {
+    key_type        tmp_key;
+    const word*     w;
+    const offset_t* o;
+    return get_key_id(key, id, tmp_key, &w, &o);
+  }
+
+  // Optimization version where a tmp_key buffer is provided instead
+  // of being allocated. May be faster if many calls to get_key_id are
+  // made consecutively by passing the same tmp_key each time.
+  inline bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key) const {
+    const word*     w;
+    const offset_t* o;
+    return get_key_id(key, id, tmp_key, &w, &o);
+  }
+
+protected:
+  // Information and methods to manage the prefetched data.
+  struct prefetch_info {
+    size_t          id;
+    const word*     w;
+    const offset_t *o, *lo;
+  };
+  typedef simple_circular_buffer::pre_alloc<prefetch_info, 8> prefetch_buffer;
+
+  void warm_up_cache(prefetch_buffer& buffer, size_t oid) const {
+    buffer.clear();
+    for(int i = 0; i < buffer.capacity(); ++i) {
+      buffer.push_back();
+      prefetch_info& info = buffer.back();
+      info.id             = (oid + (i > 0 ? reprobes_[i] : 0)) & size_mask_;
+      info.w              = offsets_.word_offset(info.id, &info.o, &info.lo, data_);
+      __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
+      __builtin_prefetch(info.o, 0, 3);
+    }
+  }
+
+  void prefetch_next(prefetch_buffer& buffer, size_t oid, uint_t reprobe) const {
+    buffer.pop_front();
+    //    if(reprobe + buffer.capacity() <= reprobe_limit_.val()) {
+      buffer.push_back();
+      prefetch_info& info = buffer.back();
+      info.id             = (oid + reprobes_[reprobe + buffer.capacity() - 1]) & size_mask_;
+      info.w              = offsets_.word_offset(info.id, &info.o, &info.lo, data_);
+      __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
+      __builtin_prefetch(info.o, 0, 3);
+      //    }
+  }
+
+public:
+  // Optimization version again. Also return the word and the offset
+  // information where the key was found. These can be used later one
+  // to fetch the value associated with the key.
+  inline bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key, const word** w, const offset_t** o) const {
+    return get_key_id(key, id, tmp_key, w, o, hash_matrix_.times(key) & size_mask_);
+  }
+
+  // Find the actual id of the key in the hash, starting at oid.
+  bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key, const word** w, const offset_t** o, const size_t oid) const {
+    // This static_assert makes clang++ happy
+    static_assert(std::is_pod<prefetch_info>::value, "prefetch_info must be a POD");
+    prefetch_info info_ary[prefetch_buffer::capacity()];
+    prefetch_buffer buffer(info_ary);
+    warm_up_cache(buffer, oid);
+
+    for(uint_t reprobe = 0; reprobe <= reprobe_limit_.val(); ++reprobe) {
+      prefetch_info& info = buffer.front();
+      key_status st       = get_key_at_id(info.id, tmp_key, info.w, info.o);
+
+      switch(st) {
+      case EMPTY:
+        return false;
+      case FILLED:
+        if(oid != tmp_key.get_bits(0, lsize_))
+          break;
+        tmp_key.template set_bits<false>(0, lsize_, key.get_bits(0, lsize_));
+        if(tmp_key != key)
+          break;
+        *id = info.id;
+        *w  = info.w;
+        *o  = info.o;
+        return true;
+      default:
+        break;
+      }
+
+      prefetch_next(buffer, oid, reprobe + 1);
+    } // for
+
+    return false;
+  }
+
+  //////////////////////////////
+  // Iterator
+  //////////////////////////////
+  const_iterator begin() { return const_iterator(this); }
+  const_iterator begin() const { return const_iterator(this); }
+  const_iterator end() { return const_iterator(); }
+  const_iterator end() const { return const_iterator(); }
+
+/// Get a slice of an array as an iterator
+  template<typename Iterator>
+  Iterator iterator_slice(size_t index, size_t nb_slices) const {
+    std::pair<size_t, size_t> res = slice(index, nb_slices, size());
+    return Iterator(this, res.first, res.second);
+  }
+
+  template<typename Iterator>
+  Iterator iterator_all() const { return iterator_slice<Iterator>(0, 1); }
+
+  // See hash_counter.hpp for why we added this method. It should not
+  // be needed, but I can't get the thing to compile without :(.
+  eager_iterator eager_slice(size_t index, size_t nb_slices) const {
+    return iterator_slice<eager_iterator>(index, nb_slices);
+  }
+  region_iterator region_slice(size_t index, size_t nb_slices) const {
+    return iterator_slice<region_iterator>(index, nb_slices);
+  }
+
+  // Claim a key with the large bit not set. I.e. first entry for a key.
+  //
+  // id is input/output. Equal to hash & size_maks on input. Equal to
+  // actual id where key was set on output. key is already hash
+  // shifted and masked to get higher bits. (>> lsize & key_mask)
+  // is_new is set on output to true if key did not exists in hash
+  // before. *ao points to the actual offsets object and w to the word
+  // holding the value.
+  bool claim_key(const key_type& key, bool* is_new, size_t* id, const offset_t** _ao, word** _w) {
+    uint_t	    reprobe        = 0;
+    const offset_t *o, *lo;
+    word	   *w, *kw, nkey;
+    bool	    key_claimed    = false;
+    size_t	    cid            = *id;
+
+    // Akey contains first word of what to store in the key
+    // field. I.e. part of the original key (the rest is encoded in
+    // the original position) and the reprobe value to substract from
+    // the actual position to get to the original position.
+    //
+    //    MSB                     LSB
+    //   +--------------+-------------+
+    //   |  MSB of key  |  reprobe    |
+    //   + -------------+-------------+
+    //     raw_key_len    reprobe_len
+    //
+    // Akey is updated at every operation to reflect the current
+    // reprobe value. nkey is the temporary word containing the part
+    // to be stored in the current word kw (+ some offset).
+    word      akey          = 1; // start reprobe value == 0. Store reprobe value + 1
+    const int to_copy       = std::min((uint16_t)(wsize - offsets_.reprobe_len()), raw_key_len_);
+    const int implied_copy  = std::min(key_len_, lsize_);
+    akey                   |= key.get_bits(implied_copy, to_copy) << offsets_.reprobe_len();
+    const int abits_copied  = implied_copy + to_copy; // Bits from original key already copied, explicitly or implicitly
+
+    do {
+      int bits_copied = abits_copied;
+
+      w  = offsets_.word_offset(cid, &o, &lo, data_);
+      kw = w + o->key.woff;
+
+      if(o->key.sb_mask1) { // key split on multiple words
+        nkey = akey << o->key.boff;
+        nkey |= o->key.sb_mask1;
+        nkey &= o->key.mask1;
+
+        key_claimed = set_key(kw, nkey, o->key.mask1, o->key.mask1, is_new);
+        if(key_claimed) {
+          nkey = akey >> o->key.shift;
+          if(o->key.full_words) {
+            // Copy full words. First one is special
+            nkey                  |= key.get_bits(bits_copied, o->key.shift - 1) << (wsize - o->key.shift);
+            bits_copied           += o->key.shift - 1;
+            nkey                  |= o->key.sb_mask1; // Set bit is MSB
+            int copied_full_words  = 1;
+            key_claimed            = set_key(kw + copied_full_words, nkey, fmask, fmask, is_new);
+            // Copy more full words if needed
+            while(bits_copied + wsize - 1 <= key_len_ && key_claimed) {
+              nkey               = key.get_bits(bits_copied, wsize - 1);
+              bits_copied       += wsize - 1;
+              nkey              |= o->key.sb_mask1;
+              copied_full_words += 1;
+              key_claimed        = set_key(kw + copied_full_words, nkey, fmask, fmask, is_new);
+            }
+            assert(!key_claimed || (bits_copied < key_len_) == (o->key.sb_mask2 != 0));
+            if(o->key.sb_mask2 && key_claimed) { // Copy last word
+              nkey               = key.get_bits(bits_copied, key_len_ - bits_copied);
+              nkey              |= o->key.sb_mask2;
+              copied_full_words += 1;
+              key_claimed        = set_key(kw + copied_full_words, nkey, o->key.mask2, o->key.mask2, is_new);
+            }
+          } else if(o->key.sb_mask2) { // if bits_copied + wsize - 1 < key_len
+            // Copy last word, no full words copied
+            nkey        |= key.get_bits(bits_copied, key_len_ - bits_copied) << (wsize - o->key.shift);
+            nkey        |= o->key.sb_mask2;
+            nkey        &= o->key.mask2;
+            key_claimed  = set_key(kw + 1, nkey, o->key.mask2, o->key.mask2, is_new);
+          }
+        } // if(key_claimed)
+      } else { // key on one word
+        nkey = akey << o->key.boff;
+        nkey &= o->key.mask1;
+        key_claimed = set_key(kw, nkey, o->key.mask1, o->key.mask1, is_new);
+      }
+      if(!key_claimed) { // reprobe
+        if(++reprobe > reprobe_limit_.val())
+          return false;
+        cid = (*id + reprobes_[reprobe]) & size_mask_;
+        akey = (akey & ~offsets_.reprobe_mask()) | (reprobe + 1);
+      }
+    } while(!key_claimed);
+
+    *id  = cid;
+    *_w  = w;
+    *_ao = o;
+    return true;
+  }
+
+  // Claim large key. Enter an entry for a key when it is not the
+  // first entry. Only encode the number of reprobe hops back to the
+  // first entry of the key in the hash table. It is simpler as can
+  // takes less than one word in length.
+  bool claim_large_key(size_t* id, const offset_t** _ao, word** _w) {
+    uint_t          reprobe     = 0;
+    size_t          cid         = *id;
+    const offset_t *o, *lo;
+    word           *w, *kw, nkey;
+    bool            key_claimed = false;
+
+    do {
+      w = offsets_.word_offset(cid, &o, &lo, data_);
+      kw = w + lo->key.woff;
+
+      if(lo->key.sb_mask1) { // key split on multiple words
+        nkey = (reprobe << lo->key.boff) | lo->key.sb_mask1 | lo->key.lb_mask;
+        nkey &= lo->key.mask1;
+
+        // Use o->key.mask1 and not lo->key.mask1 as the first one is
+        // guaranteed to be bigger. The key needs to be free on its
+        // longer mask to claim it!
+        key_claimed = set_key(kw, nkey, o->key.mask1, lo->key.mask1);
+        if(key_claimed) {
+          nkey         = (reprobe >> lo->key.shift) | lo->key.sb_mask2;
+          nkey        &= lo->key.mask2;
+          key_claimed  = set_key(kw + 1, nkey, o->key.full_words ? fmask : o->key.mask2, lo->key.mask2);
+        }
+      } else { // key on 1 word
+        nkey  = (reprobe << lo->key.boff) | lo->key.lb_mask;
+        nkey &= lo->key.mask1;
+        key_claimed = set_key(kw, nkey, o->key.mask1, lo->key.mask1);
+      }
+      if(!key_claimed) { //reprobe
+        if(++reprobe > reprobe_limit_.val())
+          return false;
+        cid  = (*id + reprobes_[reprobe]) & size_mask_;
+      }
+    } while(!key_claimed);
+
+    *id  = cid;
+    *_w  = w;
+    *_ao = lo;
+    return true;
+  }
+
+  // Add val to key. id is the starting place (result of hash
+  // computation). eid is set to the effective place in the
+  // array. large is set to true is setting a large key (upon
+  // recurrence if there is a carry).
+  bool add_rec(size_t id, const key_type& key, word val, bool large, bool* is_new, size_t* eid, unsigned int* carry_shift) {
+    const offset_t *ao = 0;
+    word	   *w  = 0;
+
+    bool claimed = false;
+    if(large)
+      claimed = claim_large_key(&id, &ao, &w);
+    else
+      claimed = claim_key(key, is_new, &id, &ao, &w);
+    if(!claimed)
+      return false;
+    *eid = id;
+    return add_rec_at(id, key, val, ao, w, carry_shift);
+  }
+
+  bool add_rec_at(size_t id, const key_type& key, word val, const offset_t* ao, word* w, unsigned int* carry_shift) {
+    // Increment value
+    word *vw       = w + ao->val.woff;
+    word  cary     = add_val(vw, val, ao->val.boff, ao->val.mask1);
+    cary         >>= ao->val.shift;
+    *carry_shift  += ao->val.shift;
+    if(cary && ao->val.mask2) { // value split on two words
+      cary           = add_val(vw + 1, cary, 0, ao->val.mask2);
+      cary         >>= ao->val.cshift;
+      *carry_shift  += ao->val.cshift;
+    }
+    if(!cary)
+      return true;
+
+    id = (id + reprobes_[0]) & size_mask_;
+    size_t ignore_eid;
+    bool   ignore_is_new;
+    return add_rec(id, key, cary, true, &ignore_is_new, &ignore_eid, carry_shift);
+
+      // // Adding failed, table is full. Need to back-track and
+      // // substract val.
+      //      std::cerr << "Failed to add large part of value -> return false\n";
+      // cary = add_val(vw, ((word)1 << offsets_.val_len()) - val,
+      //                ao->val.boff, ao->val.mask1);
+      // cary >>= ao->val.shift;
+      // if(cary && ao->val.mask2) {
+      //   // Can I ignore the cary here? Table is known to be full, so
+      //   // not much of a choice. But does it leave the table in a
+      //   // consistent state?
+      //   add_val(vw + 1, cary, 0, ao->val.mask2);
+      // }
+      //      return false;
+  }
+
+  // Atomic methods to set the key. Attempt to set nkey in word w. All
+  // bits matching free_mask must be unset and the bits matching
+  // equal_mask must be equal for a success in setting the key. Set
+  // is_new to true if the spot was previously empty. Otherwise, if
+  // is_new is false but true is returned, the key was already present
+  // at that spot.
+  inline bool set_key(word *w, word nkey, word free_mask, word equal_mask, bool *is_new) {
+    word ow = *w, nw, okey;
+
+    okey = ow & free_mask;
+    while(okey == 0) { // large bit not set && key is free
+      nw = atomic_.cas(w, ow, ow | nkey);
+      if(nw == ow) {
+        *is_new = true;
+        return true;
+      }
+      ow = nw;
+      okey = ow & free_mask;
+    }
+    *is_new = false;
+    return (ow & equal_mask) == nkey;
+  }
+
+  inline bool set_key(word *w, word nkey, word free_mask, word equal_mask) {
+    bool is_new;
+    return set_key(w, nkey, free_mask, equal_mask, &is_new);
+  }
+
+  // Add val the value in word w, with shift and mask giving the
+  // particular part of the word in which the value is stored. The
+  // return value is the carry.
+  inline word add_val(word *w, word val, uint_t shift, word mask) {
+    word now = *w, ow, nw, nval;
+
+    do {
+      ow = now;
+      nval = ((ow & mask) >> shift) + val;
+      nw = (ow & ~mask) | ((nval << shift) & mask);
+      now = atomic_.cas(w, ow, nw);
+    } while(now != ow);
+
+    return nval & (~(mask >> shift));
+  }
+
+  // Return the key and value at position id. If the slot at id is
+  // empty or has the large bit set, returns false. Otherwise, returns
+  // the key and the value is the sum of all the entries in the hash
+  // table for that key. I.e., the table is search forward for entries
+  // with large bit set pointing back to the key at id, and all those
+  // values are summed up.
+  key_status get_key_val_at_id(size_t id, key_type& key, word& val, const bool carry_bit = false) const {
+    const word*     w;
+    const offset_t* o;
+
+    key_status st = get_key_at_id(id, key, &w, &o);
+    if(st != FILLED)
+       return st;
+
+    val = get_val_at_id(id, w, o, true, carry_bit);
+
+    return FILLED;
+  }
+
+  // Get a the key at the given id. It also returns the word and
+  // offset information in w and o. The return value is EMPTY (no key
+  // at id), FILLED (there is a key at id), LBSET (the large bit is
+  // set, hence the key is only a pointer back to the real key).
+  //
+  // The key returned contains the original id in the hash as its
+  // lsize_ lsb bits. To obtain the full key, one needs to compute the
+  // product with the inverse matrix to get the lsb bits.
+  inline key_status get_key_at_id(size_t id, key_type& key, const word** w, const offset_t** o) const {
+    const offset_t *lo;
+    *w = offsets_.word_offset(id, o, &lo, data_);
+    return get_key_at_id(id, key, *w, *o);
+  }
+
+  // Sam as above, but it assume that the word w and o for id have
+  // already be computed (like already prefetched).
+  key_status get_key_at_id(size_t id, key_type&key, const word* w, const offset_t* o) const {
+    const word*     kvw      = w + o->key.woff;
+    word            key_word = *kvw;
+    word            kreprobe = 0;
+
+    const key_offsets& key_o = o->key;
+    if(key_word & key_o.lb_mask)
+      return LBSET;
+    const int implied_copy = std::min(lsize_, key_len_);
+    int       bits_copied  = implied_copy;
+    if(key_o.sb_mask1) {
+      if((key_word & key_o.sb_mask1) == 0)
+        return EMPTY;
+      kreprobe = (key_word & key_o.mask1 & ~key_o.sb_mask1) >> key_o.boff;
+      if(key_o.full_words) {
+        // Copy full words. First one is special
+        key_word = *(kvw + 1);
+        if(offsets_.reprobe_len() < key_o.shift) {
+          key.set_bits(bits_copied, key_o.shift - offsets_.reprobe_len(), kreprobe >> offsets_.reprobe_len());
+          bits_copied += key_o.shift - offsets_.reprobe_len();
+          kreprobe    &= offsets_.reprobe_mask();
+          key.set_bits(bits_copied, wsize - 1, key_word & ~key_o.sb_mask1);
+          bits_copied += wsize - 1;
+        } else {
+          int reprobe_left  = offsets_.reprobe_len() - key_o.shift;
+          kreprobe         |= (key_word & (((word)1 << reprobe_left) - 1)) << key_o.shift;
+          key.set_bits(bits_copied, wsize - 1 - reprobe_left, (key_word & ~key_o.sb_mask1) >> reprobe_left);
+          bits_copied += wsize - 1 - reprobe_left;
+        }
+        int word_copied = 2;
+        while(bits_copied + wsize - 1 <= key_len_) {
+          key.set_bits(bits_copied, wsize - 1, *(kvw + word_copied++) & (fmask >> 1));
+          bits_copied += wsize - 1;
+        }
+        if(key_o.sb_mask2)
+          key.set_bits(bits_copied, key_len_ - bits_copied, *(kvw + word_copied) & key_o.mask2 & ~key_o.sb_mask2);
+      } else if(key_o.sb_mask2) { // if(bits_copied + wsize - 1 < key_len
+        // Two words but no full words
+        key_word = *(kvw + 1) & key_o.mask2 & ~key_o.sb_mask2;
+        if(offsets_.reprobe_len() < key_o.shift) {
+          key.set_bits(bits_copied, key_o.shift - offsets_.reprobe_len(), kreprobe >> offsets_.reprobe_len());
+          bits_copied += key_o.shift - offsets_.reprobe_len();
+          kreprobe    &= offsets_.reprobe_mask();
+          key.set_bits(bits_copied, key_len_ - bits_copied, key_word);
+        } else {
+          int reprobe_left  = offsets_.reprobe_len() - key_o.shift;
+          kreprobe         |= (key_word & (((word)1 << reprobe_left) - 1)) << key_o.shift;
+          key.set_bits(bits_copied, key_len_ - bits_copied, key_word >> reprobe_left);
+        }
+      }
+    } else { // if(key_o.sb_mask1
+      // Everything in 1 word
+      key_word = (key_word & key_o.mask1) >> key_o.boff;
+      if(key_word == 0)
+        return EMPTY;
+      kreprobe = key_word & offsets_.reprobe_mask();
+      key.set_bits(bits_copied, raw_key_len_, key_word >> offsets_.reprobe_len());
+    }
+    // Compute missing oid so that the original key can be computed
+    // back through the inverse matrix. Although the key may have a
+    // length of key_len_, which may be less than lsize_, assume that
+    // it still fit here as lsize_ is less than a word length. Need all lsize_.
+    size_t oid = id; // Original id
+    if(kreprobe > 1)
+      oid -= reprobes_[kreprobe - 1];
+    oid &= size_mask_;
+    // Can use more bits than mer size. That's OK, will fix it later
+    // when computing the actual mers by computing the product with
+    // the inverse matrix.
+    key.template set_bits<0>(0, lsize_, oid);
+
+    return FILLED;
+  }
+
+  word get_val_at_id(const size_t id, const word* w, const offset_t* o, const bool reprobe = true,
+                     const bool carry_bit = false) const {
+    word            val = 0;
+    if(val_len() == 0)
+      return val;
+
+    // First part of value
+    const word* kvw = w + o->val.woff;
+    val = ((*kvw) & o->val.mask1) >> o->val.boff;
+    if(o->val.mask2)
+      val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
+
+    // Do we want to get the large value
+    bool do_reprobe = reprobe;
+    if(carry_bit && do_reprobe) {
+      do_reprobe   = do_reprobe && (val & 0x1);
+      val        >>= 1;
+    }
+    if(!do_reprobe)
+      return val;
+
+    return resolve_val_rec((id + reprobes_[0]) & size_mask_, val, carry_bit);
+  }
+
+  word resolve_val_rec(const size_t id, word val, const bool carry_bit, const uint_t overflows = 0) const {
+    uint_t          reprobe = 0;
+    size_t          cid     = id;
+
+    while(reprobe <= reprobe_limit_.val()) {
+      const offset_t     *o, *lo;
+      const word*         w    = offsets_.word_offset(cid, &o, &lo, data_);
+      const word*         kw   = w + o->key.woff;
+      word                nkey = *kw;
+      const key_offsets&  lkey = lo->key;
+
+      if(nkey & lkey.lb_mask) {
+        // If the large bit is set, the size of the key (reprobe_len)
+        // is guaranteed to have a length of at most 1 word.
+        if(lkey.sb_mask1) {
+          nkey  = (nkey & lkey.mask1 & ~lkey.sb_mask1) >> lkey.boff;
+          nkey |= ((*(kw+1)) & lkey.mask2 & ~lkey.sb_mask2) << lkey.shift;
+        } else {
+          nkey = (nkey & lkey.mask1) >> lkey.boff;
+        }
+        if(nkey == reprobe) {
+          const val_offsets& lval = lo->val;
+          const word*        vw   = w + lval.woff;
+          word               nval = ((*vw) & lval.mask1) >> lval.boff;
+          if(lval.mask2)
+            nval |= ((*(vw+1)) & lval.mask2) << lval.shift;
+
+          bool do_reprobe = true;
+          if(carry_bit) {
+            do_reprobe   = nval & 0x1;
+            nval       >>= 1;
+          }
+
+          nval <<= offsets_.val_len();
+          nval <<= offsets_.lval_len() * overflows;
+          val   += nval;
+
+          if(!do_reprobe)
+            return val;
+
+          return resolve_val_rec((cid + reprobes_[0]) & size_mask_, val, carry_bit, overflows + 1);
+        }
+      } else if((nkey & o->key.mask1) == 0) {
+        break;
+      }
+
+      cid  = (id + reprobes_[++reprobe]) & size_mask_;
+    }
+
+    return val;
+  }
+
+};
+
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc, typename mem_block_t = ::allocators::mmap>
+class array :
+    protected mem_block_t,
+    public array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> >
+{
+  typedef array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> > super;
+  friend class array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> >;
+
+public:
+  array(size_t size, // Size of hash. To be rounded up to a power of 2
+        uint16_t key_len, // Size of key in bits
+        uint16_t val_len, // Size of val in bits
+        uint16_t reprobe_limit, // Maximum reprobe
+        const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+    mem_block_t(),
+    super(size, key_len, val_len, reprobe_limit, RectangularBinaryMatrix(ceilLog2(size), key_len).randomize_pseudo_inverse(),
+          reprobes)
+  { }
+
+protected:
+  word* alloc_data(size_t s) {
+    mem_block_t::realloc(s);
+    return (word*)mem_block_t::get_ptr();
+  }
+};
+
+struct ptr_info {
+  void*  ptr_;
+  size_t bytes_;
+  ptr_info(void* ptr, size_t bytes) : ptr_(ptr), bytes_(bytes) { }
+};
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc>
+class array_raw :
+    protected ptr_info,
+    public array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> >
+{
+  typedef array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> > super;
+  friend class array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> >;
+
+public:
+  array_raw(void* ptr,
+            size_t bytes, // Memory available at ptr
+            size_t size, // Size of hash in number of entries. To be rounded up to a power of 2
+            uint16_t key_len, // Size of key in bits
+            uint16_t val_len, // Size of val in bits
+            uint16_t reprobe_limit, // Maximum reprobe
+            RectangularBinaryMatrix m,
+            const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+    ptr_info(ptr, bytes),
+    super(size, key_len, val_len, reprobe_limit, m, reprobes)
+  { }
+
+protected:
+  word* alloc_data(size_t s) {
+    assert(bytes_ == s);
+    return (word*)ptr_;
+  }
+};
+
+} } // namespace jellyfish { namespace large_hash_array
+
+#endif /* __JELLYFISH_LARGE_HASH_ARRAY_HPP__ */
diff --git a/include/jellyfish/large_hash_iterator.hpp b/include/jellyfish/large_hash_iterator.hpp
new file mode 100644
index 0000000..80d9d25
--- /dev/null
+++ b/include/jellyfish/large_hash_iterator.hpp
@@ -0,0 +1,260 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __LARGE_HASH_ITERATOR_HPP__
+#define __LARGE_HASH_ITERATOR_HPP__
+
+#include <iterator>
+#include <utility>
+
+/// Various iterators for the large hash array
+
+namespace jellyfish { namespace large_hash {
+
+/// Eager iterator. It computes the actual key and value when doing next.
+template<typename array>
+class eager_iterator_base {
+public:
+  typedef typename array::key_type    key_type;
+  typedef typename array::mapped_type mapped_type;
+  typedef typename array::key_status  key_status;
+
+protected:
+  const array* ary_;
+  size_t       start_id_, id_, end_id_;
+  key_type     key_;
+  mapped_type  val_;
+
+public:
+  eager_iterator_base(const array* ary, size_t start, size_t end) :
+    ary_(ary),
+    start_id_(start > ary->size() ? ary->size() : start),
+    id_(start),
+    end_id_(end > ary->size() ? ary->size() : end)
+  {}
+
+  uint64_t start() const { return start_id_; }
+  uint64_t end() const { return end_id_; }
+  const key_type& key() const { return key_; }
+  const mapped_type& val() const { return val_; }
+  size_t id() const { return id_ - 1; }
+  size_t pos() const { return key_.get_bits(0, ary_->lsize()); }
+
+  bool next() {
+    key_status success = array::EMPTY;
+    while(success != array::FILLED && id_ < end_id_)
+      success = ary_->get_key_val_at_id(id_++, key_, val_);
+    if(success == array::FILLED)
+      key_.set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(key_));
+
+    return success == array::FILLED;
+  }
+};
+
+/// Lazy iterator. The actual key and value are actually computed only
+/// when the key() and val() methods are called.
+template<typename array>
+class lazy_iterator_base {
+public:
+  typedef typename array::key_type    key_type;
+  typedef typename array::mapped_type mapped_type;
+  typedef typename array::key_status  key_status;
+  typedef typename array::data_word   word;
+  typedef typename array::offset_t    offset_t;
+
+protected:
+  const array*    ary_;
+  size_t          start_id_, id_, end_id_;
+  const word*     w_;
+  const offset_t* o_;
+  bool            reversed_key_;
+  key_type        key_;
+
+public:
+  lazy_iterator_base(const array *ary, size_t start, size_t end) :
+    ary_(ary),
+    start_id_(ary ? (start > ary->size() ? ary->size() : start) : 0),
+    id_(start),
+    end_id_(ary ? (end > ary->size() ? ary->size() : end) : 0),
+    w_(0), o_(0),
+    reversed_key_(false)
+  {}
+
+  uint64_t start() const { return start_id_; }
+  uint64_t end() const { return end_id_; }
+  const key_type& key() {
+    if(!reversed_key_) {
+      key_.set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(key_));
+      reversed_key_ = true;
+    }
+    return key_;
+  }
+  mapped_type val() const {
+    return ary_->get_val_at_id(id_ - 1, w_, o_, true, false);
+  }
+  size_t id() const { return id_ - 1; }
+  size_t pos() const { return key_.get_bits(0, ary_->lsize()); }
+
+  bool next() {
+    reversed_key_      = false;
+    key_status success = array::EMPTY;
+    while(success != array::FILLED && id_ < end_id_)
+      success = ary_->get_key_at_id(id_++, key_, &w_, &o_);
+
+    return success == array::FILLED;
+  }
+};
+
+/// Region iterator. Iterate over elements whose original position
+/// (and not position after reprobing) falls inside the region
+/// [start_id, end_id)
+template<typename array>
+class region_iterator_base {
+  public:
+  typedef typename array::key_type    key_type;
+  typedef typename array::mapped_type mapped_type;
+  typedef typename array::key_status  key_status;
+  typedef typename array::data_word   word;
+  typedef typename array::offset_t    offset_t;
+
+protected:
+  const array*    ary_;
+  const uint64_t  mask_;
+  const size_t    start_id_, end_id_, mid_;
+  size_t          oid_, id_;
+  const word*     w_;
+  const offset_t* o_;
+  bool            reversed_key_;
+  key_type*       key_;
+  bool            own_key;
+
+public:
+  region_iterator_base(const array *ary, size_t start, size_t end) :
+    ary_(ary), mask_(ary ? ary->size() - 1 : 0),
+    start_id_(ary ? std::min(start, ary->size()) : 0),
+    end_id_(ary ? std::min(end, ary->size()) : 0),
+    mid_(ary ? std::min(end_id_ - start_id_ + ary->max_reprobe_offset(), ary->size()) : 0),
+    oid_(end_id_), id_(0), w_(0), o_(0),
+    reversed_key_(false),
+    key_(new key_type),
+    own_key(true)
+  {}
+
+  region_iterator_base(const array *ary, size_t start, size_t end, key_type& key) :
+    ary_(ary), mask_(ary ? ary->size() - 1 : 0),
+    start_id_(ary ? std::min(start, ary->size()) : 0),
+    end_id_(ary ? std::min(end, ary->size()) : 0),
+    mid_(ary ? std::min(end_id_ - start_id_ + ary->max_reprobe_offset(), ary->size()) : 0),
+    oid_(end_id_), id_(0), w_(0), o_(0),
+    reversed_key_(false),
+    key_(&key),
+    own_key(false)
+  { }
+
+  ~region_iterator_base() {
+    if(own_key)
+      delete key_;
+  }
+
+  const key_type& key() {
+    if(!reversed_key_) {
+      key_->set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(*key_));
+      reversed_key_ = true;
+    }
+    return *key_;
+  }
+  mapped_type val() const {
+    return ary_->get_val_at_id(id(), w_, o_, true, false);
+  }
+  uint64_t pos() const{
+    return oid_;
+  }
+
+  size_t start() { return start_id_; }
+  size_t end() { return end_id_; }
+
+  /// Position where key is stored
+  size_t id() const { return (start_id_ + id_ - 1) & mask_; }
+  /// Original position (before reprobing).
+  size_t oid() const { return oid_; }
+
+  bool next() {
+    reversed_key_  = false;
+    bool found_oid = false;
+    while(!found_oid && id_ < mid_) {
+      if(ary_->get_key_at_id((start_id_ + id_++) & mask_, *key_, &w_, &o_) == array::FILLED) {
+        oid_ = key_->get_bits(0, ary_->lsize());
+        found_oid = start_id_ <= oid_ && oid_ < end_id_;
+      }
+    }
+
+    return found_oid;
+
+  }
+};
+
+/// STL like iterator on a large hash array.
+template<typename array>
+class stl_iterator_base :
+    public std::iterator<std::forward_iterator_tag, typename array::value_type>,
+    public array::lazy_iterator
+{
+public:
+  typedef typename array::key_type    key_type;
+  typedef typename array::mapped_type mapped_type;
+  typedef typename array::value_type  value_type;
+
+protected:
+  typedef typename array::lazy_iterator           lit;
+  typedef std::pair<key_type&, mapped_type> pair;
+  pair val_;
+
+public:
+  explicit stl_iterator_base(const array* ary, size_t start_id = 0) :
+    lit(ary, start_id, ary->size()), val_(lit::key_, (mapped_type)0)
+  { ++*this; }
+  stl_iterator_base(const array* ary, size_t start_id, size_t end_id) :
+    lit(ary, start_id, end_id), val_(lit::key_, (mapped_type)0)
+  { ++*this; }
+  explicit stl_iterator_base() : lit(0, 0, 0), val_(lit::key_, (mapped_type)0) { }
+  stl_iterator_base(const stl_iterator_base& rhs) : lit(rhs), val_(lit::key_, rhs.val_.second) { }
+
+  bool operator==(const stl_iterator_base& rhs) const { return lit::ary_ == rhs.ary_ && lit::id_ == rhs.id_; }
+  bool operator!=(const stl_iterator_base& rhs) const { return !(*this == rhs); }
+
+  const value_type& operator*() {
+    lit::key();
+    val_.second = lit::val();
+    return val_;
+  }
+  const value_type* operator->() { return &this->operator*(); }
+
+  stl_iterator_base& operator++() {
+    if(!lit::next()) {
+      lit::ary_ = 0;
+      lit::id_  = 0;
+    }
+    return *this;
+  }
+
+  stl_iterator_base operator++(int) {
+    stl_iterator_base res(*this);
+    ++*this;
+    return res;
+  }
+};
+} } // namespace jellyfish { namespace large_hash {
+#endif /* __LARGE_HASH_ITERATOR_HPP__ */
diff --git a/include/jellyfish/locks_pthread.hpp b/include/jellyfish/locks_pthread.hpp
new file mode 100644
index 0000000..55496a8
--- /dev/null
+++ b/include/jellyfish/locks_pthread.hpp
@@ -0,0 +1,211 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_LOCKS_PTHREAD_HPP__
+#define __JELLYFISH_LOCKS_PTHREAD_HPP__
+
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jellyfish { namespace locks{ namespace pthread {
+class cond
+{
+  pthread_mutex_t   _mutex;
+  pthread_cond_t	_cond;
+
+public:
+  cond() {
+    pthread_mutex_init(&_mutex, NULL);
+    pthread_cond_init(&_cond, NULL);
+  }
+
+  ~cond() {
+    pthread_cond_destroy(&_cond);
+    pthread_mutex_destroy(&_mutex);
+  }
+
+  inline void lock() { pthread_mutex_lock(&_mutex); }
+  inline void unlock() { pthread_mutex_unlock(&_mutex); }
+  inline void wait() { pthread_cond_wait(&_cond, &_mutex); }
+  inline void signal() { pthread_cond_signal(&_cond); }
+  inline void broadcast() { pthread_cond_broadcast(&_cond); }
+  inline int timedwait(struct timespec *abstime) {
+    return pthread_cond_timedwait(&_cond, &_mutex, abstime);
+  }
+  inline int timedwait(time_t seconds) {
+    struct timespec curtime;
+#ifdef HAVE_CLOCK_GETTIME
+    clock_gettime(CLOCK_REALTIME, &curtime);
+#else
+    struct timeval timeofday;
+    gettimeofday(&timeofday, 0);
+    curtime.tv_sec  = timeofday.tv_sec;
+    curtime.tv_nsec = timeofday.tv_usec * 1000;
+#endif
+    curtime.tv_sec += seconds;
+    return timedwait(&curtime);
+  }
+};
+
+class mutex {
+  pthread_mutex_t     _mutex;
+
+public:
+  mutex(int type = PTHREAD_MUTEX_DEFAULT) {
+    pthread_mutexattr_t attr;
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr, type);
+    pthread_mutex_init(&_mutex, &attr);
+  }
+
+  ~mutex() {
+    pthread_mutex_destroy(&_mutex);
+  }
+
+  inline void lock() { pthread_mutex_lock(&_mutex); }
+  inline void unlock() { pthread_mutex_unlock(&_mutex); }
+  inline bool try_lock() { return !pthread_mutex_trylock(&_mutex); }
+};
+
+class mutex_recursive : public mutex {
+public:
+  mutex_recursive() : mutex(PTHREAD_MUTEX_RECURSIVE) { }
+};
+
+class mutex_lock {
+  mutex& m_;
+public:
+  explicit mutex_lock(mutex& m) : m_(m) { m_.lock(); }
+  ~mutex_lock() { m_.unlock(); }
+};
+
+class Semaphore {
+  int _value, _wakeups;
+  cond _cv;
+public:
+        explicit Semaphore(int value) :
+  _value(value),
+  _wakeups(0)
+  {
+    // nothing to do
+  }
+
+  ~Semaphore() {}
+
+  inline void wait() {
+    _cv.lock();
+    _value--;
+    if (_value < 0) {
+      do {
+        _cv.wait();
+      } while(_wakeups < 1);
+      _wakeups--;
+    }
+    _cv.unlock();
+  }
+
+  inline void signal() {
+    _cv.lock();
+    _value++;
+    if(_value <= 0) {
+      _wakeups++;
+      _cv.signal();
+    }
+    _cv.unlock();
+  }
+};
+
+#if defined(_POSIX_BARRIERS) && (_POSIX_BARRIERS - 20012L) >= 0
+class barrier
+{
+  pthread_barrier_t _barrier;
+
+public:
+      explicit barrier(unsigned count) {
+
+    pthread_barrier_init(&_barrier, NULL, count);
+  }
+
+  ~barrier() {
+    pthread_barrier_destroy(&_barrier);
+  }
+
+  /// Return true if serial thread.
+  inline bool wait() {
+    return pthread_barrier_wait(&_barrier) == PTHREAD_BARRIER_SERIAL_THREAD;
+  }
+};
+
+#else
+// #  ifndef PTHREAD_BARRIER_SERIAL_THREAD
+// #    define  PTHREAD_BARRIER_SERIAL_THREAD 1
+// #  endif
+
+class barrier
+{
+  int count; // required # of threads
+  int current;    // current # of threads that have passed thru
+  mutex barlock;  // protect current
+  Semaphore barrier1; // implement the barrier
+  Semaphore barrier2;
+
+public:
+      explicit barrier(unsigned cnt)
+  : count(cnt), current(0), barrier1(0), barrier2(0) {
+  }
+
+  ~barrier() {}
+
+  inline bool wait() {
+    bool ret = false;
+    barlock.lock();
+    current += 1;
+    if(current == count) {
+      ret = true;
+      for(int i=0; i<count;i++) {
+        barrier1.signal();
+      }
+    }
+    barlock.unlock();
+    barrier1.wait(); // wait for n threads to arrive
+
+    barlock.lock();
+    current -= 1;
+    if(current == 0) {
+      for(int i=0;i<count;i++) {
+        barrier2.signal();
+      }
+    }
+    barlock.unlock();
+    barrier2.wait();
+    return ret;
+  }
+};
+
+#endif
+} //namespace pthread {
+
+typedef pthread::cond cond;
+typedef pthread::mutex mutex;
+typedef pthread::barrier barrier;
+} } // namespace jellyfish { namespace { locks
+
+#endif /* __JELLYFISH_LOCKS_PTHREAD_HPP__ */
diff --git a/include/jellyfish/mapped_file.hpp b/include/jellyfish/mapped_file.hpp
new file mode 100644
index 0000000..c2e1443
--- /dev/null
+++ b/include/jellyfish/mapped_file.hpp
@@ -0,0 +1,220 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MAPPED_FILE_HPP__
+#define __JELLYFISH_MAPPED_FILE_HPP__
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <vector>
+#include <errno.h>
+#include <iostream>
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+class mapped_file {
+protected:
+  std::string  _path;
+  char        *_base, *_end;
+  size_t       _length;
+
+  void map_(int fd) {
+    struct stat stat;
+    if(fstat(fd, &stat) < 0)
+      throw ErrorMMap(err::msg() << "Can't stat file '" << _path << "'" << err::no);
+
+    _length = stat.st_size;
+    _base = (char*)mmap(NULL, _length, PROT_READ, MAP_SHARED, fd, 0);
+    if(_base == MAP_FAILED) {
+      _base = 0;
+      throw ErrorMMap(err::msg() << "Can't mmap file '" << _path << "'" << err::no);
+    }
+    _end = _base + _length;
+  }
+
+  void map_(const char *filename) {
+    int fd = open(filename, O_RDONLY);
+    if(fd < 0)
+      throw ErrorMMap(err::msg() << "Can't open file '" << filename << "'" << err::no);
+    map_(fd);
+    close(fd);
+  }
+
+
+public:
+  define_error_class(ErrorMMap);
+  mapped_file() : _path(), _base(0), _end(0), _length(0) { }
+  explicit mapped_file(const char *filename)
+  : _path(filename), _base(0), _end(0), _length(0)
+  {
+    map_(filename);
+  }
+  explicit mapped_file(int fd)
+  : _path(), _base(0), _end(0), _length()
+  {
+    map_(fd);
+  }
+  mapped_file(mapped_file&& rhs)
+  : _path(std::move(rhs._path)), _base(rhs._base), _end(rhs._end),
+    _length(rhs._length)
+  {
+    rhs._base = 0;
+  }
+
+  ~mapped_file() {
+    unmap();
+  }
+
+  void map(const char* filename) {
+    unmap();
+    map_(filename);
+  }
+
+  void map(int fd) {
+    unmap();
+    map_(fd);
+  }
+
+  void unmap() {
+    if(!_base)
+      return;
+    munmap(_base, _length);
+    _path.clear();
+    _base   = 0;
+    _length = 0;
+  }
+
+  mapped_file& operator=(mapped_file&& rhs) {
+    _path     = std::move(rhs._path);
+    _base     = rhs._base;
+    rhs._base = 0;
+    _end      = rhs._end;
+    _length   = rhs._length;
+    return *this;
+  }
+
+  void swap(mapped_file& rhs) {
+    std::swap(_path, rhs._path);
+    std::swap(_base, rhs._base);
+    std::swap(_end, rhs._end);
+    std::swap(_length, rhs._length);
+  }
+
+  char *base() const { return _base; }
+  char *end() const { return _end; }
+  size_t length() const { return _length; }
+  std::string path() const { return _path; }
+
+  // No error checking here. Should I throw something?
+  const mapped_file & will_need() const {
+    madvise(_base, _length, MADV_WILLNEED);
+    return *this;
+  }
+  const mapped_file & sequential() const {
+    madvise(_base, _length, MADV_SEQUENTIAL);
+    return *this;
+  }
+  const mapped_file & random() const {
+    madvise(_base, _length, MADV_RANDOM);
+    return *this;
+  }
+  const mapped_file & lock() const {
+    if(mlock(_base, _length) < 0)
+      throw ErrorMMap(err::msg() << "Can't lock map in memory" << err::no);
+    return *this;
+  }
+
+  char load() const {
+    const long    sz     = sysconf(_SC_PAGESIZE);
+    // Do not optimize. Side effect is that every page is accessed and
+    // should now be in cache.
+    volatile char unused = 0;
+    for(const char *w = _base; w < _base + _length; w += sz)
+      unused ^= *w;
+    return unused;
+  }
+};
+inline void swap(mapped_file& a, mapped_file& b) { a.swap(b); }
+
+// class mapped_files_t : public std::vector<mapped_file> {
+// public:
+//   mapped_files_t(int nb_files, char *argv[]) {
+//     for(int j = 0; j < nb_files; j++)
+//       push_back(mapped_file(argv[j]));
+//   }
+
+//   mapped_files_t(int nb_files, char *argv[], bool sequential) {
+//     for(int j = 0; j < nb_files; j++) {
+//       push_back(mapped_file(argv[j]));
+//       if(sequential)
+//         end()->sequential();
+//     }
+//   }
+// };
+
+// // File mapped on demand.
+// class lazy_mapped_file_t : public mapped_file {
+//   std::string       _path;
+//   volatile bool     done;
+//   volatile long     used_counter;
+
+// public:
+//   explicit lazy_mapped_file_t(const char *path) :
+//     mapped_file((char *)0, (size_t)0),
+//     _path(path), done(false), used_counter(0) {}
+
+//   void map() {
+//     used_counter = 1;
+//     done = false;
+//     mapped_file::map(_path.c_str());
+//   }
+//   void unmap() {
+//     done = true;
+//     dec();
+//   }
+
+//   void inc() {
+//     atomic::gcc::fetch_add(&used_counter, (long)1);
+//   }
+//   void dec() {
+//     long val = atomic::gcc::add_fetch(&used_counter, (long)-1);
+//     if(done && val == 0)
+//       mapped_file::unmap();
+//   }
+// };
+
+// class lazy_mapped_files_t : public std::vector<lazy_mapped_file_t> {
+// public:
+//   lazy_mapped_files_t(int nb_files, char *argv[]) {
+//     for(int j = 0; j < nb_files; j++)
+//       push_back(lazy_mapped_file_t(argv[j]));
+//   }
+
+//   lazy_mapped_files_t(int nb_files, char *argv[], bool sequential) {
+//     for(int j = 0; j < nb_files; j++) {
+//       push_back(lazy_mapped_file_t(argv[j]));
+//       if(sequential)
+//         end()->sequential();
+//     }
+//   }
+// };
+
+}
+#endif
diff --git a/include/jellyfish/mer_dna.hpp b/include/jellyfish/mer_dna.hpp
new file mode 100644
index 0000000..b2e875f
--- /dev/null
+++ b/include/jellyfish/mer_dna.hpp
@@ -0,0 +1,729 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_DNA_HPP__
+#define __JELLYFISH_MER_DNA_HPP__
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdint.h>
+#include <string.h>
+
+#include <iostream>
+#include <string>
+#include <stdexcept>
+#include <limits>
+#include <iterator>
+
+#include <jellyfish/misc.hpp>
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+#endif
+
+namespace jellyfish { namespace mer_dna_ns {
+#define R -1
+#define I -2
+#define O -3
+#define A 0
+#define C 1
+#define G 2
+#define T 3
+static const int codes[256] = {
+  O, O, O, O, O, O, O, O, O, O, I, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, R, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
+  O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
+  O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
+  O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O
+};
+#undef R
+#undef I
+#undef O
+#undef A
+#undef C
+#undef G
+#undef T
+static const char rev_codes[4] = { 'A', 'C', 'G', 'T' };
+
+
+extern const char* const error_different_k;
+extern const char* const error_short_string;
+
+
+// Checkered mask. cmask<uint16_t, 1> is every other bit on
+// (0x55). cmask<uint16_t,2> is two bits one, two bits off (0x33). Etc.
+template<typename U, int len, int l = sizeof(U) * 8 / (2 * len)>
+struct cmask {
+  static const U v =
+    (cmask<U, len, l - 1>::v << (2 * len)) | (((U)1 << len) - 1);
+};
+template<typename U, int len>
+struct cmask<U, len, 0> {
+  static const U v = 0;
+};
+
+// Fast reverse complement of one word through bit tweedling.
+inline uint32_t word_reverse_complement(uint32_t w) {
+  typedef uint64_t U;
+  w = ((w >> 2)  & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+  w = ((w >> 4)  & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+  w = ((w >> 8)  & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+  w = ( w >> 16                   ) | ( w                    << 16);
+  return ((U)-1) - w;
+}
+
+inline uint64_t word_reverse_complement(uint64_t w) {
+  typedef uint64_t U;
+  w = ((w >> 2)  & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+  w = ((w >> 4)  & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+  w = ((w >> 8)  & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+  w = ((w >> 16) & cmask<U, 16>::v) | ((w & cmask<U, 16>::v) << 16);
+  w = ( w >> 32                   ) | ( w                    << 32);
+  return ((U)-1) - w;
+}
+
+#ifdef HAVE_INT128
+inline unsigned __int128 word_reverse_complement(unsigned __int128 w) {
+  typedef unsigned __int128 U;
+  w = ((w >> 2)  & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+  w = ((w >> 4)  & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+  w = ((w >> 8)  & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+  w = ((w >> 16) & cmask<U, 16>::v) | ((w & cmask<U, 16>::v) << 16);
+  w = ((w >> 32) & cmask<U, 32>::v) | ((w & cmask<U, 32>::v) << 32);
+  w = ( w >> 64                   ) | ( w                    << 64);
+  return ((U)-1) - w;
+}
+#endif
+
+template<typename T>
+class base_proxy {
+public:
+  typedef T base_type;
+
+  base_proxy(base_type* w, unsigned int i) :
+    word_(w), i_(i) { }
+
+  base_proxy& operator=(char base) { return this->operator=(codes[(int)(unsigned char)base]); }
+  base_proxy& operator=(int code) {
+    base_type mask = (base_type)0x3 << i_;
+    *word_ = (*word_ & ~mask) | ((base_type)code << i_);
+    return *this;
+  }
+  int code() const { return (*word_ >> i_) & (base_type)0x3; }
+  operator char() const { return rev_codes[code()]; }
+
+private:
+  base_type* const word_;
+  unsigned int     i_;
+};
+
+// enum { CODE_A, CODE_C, CODE_G, CODE_T,
+//        CODE_RESET = -1, CODE_IGNORE = -2, CODE_COMMENT = -3 };
+
+template<typename T>
+struct mer_dna_traits { };
+
+template<typename derived>
+class mer_base {
+public:
+  typedef typename mer_dna_traits<derived>::base_type base_type;
+
+  enum { CODE_A, CODE_C, CODE_G, CODE_T,
+         CODE_RESET = -1, CODE_IGNORE = -2, CODE_COMMENT = -3 };
+
+  explicit mer_base(unsigned int k) :
+  _data(new base_type[derived::nb_words(k)])
+  {
+    memset(_data, '\0', nb_words(k) * sizeof(base_type));
+  }
+
+  mer_base(const mer_base &m) :
+  _data(new base_type[nb_words(static_cast<const derived*>(&m)->k())])
+  {
+    memcpy(_data, m._data, nb_words(static_cast<const derived*>(&m)->k()) * sizeof(base_type));
+  }
+
+  template<typename U>
+  mer_base(const unsigned int k, const U& rhs) :
+    _data(new base_type[nb_words(k)])
+  {
+    for(unsigned int i = 0; i < k; ++i)
+      _data[i] = rhs[i];
+    clean_msw();
+  }
+
+  ~mer_base() {
+    delete [] _data;
+  }
+
+  operator derived() { return *static_cast<derived*>(this); }
+  operator const derived() const { return *static_cast<const derived*>(this); }
+  unsigned int k() const { return static_cast<const derived*>(this)->k(); }
+
+  /// Direct access to data. No bound or consistency check. Use with
+  /// caution!
+  //  base_type operator[](unsigned int i) { return _data[i]; }
+  base_type word(unsigned int i) const { return _data[i]; }
+  base_type operator[](unsigned int i) const { return _data[i]; }
+  /// Direct access to the data array.
+  const base_type* data() const { return _data; }
+
+  /// Same as above, but can modify directly content. Use at your own
+  /// risk!
+  base_type& word__(unsigned int i) { return _data[i]; }
+  base_type* data__() { return _data; }
+
+  template<unsigned int alignment>
+  void read(std::istream& is) {
+    const unsigned int k = static_cast<const derived*>(this)->k();
+    const unsigned int l = k / (4 * alignment) + (k % (4 * alignment) != 0);
+    is.read((char*)_data, l);
+  }
+
+  bool operator==(const mer_base& rhs) const {
+    unsigned int i = nb_words() - 1;
+    bool res = (_data[i] & msw()) == (rhs._data[i] & msw());
+    while(res && i > 7) {
+      i -= 8;
+      res = res && (_data[i+7] == rhs._data[i+7]);
+      res = res && (_data[i+6] == rhs._data[i+6]);
+      res = res && (_data[i+5] == rhs._data[i+5]);
+      res = res && (_data[i+4] == rhs._data[i+4]);
+      res = res && (_data[i+3] == rhs._data[i+3]);
+      res = res && (_data[i+2] == rhs._data[i+2]);
+      res = res && (_data[i+1] == rhs._data[i+1]);
+      res = res && (_data[i]   == rhs._data[i]  );
+    }
+    switch(i) {
+    case 7: res = res && (_data[6] == rhs._data[6]);
+    case 6: res = res && (_data[5] == rhs._data[5]);
+    case 5: res = res && (_data[4] == rhs._data[4]);
+    case 4: res = res && (_data[3] == rhs._data[3]);
+    case 3: res = res && (_data[2] == rhs._data[2]);
+    case 2: res = res && (_data[1] == rhs._data[1]);
+    case 1: res = res && (_data[0] == rhs._data[0]);
+    }
+    return res;
+  }
+
+  bool operator!=(const mer_base& rhs) const { return !this->operator==(rhs); }
+  bool operator<(const mer_base& rhs) const {
+    unsigned int i = nb_words();
+    while(i >= 8) {
+      i -= 8;
+      if(_data[i+7] != rhs._data[i+7]) return _data[i+7] < rhs._data[i+7];
+      if(_data[i+6] != rhs._data[i+6]) return _data[i+6] < rhs._data[i+6];
+      if(_data[i+5] != rhs._data[i+5]) return _data[i+5] < rhs._data[i+5];
+      if(_data[i+4] != rhs._data[i+4]) return _data[i+4] < rhs._data[i+4];
+      if(_data[i+3] != rhs._data[i+3]) return _data[i+3] < rhs._data[i+3];
+      if(_data[i+2] != rhs._data[i+2]) return _data[i+2] < rhs._data[i+2];
+      if(_data[i+1] != rhs._data[i+1]) return _data[i+1] < rhs._data[i+1];
+      if(_data[i]   != rhs._data[i])   return _data[i]   < rhs._data[i];
+    }
+    switch(i) {
+    case 7: if(_data[6] != rhs._data[6]) return _data[6] < rhs._data[6];
+    case 6: if(_data[5] != rhs._data[5]) return _data[5] < rhs._data[5];
+    case 5: if(_data[4] != rhs._data[4]) return _data[4] < rhs._data[4];
+    case 4: if(_data[3] != rhs._data[3]) return _data[3] < rhs._data[3];
+    case 3: if(_data[2] != rhs._data[2]) return _data[2] < rhs._data[2];
+    case 2: if(_data[1] != rhs._data[1]) return _data[1] < rhs._data[1];
+    case 1: if(_data[0] != rhs._data[0]) return _data[0] < rhs._data[0];
+    }
+    return false;
+  }
+  bool operator<=(const mer_base& rhs) const {
+    return *this < rhs || *this == rhs;
+  }
+  bool operator>(const mer_base& rhs) const {
+    return !(*this <= rhs);
+  }
+  bool operator>=(const mer_base& rhs) const {
+    return !(*this < rhs);
+  }
+
+  base_proxy<base_type> base(unsigned int i) { return base_proxy<base_type>(_data + i / wbases, 2 * (i % wbases)); }
+  const base_proxy<base_type> base(unsigned int i) const { return base_proxy<base_type>(_data + i / wbases, 2 * (i % wbases)); }
+
+  // Make current k-mer all As.
+  void polyA() { memset(_data, 0x00, sizeof(base_type) * nb_words()); clean_msw(); }
+  void polyC() { memset(_data, 0x55, sizeof(base_type) * nb_words()); clean_msw(); }
+  void polyG() { memset(_data, 0xaa, sizeof(base_type) * nb_words()); clean_msw(); }
+  void polyT() { memset(_data, 0xff, sizeof(base_type) * nb_words()); clean_msw(); }
+  void randomize() {
+    for(unsigned int i = 0; i < nb_words(); ++i)
+      _data[i] = random_bits(wbits);
+    clean_msw();
+  }
+
+  bool is_homopolymer() const {
+    const base_type    base    = _data[0] & c3;
+    const unsigned int barrier = nb_words();
+    unsigned int       i       = 0;
+
+    for( ; i + 5 < barrier; i += 4) {
+      if(_data[i    ] != ((_data[i    ] << 2) | base)) return false;
+      if(_data[i + 1] != ((_data[i + 1] << 2) | base)) return false;
+      if(_data[i + 2] != ((_data[i + 2] << 2) | base)) return false;
+      if(_data[i + 3] != ((_data[i + 3] << 2) | base)) return false;
+    }
+
+    switch(nb_words() - i) {
+    case 5: if(_data[i] !=  ((_data[i] << 2) | base)         ) return false; ++i;
+    case 4: if(_data[i] !=  ((_data[i] << 2) | base)         ) return false; ++i;
+    case 3: if(_data[i] !=  ((_data[i] << 2) | base)         ) return false; ++i;
+    case 2: if(_data[i] !=  ((_data[i] << 2) | base)         ) return false; ++i;
+    case 1: if(_data[i] != (((_data[i] << 2) | base) & msw())) return false;
+    }
+
+    return true;
+  }
+
+  derived& operator=(const mer_base& rhs) {
+    memcpy(_data, rhs._data, nb_words() * sizeof(base_type));
+    return *static_cast<derived*>(this);
+  }
+
+  derived& operator=(const char* s) {
+    if(strlen(s) < static_cast<derived*>(this)->k())
+      throw std::length_error(error_short_string);
+    from_chars(s);
+    return *static_cast<derived*>(this);
+  }
+
+  derived& operator=(const std::string& s) {
+    if(s.size() < static_cast<derived*>(this)->k())
+      throw std::length_error(error_short_string);
+    from_chars(s.c_str());
+    return *static_cast<derived*>(this);
+  }
+
+  // Shift the k-mer by 1 base, left or right. The char version take
+  // a base 'A', 'C', 'G', or 'T'. The base_type version takes a code
+  // in [0, 3] (not check of validity of argument, taken modulo
+  // 4). The return value is the base that was pushed off the side
+  // ('N' if the input character is not a valid base).
+  base_type shift_left(int c) {
+    const base_type    r       = (_data[nb_words()-1] >> lshift()) & c3;
+    const unsigned int barrier = nb_words() & (~c3);
+    base_type          c2;    // c2 and c1: carries
+    base_type          c1      = (base_type)c & c3;
+    unsigned int       i       = 0;
+
+    for( ; i < barrier; i += 4) {
+      c2 = _data[i]   >> wshift;   _data[i]   = (_data[i]   << 2) | c1;
+      c1 = _data[i+1] >> wshift;   _data[i+1] = (_data[i+1] << 2) | c2;
+      c2 = _data[i+2] >> wshift;   _data[i+2] = (_data[i+2] << 2) | c1;
+      c1 = _data[i+3] >> wshift;   _data[i+3] = (_data[i+3] << 2) | c2;
+    }
+    c2 = c1;
+
+    switch(nb_words() - i) {
+    case 3: c2 = _data[i] >> wshift;   _data[i] = (_data[i] << 2) | c1;   ++i;
+    case 2: c1 = _data[i] >> wshift;   _data[i] = (_data[i] << 2) | c2;   ++i;
+    case 1:                            _data[i] = (_data[i] << 2) | c1;
+    }
+    clean_msw();
+
+    return r;
+  }
+
+  base_type shift_right(int c) {
+    const base_type r = _data[0] & c3;
+    if(nb_words() > 1){
+      const unsigned int barrier = (nb_words() - 1) & (~c3);
+      unsigned int i = 0;
+
+      for( ; i < barrier; i += 4) {
+        _data[i]   = (_data[i]   >> 2) | (_data[i+1] << wshift);
+        _data[i+1] = (_data[i+1] >> 2) | (_data[i+2] << wshift);
+        _data[i+2] = (_data[i+2] >> 2) | (_data[i+3] << wshift);
+        _data[i+3] = (_data[i+3] >> 2) | (_data[i+4] << wshift);
+      }
+      switch(nb_words() - 1 - i) {
+      case 3: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift);  ++i;
+      case 2: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift);  ++i;
+      case 1: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift);
+      }
+    }
+
+    _data[nb_words() - 1] =
+      ((_data[nb_words() - 1] & msw()) >> 2) | (((base_type)c & c3) << lshift());
+
+    return r;
+  }
+
+  // Non DNA codes are negative
+  inline static bool not_dna(int c) { return c < 0; }
+  inline static int code(char c) { return codes[(int)(unsigned char)c]; }
+  inline static char rev_code(int x) { return rev_codes[x]; }
+  static int complement(int x) { return (base_type)3 - x; }
+  static char complement(char c) {
+    switch(c) {
+    case 'A': case 'a': return 'T';
+    case 'C': case 'c': return 'G';
+    case 'G': case 'g': return 'C';
+    case 'T': case 't': return 'A';
+    }
+    return 'N';
+  }
+
+  char shift_left(char c) {
+    int x = code(c);
+    if(x == -1)
+      return 'N';
+    return rev_code(shift_left(x));
+  }
+
+  char shift_right(char c) {
+    int x = code(c);
+    if(x == -1)
+      return 'N';
+    return rev_code(shift_right(x));
+  }
+
+  void reverse_complement() {
+    base_type *low  = _data;
+    base_type *high = _data + nb_words() - 1;
+    for( ; low < high; ++low, --high) {
+      base_type tmp = word_reverse_complement(*low);
+      *low          = word_reverse_complement(*high);
+      *high         = tmp;
+    }
+    if(low == high)
+      *low = word_reverse_complement(*low);
+    unsigned int rs = wbits - nb_msb();
+    if(rs > 0)
+      large_shift_right(rs);
+  }
+
+  void canonicalize() {
+    derived rc = this->get_reverse_complement();
+    if(rc < *this)
+      *this = rc;
+  }
+
+  derived get_reverse_complement() const {
+    derived res(*this);
+    res.reverse_complement();
+    return res;
+  }
+
+  derived get_canonical() const {
+    derived rc = this->get_reverse_complement();
+    return rc < *this ? rc : *this;
+  }
+
+  // Transfomr the k-mer into a C++ string.
+  std::string to_str() const {
+    std::string res(static_cast<const derived*>(this)->k(), '\0');
+    to_chars(res.begin());
+    return res;
+  }
+
+  // Transform the k-mer into a string. For the char * version,
+  // assume that the buffer is large enough to receive k+1
+  // characters (space for '\0' at end of string).
+  void to_str(char* s) const {
+    s = to_chars(s);
+    *s = '\0';
+  }
+
+  // Copy bases as char to the output iterator it. No '\0' is added
+  // or check made that there is enough space. The iterator pointed
+  // after the last base is returned.
+  template<typename OutputIterator>
+  OutputIterator to_chars(OutputIterator it) const {
+    int shift  = lshift(); // Number of bits to shift to get base
+
+    for(int j = nb_words() - 1; j >= 0; --j) {
+      base_type w = _data[j];
+      for( ; shift >= 0; shift -= 2, ++it)
+        *it = rev_code((w >> shift) & c3);
+      shift = wshift;
+    }
+    return it;
+  }
+
+  // Get bits [start, start+len). start must be < 2k, len <=
+  // sizeof(base_type) and start+len < 2k. No checks
+  // performed. start and len are in bits, not bases.
+  base_type get_bits(unsigned int start, unsigned int len) const {
+    unsigned int q = start / wbits;
+    unsigned int r = start % wbits;
+
+    base_type res = _data[q] >> r;
+    if(len > wbits - r)
+      res |= _data[q + 1] << (wbits - r);
+    return len < (unsigned int)wbits ? res & (((base_type)1 << len) - 1) : res;
+  }
+
+  // Set bits [start, start+len). Same restriction as get_bits. In
+  // some rare cases, the value written can be larger than the bits
+  // occupied by the mer itself. The mer is then not valid if some MSB
+  // are set to 1.
+  template<bool zero_msw = true>
+  void set_bits(unsigned int start, unsigned int len, base_type v) {
+    unsigned int q    = start / wbits;
+    unsigned int r    = start % wbits;
+    unsigned int left = wbits - r;
+    base_type    mask;
+    if(len > left) {
+      mask       = ((base_type)1 << r) - 1;
+      _data[q]   = (_data[q] & mask) | (v << r);
+      mask = ((base_type)1 << (len - left)) - 1;
+      _data[q + 1] = (_data[q + 1] & ~mask) | (v >> (left));
+    } else {
+      mask = (len < (unsigned int)wbits ? (((base_type)1 << len) - 1) : (base_type)-1) << r;
+      _data[q] = (_data[q] & ~mask) | (v << r);
+    }
+    if(zero_msw)
+      clean_msw();
+  }
+
+
+
+  // Internal stuff
+
+  // Number of words in _data
+  inline static unsigned int nb_words(unsigned int k) { return (k / wbases) + (k % wbases != 0); }
+  inline unsigned int nb_words() const { return nb_words(static_cast<const derived*>(this)->k()); }
+
+  // Mask of highest word
+  inline base_type msw() const {
+    const base_type m = std::numeric_limits<base_type>::max();
+    return m >> (wbits - nb_msb());
+  }
+
+  // Nb of bits used in highest word
+  inline  unsigned int nb_msb() const {
+    base_type nb = (static_cast<const derived*>(this)->k() % wbases) * 2;
+    return nb ? nb : wbits;
+  }
+  // How much to shift last base in last word of _data
+  inline unsigned int lshift() const { return nb_msb() - 2; }
+
+  // Make sure the highest bits are all zero
+  inline void clean_msw() { _data[nb_words() - 1] &= msw(); }
+
+  template<typename InputIterator>
+  bool from_chars(InputIterator it) {
+    int shift = lshift();
+    clean_msw();
+
+    for(int j = nb_words() - 1; j >= 0; --j) {
+      base_type& w = _data[j];
+      w = 0;
+      for( ; shift >= 0; shift -= 2, ++it) {
+        int c = code(*it);
+        if(not_dna(c))
+          return false;
+        w |= (base_type)c << shift;
+      }
+      shift = wshift;
+    }
+    return true;
+  }
+
+protected:
+  static const base_type c3     = (base_type)0x3;
+  static const int       wshift = sizeof(base_type) * 8 - 2; // left shift in 1 word
+  static const int       wbases = 4 * sizeof(base_type); // bases in a word
+  static const int       wbits  = 8 * sizeof(base_type); // bits in a word
+  base_type *            _data;
+
+  // Shift to the right by rs bits (Note bits, not bases)
+  void large_shift_right(unsigned int rs) {
+    if(nb_words() > 1) {
+      const unsigned int barrier = (nb_words() - 1) & (~c3);
+      const unsigned int ls = wbits - rs;
+      unsigned int i = 0;
+
+      for( ; i < barrier; i += 4) {
+        _data[i]   = (_data[i]   >> rs) | (_data[i+1] << ls);
+        _data[i+1] = (_data[i+1] >> rs) | (_data[i+2] << ls);
+        _data[i+2] = (_data[i+2] >> rs) | (_data[i+3] << ls);
+        _data[i+3] = (_data[i+3] >> rs) | (_data[i+4] << ls);
+      }
+      switch(nb_words() - 1 - i) {
+      case 3: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls); ++i;
+      case 2: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls); ++i;
+      case 1: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls);
+      }
+    }
+    _data[nb_words() - 1] >>= rs;
+    clean_msw();
+  }
+};
+
+// Mer type where the length is kept in each mer object: allows to
+// manipulate mers of different size within the same application.
+template<typename T = uint64_t>
+class mer_base_dynamic : public mer_base<mer_base_dynamic<T> > {
+public:
+  typedef T base_type;
+  typedef mer_base<mer_base_dynamic<T> > super;
+
+  explicit mer_base_dynamic(unsigned int k) : super(k), k_(k) { }
+  mer_base_dynamic(const mer_base_dynamic& rhs) : super(rhs), k_(rhs.k()) { }
+  mer_base_dynamic(unsigned int k, const char* s) : super(k), k_(k) {
+    super::from_chars(s);
+  }
+  explicit mer_base_dynamic(const char* s) : super(strlen(s)), k_(strlen(s)) {
+    super::from_chars(s);
+  }
+  explicit mer_base_dynamic(const std::string& s) : super(s.size()), k_(s.size()) {
+    super::from_chars(s.begin());
+  }
+
+  template<typename U>
+  explicit mer_base_dynamic(unsigned int k, const U& rhs) : super(k, rhs), k_(k) { }
+
+  ~mer_base_dynamic() { }
+
+  mer_base_dynamic& operator=(const mer_base_dynamic rhs) {
+    if(k_ != rhs.k_)
+      throw std::length_error(error_different_k);
+    super::operator=(rhs);
+    return *this;
+  }
+
+  unsigned int k() const { return k_; }
+  static unsigned int k(unsigned int k) { return k; }
+
+private:
+  const unsigned int k_;
+};
+
+template<typename T>
+struct mer_dna_traits<mer_base_dynamic<T> > {
+  typedef T base_type;
+};
+
+// Mer type where the length is a static variable: the mer size is
+// fixed for all k-mers in the application.
+//
+// The CI (Class Index) template parameter allows to have more than one such
+// class with different length in the same application. Each class has
+// its own static variable associated with it.
+template<typename T = uint64_t, int CI = 0>
+class mer_base_static : public mer_base<mer_base_static<T, CI> > {
+public:
+  typedef T base_type;
+  typedef mer_base<mer_base_static<T, CI> > super;
+  static const int class_index = CI;
+
+  mer_base_static() : super(k_) { }
+  explicit mer_base_static(unsigned int k) : super(k_) {
+    if(k != k_)
+      throw std::length_error(error_different_k);
+  }
+  mer_base_static(const mer_base_static& rhs) : super(rhs) { }
+
+  mer_base_static(unsigned int k, const char* s) : super(k_) {
+    super::from_chars(s);
+  }
+  explicit mer_base_static(const char* s) : super(k_) {
+    super::from_chars(s);
+  }
+  explicit mer_base_static(const std::string& s) : super(k_) {
+    super::from_chars(s.begin());
+  }
+
+  template<typename U>
+  mer_base_static(unsigned int k, const U& rhs) : super(k_, rhs) {
+    if(k != k_)
+      throw std::length_error(error_different_k);
+  }
+
+  mer_base_static& operator=(const char* s) { return super::operator=(s); }
+  mer_base_static& operator=(const std::string& s) { return super::operator=(s); }
+
+  ~mer_base_static() { }
+
+  static unsigned int k(); // { return k_; }
+  static unsigned int k(unsigned int k) { std::swap(k, k_); return k; }
+
+private:
+  static unsigned int k_;
+};
+template<typename T, int CI>
+unsigned int mer_base_static<T, CI>::k_ = 22;
+template<typename T, int CI>
+unsigned int mer_base_static<T, CI>::k() { return k_; }
+template<typename T, int CI>
+const int mer_base_static<T, CI>::class_index;
+
+template<typename T, int CI>
+struct mer_dna_traits<mer_base_static<T, CI> > {
+  typedef T base_type;
+};
+
+typedef std::ostream_iterator<char> ostream_char_iterator;
+template<typename derived>
+inline std::ostream& operator<<(std::ostream& os, const mer_base<derived>& mer) {
+  //  char s[static_cast<const derived>(mer).k() + 1];
+  char s[mer.k() + 1];
+  mer.to_str(s);
+  return os << s;
+}
+
+typedef std::istream_iterator<char> istream_char_iterator;
+template<typename derived>
+inline std::istream& operator>>(std::istream& is, mer_base<derived>& mer) {
+  if(is.flags() & std::ios::skipws) {
+    while(isspace(is.peek())) { is.ignore(1); }
+  }
+
+  char buffer[mer.k() + 1];
+  is.read(buffer, mer.k());
+  if(is.gcount() != mer.k())
+    goto error;
+  buffer[mer.k()] = '\0';
+  if(!mer.from_chars(buffer))
+    goto error;
+  return is;
+
+ error:
+  is.setstate(std::ios::failbit);
+  return is;
+}
+
+} // namespace mer_dna_ns
+
+
+typedef mer_dna_ns::mer_base_static<uint32_t, 0> mer_dna32;
+typedef mer_dna_ns::mer_base_static<uint64_t, 0> mer_dna64;
+#ifdef HAVE_INT128
+typedef mer_dna_ns::mer_base_static<unsigned __int128, 0> mer_dna128;
+#endif
+
+typedef mer_dna64 mer_dna;
+
+} // namespace jellyfish
+
+#endif
diff --git a/include/jellyfish/mer_dna_bloom_counter.hpp b/include/jellyfish/mer_dna_bloom_counter.hpp
new file mode 100644
index 0000000..f640d1f
--- /dev/null
+++ b/include/jellyfish/mer_dna_bloom_counter.hpp
@@ -0,0 +1,50 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_
+#define __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/bloom_counter2.hpp>
+#include <jellyfish/bloom_filter.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/misc.hpp>
+
+namespace jellyfish {
+template<>
+struct hash_pair<mer_dna> {
+  RectangularBinaryMatrix m1, m2;
+
+  hash_pair() : m1(8 * sizeof(uint64_t), mer_dna::k() * 2), m2(8 * sizeof(uint64_t), mer_dna::k() * 2) {
+    m1.randomize(random_bits);
+    m2.randomize(random_bits);
+  }
+
+  hash_pair(RectangularBinaryMatrix&& m1_, RectangularBinaryMatrix&& m2_) : m1(m1_), m2(m2_) { }
+
+  void operator()(const mer_dna& k, uint64_t* hashes) const {
+    hashes[0] = m1.times(k);
+    hashes[1] = m2.times(k);
+  }
+};
+
+typedef bloom_counter2<mer_dna> mer_dna_bloom_counter;
+typedef bloom_counter2_file<mer_dna> mer_dna_bloom_counter_file;
+typedef bloom_filter<mer_dna> mer_dna_bloom_filter;
+typedef bloom_filter_file<mer_dna> mer_dna_bloom_filter_file;
+}
+
+#endif /* __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_ */
diff --git a/include/jellyfish/mer_heap.hpp b/include/jellyfish/mer_heap.hpp
new file mode 100644
index 0000000..29bd228
--- /dev/null
+++ b/include/jellyfish/mer_heap.hpp
@@ -0,0 +1,115 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_HEAP_HPP__
+#define __JELLYFISH_HEAP_HPP__
+
+#include <stdint.h>
+#include <algorithm>
+
+namespace jellyfish { namespace mer_heap {
+template<typename Key, typename Iterator>
+struct heap_item {
+  Key       key_;
+  uint64_t  val_;
+  uint64_t  pos_;
+  Iterator* it_;
+
+  heap_item() : it_(0) { }
+  heap_item(Iterator& iter) : key_(iter.key()), val_(iter.val()), pos_(iter.pos()), it_(&iter) { }
+
+  bool operator>(const heap_item& other) const {
+    if(pos_ == other.pos_)
+      return key_ > other.key_;
+    return pos_ > other.pos_;
+  }
+};
+
+// STL make_heap creates a max heap. We want a min heap, so
+// we use the > operator
+template<typename Key, typename Iterator>
+struct heap_item_comp {
+  bool operator()(const heap_item<Key, Iterator>* i1, const heap_item<Key, Iterator>* i2) {
+    return *i1 > *i2;
+  }
+};
+
+template<typename Key, typename Iterator>
+class heap {
+  heap_item<Key, Iterator>*     storage_; // Storage of the elements
+  heap_item<Key, Iterator>**    elts_; // Pointers to storage. Create a heap of pointers
+  size_t                        capacity_; // Actual capacity
+  size_t                        h_; // Head pointer
+  heap_item_comp<Key, Iterator> comp_;
+
+public:
+  typedef const heap_item<Key, Iterator> *const_item_t;
+
+  heap() : storage_(0), elts_(0), capacity_(0), h_(0) { }
+  explicit heap(size_t capacity)  { initialize(capacity); }
+  ~heap() {
+    delete[] storage_;
+    delete[] elts_;
+  }
+
+  void initialize(size_t capacity) {
+    capacity_ = capacity;
+    h_        = 0;
+    storage_   = new heap_item<Key, Iterator>[capacity_];
+    elts_      = new heap_item<Key, Iterator>*[capacity_];
+    for(size_t h1 = 0; h1 < capacity_; ++h1)
+      elts_[h1] = &storage_[h1];
+  }
+
+  void fill(Iterator &it) {
+    for(h_ = 0; h_ < capacity_; ++h_) {
+      if(!it.next())
+        break;
+      storage_[h_] = it;
+      elts_[h_]    = &storage_[h_];
+    }
+    std::make_heap(elts_, elts_ + h_, comp_);
+  }
+  // template<typename ForwardIterator>
+  // void fill(ForwardIterator first, ForwardIterator last) {
+  //   h_ = 0;
+  //   while(h_ < capacity_ && first != last) {
+  //     if(!first->next())
+  //       break;
+  //     storage_[h_].initialize(*first++);
+  //     elts_[h_] = &storage_[h_];
+  //     h_++;
+  //   }
+  //   std::make_heap(elts_, elts_ + h_, compare);
+  // }
+
+  bool is_empty() const { return h_ == 0; }
+  bool is_not_empty() const { return h_ > 0; }
+  size_t size() const { return h_; }
+  size_t capacity() const { return capacity_; }
+
+  // The following 3 should only be used after fill has been called
+  const_item_t head() const { return elts_[0]; }
+  void pop() { std::pop_heap(elts_, elts_ + h_--, comp_); }
+  void push(Iterator &item) {
+    *elts_[h_] = item;
+    std::push_heap(elts_, elts_ + ++h_, comp_);
+  }
+};
+
+} } // namespace jellyfish { namespace mer_heap {
+
+#endif // __HEAP_HPP__
diff --git a/include/jellyfish/mer_iterator.hpp b/include/jellyfish/mer_iterator.hpp
new file mode 100644
index 0000000..cb9e6df
--- /dev/null
+++ b/include/jellyfish/mer_iterator.hpp
@@ -0,0 +1,100 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __MER_ITERATOR_HPP__
+#define __MER_ITERATOR_HPP__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+namespace jellyfish {
+template<typename SequencePool, typename MerType>
+class mer_iterator : public std::iterator<std::input_iterator_tag,MerType> {
+  typename SequencePool::job* job_;
+  const char*                 cseq_;
+  MerType                     m_; // mer
+  MerType                     rcm_; // reverse complement mer
+  unsigned int                filled_;
+  const bool                  canonical_;
+
+public:
+  typedef MerType      mer_type;
+  typedef SequencePool sequence_parser_type;
+
+  mer_iterator(SequencePool& seq, bool canonical = false) :
+    job_(new typename SequencePool::job(seq)), cseq_(0), filled_(0), canonical_(canonical)
+  {
+    if(job_->is_empty()) {
+      delete job_;
+      job_ = 0;
+    } else {
+      cseq_ = (*job_)->start;
+      this->operator++();
+    }
+  }
+  mer_iterator() : job_(0), cseq_(0), filled_(0), canonical_(false) { }
+  //  mer_iterator(const mer_iterator& rhs) : job_(rhs.job_), cseq_(rhs.cseq_), m_(rhs.m_), filled_(rhs.filled_) { }
+  ~mer_iterator() {
+    delete job_;
+  }
+
+  bool operator==(const mer_iterator& rhs) const { return job_ == rhs.job_; }
+  bool operator!=(const mer_iterator& rhs) const { return job_ != rhs.job_; }
+
+  operator void*() const { return (void*)job_; }
+  const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+  const mer_type* operator->() const { return &this->operator*(); }
+  mer_iterator& operator++() {
+    while(true) {
+      while(cseq_ == (*job_)->end) {
+        job_->next();
+        if(job_->is_empty()) {
+          delete job_;
+          job_  = 0;
+          cseq_ = 0;
+          return *this;
+        }
+        cseq_   = (*job_)->start;
+        filled_ = 0;
+      }
+
+      do {
+        int code = m_.code(*cseq_++);
+        if(code >= 0) {
+          m_.shift_left(code);
+          if(canonical_)
+            rcm_.shift_right(rcm_.complement(code));
+          filled_ = std::min(filled_ + 1, mer_dna::k());
+        } else
+          filled_ = 0;
+      } while(filled_ < m_.k() && cseq_ < (*job_)->end);
+      if(filled_ >= m_.k())
+        break;
+    }
+    return *this;
+  }
+
+  mer_iterator operator++(int) {
+    mer_iterator res(*this);
+    ++*this;
+    return res;
+  }
+};
+
+} // namespace jellyfish {
+
+#endif /* __MER_ITERATOR_HPP__ */
diff --git a/include/jellyfish/mer_overlap_sequence_parser.hpp b/include/jellyfish/mer_overlap_sequence_parser.hpp
new file mode 100644
index 0000000..7700a60
--- /dev/null
+++ b/include/jellyfish/mer_overlap_sequence_parser.hpp
@@ -0,0 +1,241 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_
+#define __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_
+
+#include <stdint.h>
+
+#include <memory>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace jellyfish {
+
+struct sequence_ptr {
+  char* start;
+  char* end;
+};
+
+template<typename StreamIterator>
+class mer_overlap_sequence_parser : public jellyfish::cooperative_pool2<mer_overlap_sequence_parser<StreamIterator>, sequence_ptr> {
+  typedef jellyfish::cooperative_pool2<mer_overlap_sequence_parser<StreamIterator>, sequence_ptr> super;
+  enum file_type { DONE_TYPE, FASTA_TYPE, FASTQ_TYPE };
+  typedef std::unique_ptr<std::istream> stream_type;
+
+  struct stream_status {
+    char*       seam;
+    size_t      seq_len;
+    bool        have_seam;
+    file_type   type;
+    stream_type stream;
+
+    stream_status() : seam(0), seq_len(0), have_seam(false), type(DONE_TYPE) { }
+  };
+
+  uint16_t                       mer_len_;
+  size_t                         buf_size_;
+  char*                          buffer;
+  char*                          seam_buffer;
+  locks::pthread::mutex          streams_mutex;
+  char*                          data;
+  cpp_array<stream_status>       streams_;
+  StreamIterator&                streams_iterator_;
+
+public:
+  /// Max_producers is the maximum number of concurrent threads than
+  /// can produce data simultaneously. Size is the number of buffer to
+  /// keep around. It should be larger than the number of thread
+  /// expected to read from this class. buf_size is the size of each
+  /// buffer. A StreamIterator is expected to have a next() method,
+  /// which is thread safe, and which returns (move) a
+  /// std::unique<std::istream> object.
+  mer_overlap_sequence_parser(uint16_t mer_len, uint32_t max_producers, uint32_t size, size_t buf_size,
+                              StreamIterator& streams) :
+    super(max_producers, size),
+    mer_len_(mer_len),
+    buf_size_(buf_size),
+    buffer(new char[size * buf_size]),
+    seam_buffer(new char[max_producers * (mer_len - 1)]),
+    streams_(max_producers),
+    streams_iterator_(streams)
+  {
+    for(sequence_ptr* it = super::element_begin(); it != super::element_end(); ++it)
+      it->start = it->end = buffer + (it - super::element_begin()) * buf_size;
+    for(uint32_t i = 0; i < max_producers; ++i) {
+      streams_.init(i);
+      streams_[i].seam = seam_buffer + i * (mer_len - 1);
+      open_next_file(streams_[i]);
+    }
+  }
+
+  ~mer_overlap_sequence_parser() {
+    delete [] buffer;
+    delete [] seam_buffer;
+  }
+
+  //  file_type get_type() const { return type; }
+
+  inline bool produce(uint32_t i, sequence_ptr& buff) {
+    stream_status& st = streams_[i];
+
+    switch(st.type) {
+    case FASTA_TYPE:
+      read_fasta(st, buff);
+      break;
+    case FASTQ_TYPE:
+      read_fastq(st, buff);
+      break;
+    case DONE_TYPE:
+      return true;
+    }
+
+    if(st.stream->good())
+      return false;
+
+    // Reach the end of file, close current and try to open the next one
+    st.have_seam = false;
+    open_next_file(st);
+    return false;
+  }
+
+protected:
+  bool open_next_file(stream_status& st) {
+    // The stream must be released, with .reset(), before calling
+    // .next() on the streams_iterator_, to ensure that the
+    // streams_iterator_ noticed that we closed that stream before
+    // requesting a new one.
+    st.stream.reset();
+    st.stream = streams_iterator_.next();
+    if(!st.stream) {
+      st.type = DONE_TYPE;
+      return false;
+    }
+
+    switch(st.stream->peek()) {
+    case EOF: return open_next_file(st);
+    case '>':
+      st.type = FASTA_TYPE;
+      ignore_line(*st.stream); // Pass header
+      break;
+    case '@':
+      st.type = FASTQ_TYPE;
+      ignore_line(*st.stream); // Pass header
+      break;
+    default:
+      throw std::runtime_error("Unsupported format"); // Better error management
+    }
+    return true;
+  }
+
+  void read_fasta(stream_status& st, sequence_ptr& buff) {
+    size_t read = 0;
+    if(st.have_seam) {
+      memcpy(buff.start, st.seam, mer_len_ - 1);
+      read = mer_len_ - 1;
+    }
+
+    // Here, the current stream is assumed to always point to some
+    // sequence (or EOF). Never at header.
+    while(st.stream->good() && read < buf_size_ - mer_len_ - 1) {
+      read += read_sequence(*st.stream, read, buff.start, '>');
+      if(st.stream->peek() == '>') {
+        *(buff.start + read++) = 'N'; // Add N between reads
+        ignore_line(*st.stream); // Skip to next sequence (skip headers, quals, ...)
+      }
+    }
+    buff.end = buff.start + read;
+
+    st.have_seam = read >= (size_t)(mer_len_ - 1);
+    if(st.have_seam)
+      memcpy(st.seam, buff.end - mer_len_ + 1, mer_len_ - 1);
+  }
+
+  void read_fastq(stream_status& st, sequence_ptr& buff) {
+    size_t read = 0;
+    if(st.have_seam) {
+      memcpy(buff.start, st.seam, mer_len_ - 1);
+      read = mer_len_ - 1;
+    }
+
+    // Here, the st.stream is assumed to always point to some
+    // sequence (or EOF). Never at header.
+    while(st.stream->good() && read < buf_size_ - mer_len_ - 1) {
+      size_t nread  = read_sequence(*st.stream, read, buff.start, '+');
+      read         += nread;
+      st.seq_len   += nread;
+      if(st.stream->peek() == '+') {
+        skip_quals(*st.stream, st.seq_len);
+        if(st.stream->good()) {
+          *(buff.start + read++) = 'N'; // Add N between reads
+          ignore_line(*st.stream); // Skip sequence header
+        }
+        st.seq_len = 0;
+      }
+    }
+    buff.end = buff.start + read;
+
+    st.have_seam = read >= (size_t)(mer_len_ - 1);
+    if(st.have_seam)
+      memcpy(st.seam, buff.end - mer_len_ + 1, mer_len_ - 1);
+  }
+
+  size_t read_sequence(std::istream& is, const size_t read, char* const start, const char stop) {
+    size_t nread = read;
+    while(is && nread < buf_size_ - 1 && is.peek() != stop) {
+      // Skip new lines -> get below does like them
+      skip_newlines(is);
+      is.get(start + nread, buf_size_ - nread);
+      nread += is.gcount();
+      skip_newlines(is);
+    }
+    return nread - read;
+  }
+
+  inline void ignore_line(std::istream& is) {
+    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+  }
+
+  inline void skip_newlines(std::istream& is) {
+    while(is.peek() == '\n')
+      is.get();
+  }
+
+  // Skip quals header and qual values (read_len) of them.
+  void skip_quals(std::istream& is, size_t read_len) {
+    ignore_line(is);
+    size_t quals = 0;
+    while(is.good() && quals < read_len) {
+      skip_newlines(is);
+      is.ignore(read_len - quals + 1, '\n');
+      quals += is.gcount();
+      if(is)
+        ++read_len;
+    }
+    skip_newlines(is);
+    if(quals == read_len && (is.peek() == '@' || is.peek() == EOF))
+      return;
+
+    throw std::runtime_error("Invalid fastq sequence");
+  }
+
+  char peek(std::istream& is) { return is.peek(); }
+};
+}
+
+#endif /* __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_ */
diff --git a/include/jellyfish/mer_qual_iterator.hpp b/include/jellyfish/mer_qual_iterator.hpp
new file mode 100644
index 0000000..3d7dbbc
--- /dev/null
+++ b/include/jellyfish/mer_qual_iterator.hpp
@@ -0,0 +1,118 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __MER_QUAL_ITERATOR_HPP__
+#define __MER_QUAL_ITERATOR_HPP__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+namespace jellyfish {
+template<typename SequencePool, typename MerType>
+class mer_qual_iterator : public std::iterator<std::input_iterator_tag, MerType> {
+  typename SequencePool::job* job_;
+  std::string::const_iterator cseq_, eseq_;
+  std::string::const_iterator cqual_, equal_;
+  MerType                     m_; // mer
+  MerType                     rcm_; // reverse complement mer
+  unsigned int                filled_;
+  const char                  min_qual_;
+  const bool                  canonical_;
+  size_t                      index_;
+
+public:
+  typedef MerType      mer_type;
+  typedef SequencePool sequence_parser_type;
+
+  mer_qual_iterator(SequencePool& seq, char min_qual, bool canonical = false) :
+    job_(new typename SequencePool::job(seq)),
+    filled_(0), min_qual_(min_qual), canonical_(canonical), index_(0)
+  {
+    if(job_->is_empty()) {
+      delete job_;
+      job_ = 0;
+    } else {
+      init_from_job();
+      this->operator++();
+    }
+  }
+  mer_qual_iterator() : job_(0), filled_(0), canonical_(false), index_(0) { }
+  //  mer_iterator(const mer_iterator& rhs) : job_(rhs.job_), cseq_(rhs.cseq_), m_(rhs.m_), filled_(rhs.filled_) { }
+  ~mer_qual_iterator() {
+    delete job_;
+  }
+
+  bool operator==(const mer_qual_iterator& rhs) const { return job_ == rhs.job_; }
+  bool operator!=(const mer_qual_iterator& rhs) const { return job_ != rhs.job_; }
+
+  operator void*() const { return (void*)job_; }
+  const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+  const mer_type* operator->() const { return &this->operator*(); }
+  mer_qual_iterator& operator++() {
+    while(true) {
+      while(cseq_ == eseq_) {
+        ++index_;
+        while(index_ >= (*job_)->nb_filled) {
+          index_ = 0;
+          job_->next();
+          if(job_->is_empty()) {
+            delete job_;
+            job_  = 0;
+            return *this;
+          }
+        }
+        init_from_job();
+        filled_ = 0;
+        }
+
+      do {
+        const int  code = m_.code(*cseq_++);
+        const char qual = cqual_ < equal_ ? *cqual_++ : std::numeric_limits<char>::min();
+        if(code >= 0 && qual >= min_qual_) {
+          m_.shift_left(code);
+          if(canonical_)
+            rcm_.shift_right(rcm_.complement(code));
+          filled_ = std::min(filled_ + 1, mer_dna::k());
+        } else
+          filled_ = 0;
+      } while(filled_ < m_.k() && cseq_ < eseq_);
+      if(filled_ >= m_.k())
+        break;
+    }
+    return *this;
+  }
+
+  mer_qual_iterator operator++(int) {
+    mer_qual_iterator res(*this);
+    ++*this;
+    return res;
+  }
+
+private:
+  void init_from_job() {
+    std::string& seq = (*job_)->data[index_].seq;
+    cseq_  = seq.begin();
+    eseq_  = seq.end();
+    std::string& quals = (*job_)->data[index_].qual;
+    cqual_ = quals.begin();
+    equal_ = quals.end();
+  }
+};
+
+} // namespace jellyfish {
+
+#endif /* __MER_QUAL_ITERATOR_HPP__ */
diff --git a/include/jellyfish/misc.hpp b/include/jellyfish/misc.hpp
new file mode 100644
index 0000000..4aa1a90
--- /dev/null
+++ b/include/jellyfish/misc.hpp
@@ -0,0 +1,247 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MISC_HPP__
+#define __JELLYFISH_MISC_HPP__
+
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <exception>
+#include <stdexcept>
+#include <string>
+#include <new>
+#include <ostream>
+#include <utility>
+#include <iterator>
+#include <algorithm>
+
+namespace jellyfish {
+#define bsizeof(v)      (8 * sizeof(v))
+typedef uint_fast64_t uint_t;
+//#define UINT_C(x)
+#define PRIUINTu PRIuFAST64
+#define PRIUINTx PRIxFAST64
+
+inline int leading_zeroes(int x) { return __builtin_clz(x); } // CLK
+inline int leading_zeroes(unsigned int x) { return __builtin_clz(x); }
+inline int leading_zeroes(unsigned long x) { return __builtin_clzl(x); }
+inline int leading_zeroes(unsigned long long x) { return __builtin_clzll(x); }
+
+/// The floor of the log base two of n. Undefined if n == 0
+template <typename T>
+uint16_t floorLog2(T n) {
+  return sizeof(T) * 8 - 1 - leading_zeroes(n);
+}
+
+/// The ceiling of the log base two of n. Undefined if n == 0
+template<typename T>
+uint16_t ceilLog2(T n) {
+  uint16_t r = floorLog2(n);
+  return n > (((T)1) << r) ? r + 1 : r;
+}
+
+/// The ceiling of the quotient of the division of a by b. I.e. if b
+/// divides a, then div_ceil(a, b) == a / b. Otherwise, div_ceil(a, b)
+/// == a / b + 1
+template<typename T>
+T div_ceil(T a, T b) {
+  T q = a / b;
+  return a % b == 0 ? q : q + 1;
+}
+
+/// Number of bits necessary to encode number n. Undefined if n ==
+/// 0. The following should be true: 2^bitsize(n) - 1 >= n >
+/// 2^(bitsize(n) - 1)
+template<typename T>
+uint16_t bitsize(T n) {
+  return floorLog2(n) + 1;
+}
+
+inline uint32_t reverse_bits(uint32_t v) {
+  // swap odd and even bits
+  v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
+  // swap consecutive pairs
+  v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
+  // swap nibbles ...
+  v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
+  // swap bytes
+  v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
+  // swap 2-byte long pairs
+  v = ( v >> 16             ) | ( v               << 16);
+  return v;
+}
+
+inline uint64_t reverse_bits(uint64_t v) {
+  v = ((v >> 1)  & 0x5555555555555555UL) | ((v & 0x5555555555555555UL) << 1);
+  v = ((v >> 2)  & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
+  v = ((v >> 4)  & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
+  v = ((v >> 8)  & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
+  v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
+  v = ( v >> 32                        ) | ( v                         << 32);
+  return v;
+}
+
+uint64_t bogus_sum(void *data, size_t len);
+
+template <typename T>
+size_t bits_to_bytes(T bits) {
+  return (size_t)((bits / 8) + (bits % 8 != 0));
+}
+
+template <typename T>
+union Tptr {
+  void *v;
+  T    *t;
+};
+template <typename T>
+T *calloc_align(size_t nmemb, size_t alignment) {
+  Tptr<T> ptr;
+  if(posix_memalign(&ptr.v, alignment, sizeof(T) * nmemb) < 0)
+    throw std::bad_alloc();
+  return ptr.t;
+}
+
+/* Be pedantic about memory access. Any misaligned access will
+ * generate a BUS error.
+ */
+void disabled_misaligned_mem_access();
+
+/* Raison d'etre of this version of mem_copy: It seems we have slow
+ * down due to misaligned cache accesses. glibc memcpy does unaligned
+ * memory accesses and crashes when they are disabled. This version
+ * does only aligned memory access (see above).
+ */
+template <typename T>
+void mem_copy(char *dest,  const char *src, const T &len) {
+  // dumb copying char by char
+  for(T i = (T)0; i < len; ++i)
+    *dest++ = *src++;
+}
+
+/* Slice a large number (total) in almost equal parts. return [start,
+   end) corresponding to the ith part (0 <= i < number_of_slices)
+ */
+template<typename T>
+std::pair<T,T> slice(T i, T number_of_slices, T total) {
+  const T slice_size   = total / number_of_slices;
+  const T slice_remain = total % number_of_slices;
+
+  const T start = std::max((T)0,
+                           std::min(total, i * slice_size + (i > 0 ? slice_remain : 0)));
+  const T end   = std::max((T)0,
+                           std::min(total, (i + 1) * slice_size + slice_remain));
+
+  return std::make_pair(start, end);
+}
+
+uint64_t random_bits(int length);
+inline uint64_t random_bits() { return random_bits(64); }
+
+// Quote string that could contain shell special characters
+std::string quote_arg(const std::string& arg);
+
+std::streamoff get_file_size(std::istream& is);
+
+/// Find the first element for which the predicate p is false. The
+/// input range [first, last) is assumed to be sorted according to the
+/// predicate p: p(x) is false and p(y) is true implies x comes after
+/// y in the input range. (I.e., the elements for which p(x) is true
+/// come first followed by the elements for which p(x) is false).
+template <class ForwardIterator, class Predicate>
+ForwardIterator binary_search_first_false(ForwardIterator first, ForwardIterator last, Predicate p)
+{
+  ForwardIterator it;
+  typename std::iterator_traits<ForwardIterator>::difference_type count, step;
+  count = std::distance(first,last);
+  while(count>0) {
+    it = first; step = count / 2; std::advance(it,step);
+    if(p(*it)) {
+      first  = ++it;
+      count -= step + 1;
+    } else
+      count=step;
+  }
+  return first;
+}
+
+/// An integer type which behaves like a random pointer to
+/// itself. Meaning, with `it(5)`, then `*it == 5` and `*++it ==
+/// 6`. In other words, it is a pointer to an array `a` initialized
+/// with `a[i] = i`, except the array is not instantiated and does not
+/// have a fixed size.
+template<typename T>
+class pointer_integer : public std::iterator<std::random_access_iterator_tag, T> {
+    T x_;
+  typedef typename std::iterator<std::random_access_iterator_tag, T> super;
+ public:
+  typedef T                                 value_type;
+  typedef typename super::difference_type   difference_type;
+  typedef typename super::pointer           pointer;
+  typedef typename super::reference         reference;
+  typedef typename super::iterator_category iterator_category;
+
+  pointer_integer() : x_(0) { }
+  explicit pointer_integer(T x) : x_(x) { }
+  pointer_integer(const pointer_integer& rhs) : x_(rhs.x_) { }
+  pointer_integer& operator=(const pointer_integer& rhs) {
+    x_ = rhs.x_;
+    return *this;
+  }
+  pointer_integer& operator++() { ++x_; return *this; }
+  pointer_integer operator++(int) {
+    pointer_integer res(*this);
+    ++x_;
+    return res;
+  }
+  pointer_integer& operator--() { --x_; return *this; }
+  pointer_integer operator--(int) {
+    pointer_integer res(*this);
+    --x_;
+    return res;
+  }
+
+  bool operator==(const pointer_integer& rhs) const { return x_ == rhs.x_; }
+  bool operator!=(const pointer_integer& rhs) const { return x_ != rhs.x_; }
+  bool operator<(const pointer_integer& rhs) const { return x_ < rhs.x_; }
+  bool operator>(const pointer_integer& rhs) const { return x_ > rhs.x_; }
+  bool operator<=(const pointer_integer& rhs) const { return x_ <= rhs.x_; }
+  bool operator>=(const pointer_integer& rhs) const { return x_ >= rhs.x_; }
+
+  reference operator*() { return x_; }
+  pointer operator->() { return &x_; } // Probably useless
+
+  difference_type operator-(pointer_integer& rhs) { return x_ - rhs.x_; }
+
+  pointer_integer operator+(T x) const { return pointer_integer(x_ + x); }
+  pointer_integer operator-(T x) const { return pointer_integer(x_ - x); }
+  pointer_integer& operator+=(T x) { x_ += x; return *this; }
+  pointer_integer& operator-=(T x) { x_ -= x; return *this; }
+
+  value_type operator[](T i) const { return x_ + i; }
+};
+
+template<typename T>
+pointer_integer<T> operator+(T x, pointer_integer<T>& p) { return pointer_integer<T>(x + *p); }
+template<typename T>
+pointer_integer<T> operator-(T x, pointer_integer<T>& p) { return pointer_integer<T>(x - *p); }
+} // namespace jellyfish
+
+#endif // __MISC_HPP__
diff --git a/include/jellyfish/offsets_key_value.hpp b/include/jellyfish/offsets_key_value.hpp
new file mode 100644
index 0000000..4580e76
--- /dev/null
+++ b/include/jellyfish/offsets_key_value.hpp
@@ -0,0 +1,277 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
+#define __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
+
+#include <signal.h>
+#include <iostream>
+#include <sstream>
+
+#include <jellyfish/misc.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jellyfish {
+
+/* A word is whatever aligned type used for atomic operations
+ * (CAS). Typically, a uint64_t. We store pairs of (key, value), in a
+ * bit packed fashion. The key and value can have abritrary size as
+ * long as they each fit in one word. A block is the largest number of
+ * (key, value) pair such that the first key, and only the first,
+ * starts at an aligned word.
+ *
+ * The key 0x0 is not valid. A key which fits completely within one
+ * word is not protected by a "set" bit. A key which straddle the
+ * boundary between two aligned words has a set bit in each parts.
+ *
+ * A value field can have any value and is initialized to 0x0. It has
+ * no "set" bit ever.
+ *
+ * A key is prefixed with a "large" bit. If this bit is 0, the key
+ * field is length key_len (not counting the possible set bits) and
+ * the value field has length val_len. If the large bit has value 1,
+ * the key field is just long enough to encode the number of
+ * reprobing hops to go backward to find the actual key. The
+ * remainder bits is used for the value field. In this scheme, we
+ * assume the length needed to encode the number of reprobes is much
+ * less than the length needed to encode the key.
+ *
+ * The size of the value field, for the normal and large field, is
+ * capped at 64. If there is more bits available, they are wasted.
+ */
+
+/* Offsets holds all the possible offset for a given combination of
+ * key length, value length and reprobe limit.
+ */
+template<typename word>
+class Offsets {
+public:
+  // woff: offset in words from beginning of block
+  // boff: offset in bits within that word. Paste large bit.
+  // shift: number of bits stored in first word, or shift to get to beginning of second word
+  // cshift: number of bits stored in last word
+  // mask1: includes the large bit and the set bit if any.
+  // mask2: mask in last word. Contains large and set bit if any. 0 if last word is full
+  // sb_mask[12]: mask for set bit in words 1 to last-1 and in last word, if any. set bit is the
+  //              last usable bit of the field.
+  // lb_mask: mask for the large bit. It is the first bit of the key field.
+  // full words: need to copy full words
+  typedef struct {
+    struct key {
+      unsigned int woff, boff, shift, cshift;
+      word     mask1, mask2, sb_mask1, sb_mask2, lb_mask;
+      bool     full_words;
+    };
+    struct key key;
+    struct val {
+      unsigned int woff, boff, shift, cshift;
+      word     mask1, mask2;
+    };
+    struct val val;
+  } offset_t;
+  typedef struct {
+    offset_t    normal;
+    offset_t    large;
+  } offset_pair_t;
+  struct block_info {
+    unsigned int len;
+    unsigned int word_len;
+  };
+  //    Offsets() {}
+
+  Offsets(unsigned int _key_len, unsigned int _val_len, unsigned int _reprobe_limit) :
+    key_len_(_key_len),
+    val_len_(_val_len),
+    reprobe_limit_(_reprobe_limit),
+    reprobe_len_(bitsize(reprobe_limit_)),
+    lval_len_(std::min(key_len_ + val_len_ - reprobe_len_, (unsigned int)bsizeof(word))),
+    block(compute_offsets()),
+    bld(block.len)
+  {
+    if(reprobe_len_ > bsizeof(word)) {
+      std::ostringstream err;
+      err << "The reprobe_limit (" << reprobe_limit_ << ", " << reprobe_len_
+          << ") must be encoded in at most one word (" << bsizeof(word) << ")";
+      throw std::length_error(err.str());
+    }
+    if(val_len_ > bsizeof(word))
+      throw std::length_error("Val length must be less than the word size");
+    if(key_len_ < reprobe_len_)
+      throw std::length_error("Key length must be at least as large as to encode the reprobe_limit");
+  }
+
+  ~Offsets() {}
+
+  unsigned int block_len() const { return block.len; }
+  unsigned int block_word_len() const { return block.word_len; }
+  unsigned int reprobe_len() const { return reprobe_len_; }
+  unsigned int reprobe_limit() const { return reprobe_limit_; }
+  word   reprobe_mask() const { return mask(reprobe_len_, 0); }
+  unsigned int key_len() const { return key_len_; }
+  unsigned int val_len() const { return val_len_; }
+  unsigned int lval_len() const { return lval_len_; }
+  word   get_max_val(bool large) const {
+    return (((uint64_t)1) << (large ? lval_len_ : val_len_)) - 1;
+  }
+
+  /// Number of blocks that fit in a given amount of memory. Given an
+  /// amount of memory mem, it returns the number of blocks that fit
+  /// into mem and the actual memory this many block use.
+  std::pair<size_t, size_t> blocks_for_records(size_t nb_records) const {
+    size_t blocks = nb_records / bld;
+    return std::make_pair(blocks, blocks * block.len);
+  }
+
+  word *word_offset(size_t id, const offset_t **o, const offset_t **lo, word * const base) const {
+    uint64_t q, r;
+    bld.division(id, q, r);
+    word *w = base + (block.word_len * q);
+    *o = &offsets[r].normal;
+    *lo = &offsets[r].large;
+    return w;
+  }
+
+private:
+  const unsigned int           key_len_, val_len_;
+  const unsigned int           reprobe_limit_, reprobe_len_, lval_len_;
+  const block_info       block;
+  const jflib::divisor64 bld;   // Fast divisor by block.len
+  offset_pair_t    offsets[bsizeof(word)];
+
+  block_info compute_offsets();
+  bool add_key_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add, bool& full_words);
+  bool add_val_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add);
+  void set_key_offsets(Offsets::offset_t& key, unsigned int& cword, unsigned int& cboff, unsigned int len);
+  void set_val_offsets(Offsets::offset_t& val, unsigned int& cword, unsigned int& cboff, unsigned int len);
+  word mask(unsigned int length, unsigned int shift) const;
+};
+
+template<typename word>
+bool Offsets<word>::add_key_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add, bool& full_words)
+{
+  if(cboff + add <= bsizeof(word)) { // Not spilling over next word
+    cboff  = (cboff + add) % bsizeof(word);
+    cword += (cboff == 0);
+    return false;
+  }
+
+  // Span multiple words. Take into account the extra set bit, one in each word
+  size_t wcap  = bsizeof(word) - 1; // Word capacity withouth set bit
+  add         -= wcap - cboff;  // Substract bits stored in first partial word including set bit
+  full_words   = add >= wcap;
+  cword       += 1 + add / wcap; // Add first word plus any extra complete word
+  cboff        = add % wcap;    // Extra bits in last word
+  cboff       += cboff > 0;     // Add set bit in last word if use partial word
+  return true;
+}
+
+template<typename word>
+bool Offsets<word>::add_val_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add)
+{
+  unsigned int ocword  = cword;
+  cboff         += add;
+  cword         += cboff / bsizeof(word);
+  cboff          = cboff % bsizeof(word);
+  return cword > ocword && cboff > 0;
+}
+
+template<typename word>
+word Offsets<word>::mask(unsigned int length, unsigned int shift) const
+{
+  if(length)
+    return (((word)-1) >> (bsizeof(word) - length)) << shift;
+  return (word)0;
+}
+
+template<typename word>
+void Offsets<word>::set_key_offsets(Offsets::offset_t& offset, unsigned int& cword, unsigned int& cboff, unsigned int len) {
+  unsigned int ocboff;
+  bool   full_words;
+
+  offset.key.woff    = cword;
+  ocboff             = cboff;
+  offset.key.boff    = cboff + 1;
+  offset.key.lb_mask = mask(1, cboff);
+  if(add_key_offsets(cword, cboff, len + 1, full_words)) {
+    // Extra bits in last extra word
+    offset.key.mask1      = mask(bsizeof(word) - ocboff, ocboff);
+    offset.key.mask2      = mask(cboff, 0);
+    offset.key.shift      = bsizeof(word) - 1 - ocboff - 1; // -1 for large bit, -1 for set bit
+    offset.key.cshift     = cboff ? cboff - 1 : 0;
+    offset.key.sb_mask1   = mask(1, bsizeof(word) - 1);
+    offset.key.sb_mask2   = cboff ? mask(1, cboff - 1) : 0;
+    offset.key.full_words = full_words;
+  } else {
+    offset.key.mask1      = mask(len + 1, ocboff);
+    offset.key.mask2      = 0;
+    offset.key.shift      = 0;
+    offset.key.cshift     = 0;
+    offset.key.sb_mask1   = 0;
+    offset.key.sb_mask2   = 0;
+    offset.key.full_words = false;
+  }
+}
+
+template <typename word>
+void Offsets<word>::set_val_offsets(Offsets::offset_t& offset, unsigned int& cword, unsigned int& cboff, unsigned int len) {
+  unsigned int ocboff;
+
+  offset.val.woff  = cword;
+  offset.val.boff  = cboff;
+  ocboff           = cboff;
+  if(add_val_offsets(cword, cboff, len)) {
+    offset.val.mask1  = mask(bsizeof(uint64_t) - ocboff, ocboff);
+    offset.val.mask2  = mask(cboff, 0);
+    offset.val.shift  = len - cboff;
+    offset.val.cshift = cboff;
+  } else {
+    offset.val.mask1  = mask(len, ocboff);
+    offset.val.mask2  = 0;
+    offset.val.shift  = len;
+    offset.val.cshift = 0;
+  }
+}
+
+template<typename word>
+typename Offsets<word>::block_info Offsets<word>::compute_offsets()
+{
+  offset_pair_t *offset = offsets;
+  unsigned int   cword  = 0;    // current word in block
+  unsigned int   cboff  = 0;    // current offset in word
+  unsigned int   lcword;        // idem for large fields
+  unsigned int   lcboff;
+
+  memset(offsets, '\0', sizeof(offsets));
+  do {
+    // Save current offsets as starting point for large key
+    lcword = cword;
+    lcboff = cboff;
+
+    set_key_offsets(offset->normal, cword, cboff, key_len_);
+    set_val_offsets(offset->normal, cword, cboff, val_len_);
+
+    set_key_offsets(offset->large, lcword, lcboff, reprobe_len_);
+    set_val_offsets(offset->large, lcword, lcboff, lval_len_);
+
+    offset++;
+  } while(cboff != 0 && cboff < bsizeof(word) - 2);
+
+  block_info res = { static_cast<unsigned int>(offset - offsets), cword + (cboff == 0 ? 0 : 1) };
+  return res;
+}
+} // namespace jellyfish
+
+#endif // __OFFSETS_KEY_VALUE_HPP__
diff --git a/include/jellyfish/rectangular_binary_matrix.hpp b/include/jellyfish/rectangular_binary_matrix.hpp
new file mode 100644
index 0000000..d545b65
--- /dev/null
+++ b/include/jellyfish/rectangular_binary_matrix.hpp
@@ -0,0 +1,379 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_RECTANGULAR_BINARY_MATRIX_HPP__
+#define __JELLYFISH_RECTANGULAR_BINARY_MATRIX_HPP__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <jellyfish/misc.hpp>
+#include <iostream>
+#include <exception>
+#include <stdexcept>
+#include <vector>
+#include <limits>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Column major representation
+//
+// Rectangular matrices on Z/2Z of size _r x _c where 1<=_r<=64 (_c is
+// not limited) and _r <= _c. I.e., the matrix can be stored as an
+// array of 64 bit word, each representing a column (the highest 64-_r
+// bits of each word are set to 0).
+//
+// Multiplication between a matrix and vector of size _c x 1 gives a
+// vector of size _r x 1 stored as one 64 bit word.
+
+namespace jellyfish {
+  class RectangularBinaryMatrix {
+  public:
+    RectangularBinaryMatrix(unsigned int r, unsigned c)
+      : _columns(alloc(r, c)), _r(r), _c(c) { }
+    RectangularBinaryMatrix(const RectangularBinaryMatrix &rhs)
+    : _columns(alloc(rhs._r, rhs._c)), _r(rhs._r), _c(rhs._c) {
+      memcpy(_columns, rhs._columns, sizeof(uint64_t) * _c);
+    }
+    RectangularBinaryMatrix(RectangularBinaryMatrix&& rhs) :
+    _columns(rhs._columns), _r(rhs._r), _c(rhs._c) {
+      rhs._columns = 0;
+    }
+    // Initialize from raw data. raw must contain at least c words.
+    template<typename T>
+    RectangularBinaryMatrix(const T &raw, unsigned int r, unsigned c)
+      : _columns(alloc(r, c)), _r(r), _c(c) {
+      for(unsigned int i = 0; i < _c; ++i)
+        _columns[i] = raw[i] & cmask();
+    }
+    ~RectangularBinaryMatrix() {
+      free(_columns);
+    }
+
+    RectangularBinaryMatrix &operator=(const RectangularBinaryMatrix &rhs) {
+      if(_r != rhs._r || _c != rhs._c)
+        throw std::invalid_argument("RHS matrix dimensions do not match");
+      memcpy(_columns, rhs._columns, sizeof(uint64_t) * _c);
+      return *this;
+    }
+    RectangularBinaryMatrix& operator=(RectangularBinaryMatrix&& rhs) {
+      if(_r != rhs._r || _c != rhs._c)
+        throw std::invalid_argument("RHS matrix dimensions do not match");
+      std::swap(_columns, rhs._columns);
+      return *this;
+    }
+
+    bool operator==(const RectangularBinaryMatrix &rhs) const {
+      if(_r != rhs._r || _c != rhs._c)
+        return false;
+      return !memcmp(_columns, rhs._columns, sizeof(uint64_t) * _c);
+    }
+    bool operator!=(const RectangularBinaryMatrix &rhs) const {
+      return !(*this == rhs);
+    }
+
+    // Get i-th column. No check on range
+    const uint64_t & operator[](unsigned int i) const { return _columns[i]; }
+
+    unsigned int r() const { return _r; }
+    unsigned int c() const { return _c; }
+
+    // True if every column is zero
+    bool is_zero() const {
+      uint64_t *p = _columns;
+      while(*p == 0 && p < _columns + _c)
+        ++p;
+      return (p - _columns) == _c;
+    }
+
+    // Randomize the content of the matrix
+    void randomize(uint64_t (*rng)()) {
+      for(unsigned int i = 0; i < _c; ++i)
+        _columns[i] = rng() & cmask();
+    }
+    //void randomize() { randomize(rng); }
+
+    // Make and check that the matrix the lower right corner of the
+    // identity.
+    void init_low_identity();
+    bool is_low_identity();
+
+    // Left matrix vector multiplication. Type T supports the operator
+    // v[i] to return the i-th 64 bit word of v.
+    template<typename T>
+    uint64_t times_loop(const T &v) const;
+
+
+#ifdef HAVE_SSE
+    // This SSE implementation only works if the number of columns is
+    // even.
+    template<typename T>
+    uint64_t times_sse(const T &v) const;
+#endif
+
+#ifdef HAVE_INT128
+    // Implementation using __int128
+    template<typename T>
+    uint64_t times_128(const T& v) const;
+#endif
+
+    template<typename T>
+    inline uint64_t times(const T& v) const {
+#ifdef HAVE_SSE
+      return times_sse(v);
+#elif HAVE_INT128
+      return times_128(v);
+#else
+      return times_loop(v);
+#endif
+    }
+
+    // Return a matrix which is the "pseudo inverse" of this matrix. It
+    // is assumed that there is above this square matrix an identity
+    // block and a zero so as to make the matrix squared. Raise an
+    // exception std::domain_error if the matrix is singular.
+    RectangularBinaryMatrix pseudo_inverse() const;
+
+    // Return the multiplication of this and rhs. As in pseudo_inverse,
+    // the two matrices are viewed as being squared, padded above by the
+    // identity.
+    RectangularBinaryMatrix pseudo_multiplication(const RectangularBinaryMatrix &rhs) const;
+
+    // Initialize the object with a pseudo-invertible matrix and return its pseudo-inverse
+    RectangularBinaryMatrix randomize_pseudo_inverse(uint64_t (*rng)());
+    RectangularBinaryMatrix randomize_pseudo_inverse() { return randomize_pseudo_inverse(random_bits); }
+
+    // Return the rank of the matrix. The matrix is assumed to be
+    // squared, padded above by the identity.
+    unsigned int pseudo_rank() const;
+
+    // Display matrix
+    void print(std::ostream &os) const;
+    template<typename T>
+    void print_vector(std::ostream &os, const T &v) const;
+
+    // Nb words in vector for multiplication
+    uint64_t nb_words() const { return (_c >> 6) + ((_c & 0x3f) != 0); }
+    // Mask of most significant bit in most significant word of a vector
+    // with _c rows.
+    uint64_t msb() const {
+      int shift = _c & 0x3f;
+      if(shift == 0)
+        shift = sizeof(uint64_t) * 8;
+      return (uint64_t)1 << (shift - 1);
+    }
+
+  private:
+    // Store column by column. A column may use one word.  By
+    // convention, the "unused" bits (most significant bits) of each
+    // column are set to 0.
+    uint64_t *         _columns;
+    const unsigned int _r, _c;
+
+    static uint64_t *alloc(unsigned int r, unsigned int c) __attribute__((malloc));
+    // Mask for column word (zero msb)
+    uint64_t cmask() const { return std::numeric_limits<uint64_t>::max() >> (std::numeric_limits<uint64_t>::digits - _r); }
+    // Mask of highest word of a vector with _c rows (Most Significant
+    // Word)
+    uint64_t msw() const { return (msb() << 1) - 1; }
+    // Nb of bits used in highest word of vector with _c rows.
+    uint64_t nb_msb() const {
+      uint64_t nb = _c & 0x3f;
+      return nb ? nb : sizeof(uint64_t) * 8;
+    }
+    // Allow to change the matrix vectors. No check on i.
+    uint64_t & get(unsigned int i) { return _columns[i]; }
+  };
+
+  template<typename T>
+  uint64_t RectangularBinaryMatrix::times_loop(const T &v) const {
+    uint64_t       *p   = _columns + _c - 1;
+    uint64_t        res = 0, x = 0, j = 0;
+    const uint64_t  one = (uint64_t)1;
+
+    for(unsigned int i = 0; i < nb_words(); ++i) {
+      j = sizeof(uint64_t) * 8;
+      x = v[i];
+      if(i == nb_words() - 1) {
+        x &= msw();
+        j  = nb_msb();
+      }
+      for( ; j > 7; j -= 8, p -= 8) {
+        res ^= (-(x & one)) & p[0];  x >>= 1;
+        res ^= (-(x & one)) & p[-1]; x >>= 1;
+        res ^= (-(x & one)) & p[-2]; x >>= 1;
+        res ^= (-(x & one)) & p[-3]; x >>= 1;
+        res ^= (-(x & one)) & p[-4]; x >>= 1;
+        res ^= (-(x & one)) & p[-5]; x >>= 1;
+        res ^= (-(x & one)) & p[-6]; x >>= 1;
+        res ^= (-(x & one)) & p[-7]; x >>= 1;
+      }
+    }
+
+    // Finish the loop
+    switch(j) {
+    case 7: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 6: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 5: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 4: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 3: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 2: res ^= (-(x & one)) & *p--; x >>= 1;
+    case 1: res ^= (-(x & one)) & *p;
+    }
+
+    return res;
+  }
+
+#ifdef HAVE_SSE
+  template<typename T>
+  uint64_t RectangularBinaryMatrix::times_sse(const T &v) const {
+#define FFs ((uint64_t)-1)
+    static const uint64_t smear[8] asm("smear") __attribute__ ((aligned(16),used)) =
+      {0, 0, 0, FFs, FFs, 0, FFs, FFs};
+    typedef uint64_t xmm_t __attribute__((vector_size(16)));
+
+    uint64_t *p = _columns + _c - 8;
+
+    // //#ifdef __ICC
+    // register xmm_t acc;
+    // register xmm_t load;
+    // memset(&acc, '\0', 16);
+    // memset(&load, '\0', 16);
+    // #else
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wuninitialized"
+#endif
+    register xmm_t acc  = acc ^ acc; // Set acc to 0
+    register xmm_t load = load ^ load;
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+    // #endif
+
+//     // Zero out acc
+// #pragma GCC diagnostic push
+// #pragma GCC diagnostic ignored "-Wuninitialized"
+//     asm("pxor %0,%0\n\t" : "=x"(acc) : "0"(acc));
+//     asm("pxor %0,%0\n\t" : "=x"(load) : "0"(load));
+// #pragma GCC diagnostic pop
+
+    // i is the lower 2 bits of x, and an index into the smear array. Compute res ^= smear[i] & p[j].
+#define AND_XOR(off)                                                    \
+    asm("movdqa (%[s],%[i]), %[load]\n\t"                               \
+        "pand " off "(%[p]),%[load]\n\t"                                \
+        "pxor %[load],%[acc]\n\t"                                       \
+        : [acc]"=&x"(acc)                                               \
+        : "[acc]"(acc),  [i]"r"(i), [p]"r"(p), [s]"r"(smear), [load]"x"(load))
+
+
+    uint64_t i, j = 0, x = 0;
+    for(unsigned int w = 0; w < nb_words(); ++w) {
+      x = v[w];
+      j = sizeof(uint64_t) * 8;
+      if(w == nb_words() - 1) {
+        x &= msw();
+        j  = nb_msb();
+      }
+      for( ; j > 7; j -= 8, p -= 8) {
+        i = (x & (uint64_t)0x3) << 4;
+        AND_XOR("0x30");
+        x >>= 2;
+        i = (x & (uint64_t)0x3) << 4;
+        AND_XOR("0x20");
+        x >>= 2;
+        i = (x & (uint64_t)0x3) << 4;
+        AND_XOR("0x10");
+        x >>= 2;
+        i = (x & (uint64_t)0x3) << 4;
+        AND_XOR("");
+        x >>= 2;
+      }
+    }
+
+    // Finish loop
+    p = _columns;
+    switch(j) {
+    case 6:
+      i = (x & (uint64_t)0x3) << 4;
+      AND_XOR("0x20");
+      x >>= 2;
+    case 4:
+      i = (x & (uint64_t)0x3) << 4;
+      AND_XOR("0x10");
+      x >>= 2;
+    case 2:
+      i = (x & (uint64_t)0x3) << 4;
+      AND_XOR("");
+    }
+
+    // Get result out
+    uint64_t res1, res2;
+    asm("movd %[acc], %[res1]\n\t"
+        "psrldq $8, %[acc]\n\t"
+        "movd %[acc], %[res2]\n\t"
+        : [res1]"=r"(res1), [res2]"=r"(res2)
+        : [acc]"x"(acc));
+    return res1 ^ res2;
+  }
+#endif // HAVE_SSE
+
+#ifdef HAVE_INT128
+  template<typename T>
+  uint64_t RectangularBinaryMatrix::times_128(const T &v) const {
+    typedef unsigned __int128 u128;
+    static const u128 smear[4] =
+      { (u128)0,
+        (((u128)1 << 64) - 1) << 64,
+        ((u128)1 << 64) - 1,
+        (u128)-1
+      };\
+    u128  res = res ^ res;
+    u128* p   = (u128*)(_columns + _c - 2);
+
+    uint64_t j = 0, x = 0;
+    for(unsigned int w = 0; w < nb_words(); ++w) {
+      x = v[w];
+      j = sizeof(uint64_t) * 8;
+      if(w == nb_words() - 1) {
+        x &= msw();
+        j  = nb_msb();
+      }
+      for( ; j > 7; j -= 8, p -= 4) {
+        res ^= smear[x & (uint64_t)0x3] & p[ 0]; x >>= 2;
+        res ^= smear[x & (uint64_t)0x3] & p[-1]; x >>= 2;
+        res ^= smear[x & (uint64_t)0x3] & p[-2]; x >>= 2;
+        res ^= smear[x & (uint64_t)0x3] & p[-3]; x >>= 2;
+      }
+    }
+
+    switch(j) {
+    case 6: res ^= smear[x & (uint64_t)0x3] & *p--; x >>=2;
+    case 4: res ^= smear[x & (uint64_t)0x3] & *p--; x >>=2;
+    case 2: res ^= smear[x & (uint64_t)0x3] & *p;
+    }
+
+    return (res ^ (res >> 64)) & smear[2];
+  }
+#endif // HAVE_INT128
+
+}
+
+#endif
diff --git a/jellyfish/simple_circular_buffer.hpp b/include/jellyfish/simple_circular_buffer.hpp
similarity index 98%
rename from jellyfish/simple_circular_buffer.hpp
rename to include/jellyfish/simple_circular_buffer.hpp
index cf1f7d3..08afcc3 100644
--- a/jellyfish/simple_circular_buffer.hpp
+++ b/include/jellyfish/simple_circular_buffer.hpp
@@ -1,6 +1,6 @@
 /* Jellyfish
  * Copyright (C) 2012  Genome group at University of Maryland.
- * 
+ *
  * This program is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation, either version 3 of the
@@ -22,7 +22,7 @@
 
 namespace jellyfish {
   namespace simple_circular_buffer {
-    
+
     // T: type of element in container. D: type of derived class for
     // CRTP. A: allocator type.
     template<typename T, typename D>
@@ -44,7 +44,7 @@ namespace jellyfish {
         front_ = back_;
         full_  = false;
       }
-      
+
       // Valid only if empty() is false
       T& front() {
         return data_[front_];
@@ -87,16 +87,16 @@ namespace jellyfish {
         int s = back_ - front_;
         return s < 0 ? s + static_cast<const D*>(this)->capacity() : s;
       }
-    
+
     protected:
-      int next_index(int i) const { 
+      int next_index(int i) const {
         return (i + 1) % static_cast<const D*>(this)->capacity();
       }
       int prev_index(int i) const {
         return i ? i - 1 : static_cast<const D*>(this)->capacity() - 1;
       }
       T* data() const { return data_; }
-    
+
       T*   data_;
       int  front_, back_;
       bool full_;
@@ -125,7 +125,7 @@ namespace jellyfish {
     //   typedef base<T, dyn<T, A>, A> super;
     // public:
     //   explicit dyn(int size, const T v = T()) : super(size, v), capa_(size) { }
-    
+
     //   int capacity() const { return capa_; }
     //   int capa_;
     // };
diff --git a/include/jellyfish/sorted_dumper.hpp b/include/jellyfish/sorted_dumper.hpp
new file mode 100644
index 0000000..c18fb32
--- /dev/null
+++ b/include/jellyfish/sorted_dumper.hpp
@@ -0,0 +1,115 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_SORTED_DUMPER_HPP__
+#define __JELLYFISH_SORTED_DUMPER_HPP__
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+#include <jellyfish/dumper.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/token_ring.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/file_header.hpp>
+
+namespace jellyfish {
+/// Sorted dumper. Write mers according to the hash order. It
+/// implements the CRTP to effectively write the k-mer/value pair.
+template<typename D, typename storage_t>
+class sorted_dumper : public dumper_t<storage_t>, public thread_exec {
+protected:
+  typedef typename storage_t::key_type key_type;
+  typedef typename storage_t::region_iterator iterator;
+  typedef typename mer_heap::heap<typename    storage_t::key_type, iterator> heap_type;
+  typedef typename heap_type::const_item_t    heap_item;
+  typedef jellyfish::token_ring<locks::pthread::cond> token_ring;
+  typedef typename token_ring::token token_type;
+
+  int                       nb_threads_;
+  token_ring                ring_;
+  const char*               file_prefix_;
+  storage_t*                ary_;
+  file_header*              header_;
+  bool                      zero_array_;
+  std::ofstream             out_;
+  std::pair<size_t, size_t> block_info; // { nb blocks, nb records }
+
+public:
+  sorted_dumper(int nb_threads, const char* file_prefix, file_header* header = 0) :
+    nb_threads_(nb_threads),
+    ring_(nb_threads),
+    file_prefix_(file_prefix),
+    header_(header),
+    zero_array_(true)
+  { }
+
+  bool zero_array() const { return zero_array_; }
+  void zero_array(bool v) { zero_array_ = v; }
+
+  virtual void _dump(storage_t* ary) {
+    ary_ = ary;
+    block_info = ary_->blocks_for_records(5 * ary_->max_reprobe_offset());
+
+    this->open_next_file(file_prefix_, out_);
+    if(header_)
+      header_->write(out_);
+
+    ring_.reset();
+    exec_join(nb_threads_);
+    out_.close();
+    if(zero_array_)
+      ary_->zero_blocks(0, block_info.first); // zero out last group of blocks
+  }
+
+  virtual void start(const int i) {
+    std::ostringstream           buffer;
+    heap_type                    heap(ary_->max_reprobe_offset());
+    token_type&                  token = ring_[i];
+    size_t                       count = 0;
+    typename storage_t::key_type key;
+
+    for(size_t id = i; id * block_info.second < ary_->size(); id += nb_threads_) {
+      // Fill buffer
+      iterator it(ary_, id * block_info.second, (id + 1) * block_info.second, key);
+      heap.fill(it);
+
+      while(heap.is_not_empty()) {
+        heap_item item = heap.head();
+        if(item->val_ >= this->min() && item->val_ <= this->max())
+          static_cast<D*>(this)->write_key_value_pair(buffer, item);
+        ++count;
+        heap.pop();
+        if(it.next())
+          heap.push(it);
+      }
+
+      // Write buffer
+      token.wait();
+      out_.write(buffer.str().data(), buffer.tellp());
+      token.pass();
+
+      buffer.seekp(0);
+      if(id > 0 && zero_array_)
+        ary_->zero_blocks(id * block_info.first, block_info.first);
+    }
+  }
+};
+} // namespace jellyfish {
+
+#endif /* __JELLYFISH_SORTED_DUMPER_HPP__ */
diff --git a/include/jellyfish/stdio_filebuf.hpp b/include/jellyfish/stdio_filebuf.hpp
new file mode 100644
index 0000000..7aa3a9e
--- /dev/null
+++ b/include/jellyfish/stdio_filebuf.hpp
@@ -0,0 +1,170 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_STDIO_FILEBUF_HPP__
+#define __JELLYFISH_STDIO_FILEBUF_HPP__
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <unistd.h>
+
+#include <streambuf>
+#include <vector>
+
+// Attempt to be (mostly) compatible with GCC ext/stdio_filebuf.h
+// class. Contains code from stdio_filbuf.hpp and
+// http://www.mr-edd.co.uk/blog/beginners_guide_streambuf. It is only
+// meant as a quick replacement when stdio_filebuf is not available.
+
+namespace jellyfish {
+template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
+class stdio_filebuf : public std::basic_streambuf<_CharT, _Traits>
+{
+  const int                     fd_;
+  FILE* const                   file_;
+  const std::ios_base::openmode mode_;
+  const size_t                  put_back_;
+  std::vector<_CharT>           buffer_;
+
+public:
+  // Types:
+  typedef _CharT			 char_type;
+  typedef _Traits			 traits_type;
+  typedef typename traits_type::int_type int_type;
+  typedef typename traits_type::pos_type pos_type;
+  typedef typename traits_type::off_type off_type;
+  //  typedef std::size_t                    size_t;
+
+  /**
+   *  @param  __fd  An open file descriptor.
+   *  @param  __mode  Same meaning as in a standard filebuf.
+   *  @param  __size Optimal or preferred size of internal buffer,
+   *                 in chars.
+   *
+   *  This constructor associates a file stream buffer with an open
+   *  POSIX file descriptor. The file descriptor will be automatically
+   *  closed when the stdio_filebuf is closed/destroyed.
+   */
+  stdio_filebuf(int __fd, std::ios_base::openmode __mode,
+                size_t __size = static_cast<size_t>(BUFSIZ),
+                size_t put_back = 1) :
+    fd_(__fd),
+    file_(0),
+    mode_(__mode),
+    put_back_(std::max(put_back, (size_t)1)),
+    buffer_(std::max(__size, put_back_) + put_back_)
+  {
+    _CharT* end = buffer_.data() + buffer_.size();
+    this->setg(end, end, end);
+  }
+
+  /**
+   *  @param  __f  An open @c FILE*.
+   *  @param  __mode  Same meaning as in a standard filebuf.
+   *  @param  __size Optimal or preferred size of internal buffer,
+   *                 in chars.  Defaults to system's @c BUFSIZ.
+   *
+   *  This constructor associates a file stream buffer with an open
+   *  C @c FILE*.  The @c FILE* will not be automatically closed when the
+   *  stdio_filebuf is closed/destroyed.
+   */
+  stdio_filebuf(FILE* __f, std::ios_base::openmode __mode,
+                size_t __size = static_cast<size_t>(BUFSIZ),
+                size_t put_back = 1) :
+    fd_(-1),
+    file_(__f),
+    mode_(__mode),
+    put_back_(std::max(put_back, (size_t)1)),
+    buffer_(std::max(__size, put_back_) + put_back_)
+  {
+    _CharT* end = buffer_.data() + buffer_.size();
+    this->setg(end, end, end);
+  }
+
+  /**
+   *  Closes the external data stream if the file descriptor constructor
+   *  was used.
+   */
+  virtual ~stdio_filebuf() {
+    if(fd_ != -1)
+      close(fd_);
+  }
+
+  /**
+   *  @return  The underlying file descriptor.
+   *
+   *  Once associated with an external data stream, this function can be
+   *  used to access the underlying POSIX file descriptor.  Note that
+   *  there is no way for the library to track what you do with the
+   *  descriptor, so be careful.
+   */
+  int
+  fd() { return fd_ != -1 ? fd_ : fileno(file_); }
+
+  /**
+   *  @return  The underlying FILE*.
+   *
+   *  This function can be used to access the underlying "C" file pointer.
+   *  Note that there is no way for the library to track what you do
+   *  with the file, so be careful.
+   */
+  FILE*
+  file() {
+    if(file_) return file_;
+    const char* str_mode;
+    if(mode_ & std::ios_base::app) {
+      str_mode = "a+";
+    } else if(mode_ & std::ios_base::ate) {
+      str_mode = "a";
+    } else if(mode_ & std::ios_base::in) {
+      str_mode = (mode_ & std::ios_base::out) ? "r+" : "r";
+    } else if(mode_ & std::ios_base::out) {
+      str_mode = "w";
+    }
+    return fdopen(fd_, str_mode);
+  }
+
+private:
+  int_type underflow() {
+    if(this->gptr() >= this->egptr()) {
+      _CharT *base = buffer_.data();
+      _CharT *start = base;
+
+      if (this->eback() == base) {
+        // Make arrangements for putback characters
+        std::memcpy(base, this->egptr() - put_back_, put_back_ * sizeof(_CharT));
+        start += put_back_;
+      }
+
+      // start is now the start of the buffer, proper.
+      // Read from fptr_ in to the provided buffer
+      const ssize_t n =
+        (fd_ != -1) ?
+        read(fd_, start, (buffer_.size() - (start - base)) * sizeof(_CharT)) :
+        std::fread(start, sizeof(_CharT), buffer_.size() - (start - base), file_);
+      if (n <= 0)
+        return _Traits::eof();
+
+      // Set buffer pointers
+      this->setg(base, start, start + n);
+    }
+    return _Traits::to_int_type(*this->gptr());
+  }
+
+};
+} // namespace jellyfish {
+#endif // __JELLYFISH_STDIO_FILEBUF_HPP__
diff --git a/jellyfish/storage.hpp b/include/jellyfish/storage.hpp
similarity index 95%
rename from jellyfish/storage.hpp
rename to include/jellyfish/storage.hpp
index 692df2d..3df85cf 100644
--- a/jellyfish/storage.hpp
+++ b/include/jellyfish/storage.hpp
@@ -30,8 +30,8 @@ namespace jellyfish {
   };
 
   // Entry 0 is used only when switching to a large field
-  extern size_t *quadratic_reprobes;
-  
+  extern const size_t *quadratic_reprobes;
+
 }
 
 #endif // __STORAGE_HPP__
diff --git a/include/jellyfish/stream_iterator.hpp b/include/jellyfish/stream_iterator.hpp
new file mode 100644
index 0000000..6f877c8
--- /dev/null
+++ b/include/jellyfish/stream_iterator.hpp
@@ -0,0 +1,90 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __STREAM_ITERATOR_HPP__
+#define __STREAM_ITERATOR_HPP__
+
+#include <assert.h>
+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <stdexcept>
+#include <memory>
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+/// Transform an iterator of paths (c string: const char*) into an
+/// iterator of std::ifstream. Every file is opened and closed in
+/// turn. The object instantiated with no argument is the end marker.
+template<typename PathIterator>
+class stream_iterator : public std::iterator<std::forward_iterator_tag, std::ifstream> {
+  PathIterator                 begin_, end_;
+  std::ifstream*               stream_;
+public:
+  stream_iterator(PathIterator begin, PathIterator end) :
+    begin_(begin), end_(end), stream_(0)
+  {
+    if(begin_ != end_) {
+      stream_ = new std::ifstream;
+      open_file();
+    }
+  }
+  stream_iterator(const stream_iterator& rhs) :
+  begin_(rhs.begin_), end_(rhs.end_), stream_(rhs.stream_)
+  { }
+  stream_iterator() : begin_(), end_(), stream_() { }
+
+  bool operator==(const stream_iterator& rhs) const {
+    return stream_ == rhs.stream_;
+  }
+  bool operator!=(const stream_iterator& rhs) const {
+    return stream_ != rhs.stream_;
+  }
+
+  std::ifstream& operator*() { return *stream_; }
+  std::ifstream* operator->() { return stream_; }
+
+  stream_iterator& operator++() {
+    stream_->close();
+    if(++begin_ != end_) {
+      open_file();
+    } else {
+      delete stream_;
+      stream_ = 0;
+    }
+
+    return *this;
+  }
+  stream_iterator operator++(int) {
+    stream_iterator res(*this);
+    ++*this;
+    return res;
+  }
+
+protected:
+  void open_file() {
+    stream_->open(*begin_);
+    if(stream_->fail())
+      throw std::runtime_error(err::msg() << "Failed to open file '" << *begin_ << "'");
+  }
+};
+
+}
+
+#endif /* __STREAM_ITERATOR_HPP__ */
diff --git a/include/jellyfish/stream_manager.hpp b/include/jellyfish/stream_manager.hpp
new file mode 100644
index 0000000..5b31708
--- /dev/null
+++ b/include/jellyfish/stream_manager.hpp
@@ -0,0 +1,157 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+#include <memory>
+#include <vector>
+#include <list>
+#include <set>
+
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+template<typename PathIterator>
+class stream_manager {
+  /// A wrapper around an ifstream for a standard file. Standard in
+  /// opposition to a pipe_stream below, but the file may be a regular
+  /// file or a pipe. The file is opened once and notifies the manager
+  /// that it is closed upon destruction.
+  class file_stream : public std::ifstream {
+    stream_manager& manager_;
+  public:
+    file_stream(const char* path, stream_manager& manager) :
+      std::ifstream(path),
+      manager_(manager)
+    {
+      manager_.take_file();
+    }
+    virtual ~file_stream() { manager_.release_file(); }
+  };
+  friend class file_stream;
+
+  /// A wrapper around an ifstream for a "multi pipe". The multi pipe
+  /// are connected to generators (external commands generating
+  /// sequence). They are opened repeatedly, until they are unlinked
+  /// from the file system.
+  class pipe_stream : public std::ifstream {
+    const char*     path_;
+    stream_manager& manager_;
+  public:
+    pipe_stream(const char* path, stream_manager& manager) :
+      std::ifstream(path),
+      path_(path),
+      manager_(manager)
+    { }
+    virtual ~pipe_stream() { manager_.release_pipe(path_); }
+  };
+  friend class pipe_stream;
+
+  typedef std::unique_ptr<std::istream> stream_type;
+
+  PathIterator           paths_cur_, paths_end_;
+  int                    files_open_;
+  const int              concurrent_files_;
+  std::list<const char*> free_pipes_;
+  std::set<const char*>  busy_pipes_;
+  locks::pthread::mutex_recursive  mutex_;
+
+public:
+  define_error_class(Error);
+
+  stream_manager(PathIterator paths_begin, PathIterator paths_end, int concurrent_files = 1) :
+    paths_cur_(paths_begin), paths_end_(paths_end),
+    files_open_(0),
+    concurrent_files_(concurrent_files)
+  { }
+
+  stream_manager(PathIterator paths_begin, PathIterator paths_end,
+                 PathIterator pipe_begin, PathIterator pipe_end,
+                 int concurrent_files = 1) :
+    paths_cur_(paths_begin), paths_end_(paths_end),
+    files_open_(0),
+    concurrent_files_(concurrent_files),
+    free_pipes_(pipe_begin, pipe_end)
+  { }
+
+  stream_type next() {
+    locks::pthread::mutex_lock lock(mutex_);
+    stream_type res;
+    open_next_file(res);
+    if(!res)
+      open_next_pipe(res);
+    return res;
+  }
+
+  int concurrent_files() const { return concurrent_files_; }
+  // Number of pipes available. Not thread safe
+  int concurrent_pipes() const { return free_pipes_.size() + busy_pipes_.size(); }
+  // Number of streams available. Not thread safe
+  int nb_streams() const { return concurrent_files() + concurrent_pipes(); }
+
+protected:
+  void open_next_file(stream_type& res) {
+    if(files_open_ >= concurrent_files_)
+      return;
+    while(paths_cur_ != paths_end_) {
+      std::string path = *paths_cur_;
+      ++paths_cur_;
+      res.reset(new file_stream(path.c_str(), *this));
+      if(res->good())
+        return;
+      res.reset();
+      throw std::runtime_error(err::msg() << "Can't open file '" << path << "'");
+    }
+  }
+
+  void open_next_pipe(stream_type& res) {
+    while(!free_pipes_.empty()) {
+      const char* path = free_pipes_.front();
+      free_pipes_.pop_front();
+      res.reset(new pipe_stream(path, *this));
+      if(res->good()) {
+        busy_pipes_.insert(path);
+        return;
+      }
+      // The pipe failed to open, so it is not marked as busy. This
+      // reset will make us forget about this path.
+      res.reset();
+    }
+  }
+
+  void take_file() {
+    locks::pthread::mutex_lock lock(mutex_);
+    ++files_open_;
+  }
+
+  void release_file() {
+    locks::pthread::mutex_lock lock(mutex_);
+    --files_open_;
+  }
+
+  // void take_pipe(const char* path) {
+  //   locks::pthread::mutex_lock lock(mutex_);
+  // }
+  void release_pipe(const char* path) {
+    locks::pthread::mutex_lock lock(mutex_);
+    if(busy_pipes_.erase(path) == 0)
+      return; // Nothing erased. We forget about that path
+    free_pipes_.push_back(path);
+  }
+};
+} // namespace jellyfish
diff --git a/include/jellyfish/text_dumper.hpp b/include/jellyfish/text_dumper.hpp
new file mode 100644
index 0000000..334a491
--- /dev/null
+++ b/include/jellyfish/text_dumper.hpp
@@ -0,0 +1,88 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_TEXT_DUMPER_HPP__
+#define __JELLYFISH_TEXT_DUMPER_HPP__
+
+#include <jellyfish/sorted_dumper.hpp>
+
+namespace jellyfish {
+template<typename Key, typename Val>
+class text_writer {
+public:
+  void write(std::ostream& out, const Key& key, const Val val) {
+   out << key << " " << val << "\n";
+  }
+};
+
+template<typename storage_t>
+class text_dumper : public sorted_dumper<text_dumper<storage_t>, storage_t> {
+  typedef sorted_dumper<text_dumper<storage_t>, storage_t> super;
+  text_writer<typename super::key_type, uint64_t> writer;
+
+public:
+  static const char* format;
+
+  text_dumper(int nb_threads, const char* file_prefix, file_header* header = 0) :
+    super(nb_threads, file_prefix, header)
+  { }
+
+  virtual void _dump(storage_t* ary) {
+    if(super::header_) {
+      super::header_->update_from_ary(*ary);
+      super::header_->format(format);
+    }
+    super::_dump(ary);
+  }
+
+  void write_key_value_pair(std::ostream& out, typename super::heap_item item) {
+    writer.write(out, item->key_, item->val_);
+  }
+};
+template<typename storage_t>
+const char* jellyfish::text_dumper<storage_t>::format = "text/sorted";
+
+template<typename Key, typename Val>
+class text_reader {
+  std::istream& is_;
+  char* buffer_;
+  Key key_;
+  Val val_;
+  const RectangularBinaryMatrix m_;
+  const size_t                  size_mask_;
+
+public:
+  text_reader(std::istream& is,
+              file_header* header) :
+    is_(is),
+    buffer_(new char[header->key_len() / 2 + 1]),
+    key_(header->key_len() / 2),
+    m_(header->matrix()),
+    size_mask_(header->size() - 1)
+  { }
+
+  const Key& key() const { return key_; }
+  const Val& val() const { return val_; }
+  size_t pos() const { return m_.times(key()) & size_mask_; }
+
+  bool next() {
+    is_ >> key_ >> val_;
+    return is_.good();
+  }
+};
+}
+
+#endif /* __JELLYFISH_TEXT_DUMPER_HPP__ */
diff --git a/jellyfish/thread_exec.hpp b/include/jellyfish/thread_exec.hpp
similarity index 96%
rename from jellyfish/thread_exec.hpp
rename to include/jellyfish/thread_exec.hpp
index c0dcb2f..0f6813b 100644
--- a/jellyfish/thread_exec.hpp
+++ b/include/jellyfish/thread_exec.hpp
@@ -26,6 +26,7 @@
 #include <jellyfish/err.hpp>
 #include <jellyfish/misc.hpp>
 
+namespace jellyfish {
 class thread_exec {
   struct thread_info {
     int          id;
@@ -47,5 +48,6 @@ public:
     join();
   }
 };
+} // namespace jellyfish {
 
 #endif // __THREAD_EXEC_HPP__
diff --git a/jellyfish/time.hpp b/include/jellyfish/time.hpp
similarity index 100%
rename from jellyfish/time.hpp
rename to include/jellyfish/time.hpp
diff --git a/jellyfish/token_ring.hpp b/include/jellyfish/token_ring.hpp
similarity index 57%
rename from jellyfish/token_ring.hpp
rename to include/jellyfish/token_ring.hpp
index 69cc7bb..7e78413 100644
--- a/jellyfish/token_ring.hpp
+++ b/include/jellyfish/token_ring.hpp
@@ -17,20 +17,20 @@
 #ifndef __JELLYFISH_TOKEN_RING_HPP__
 #define __JELLYFISH_TOKEN_RING_HPP__
 
-template<typename cond_t>
+#include <vector>
+#include <jellyfish/locks_pthread.hpp>
+
+namespace jellyfish {
+template<class cond_t = locks::pthread::cond>
 class token_ring {
 public:
   class token {
-    token  *next;
-    bool    val;
-    cond_t  cond;
-
-    token(token *_next, bool _val) :
-      next(_next), val(_val) {}
+    bool   val;
+    cond_t cond;
+    token* next;
     friend class token_ring;
 
   public:
-    bool is_active() { return val; }
     void wait() {
       cond.lock();
       while(!val) { cond.wait(); }
@@ -46,52 +46,42 @@ public:
     }
   };
 
-private:
-  token *first, *last;
-  cond_t cond;
-
-public:
-  token_ring() : 
-    first(0), last(0)
-  { }
+protected:
+  typedef std::vector<token>            token_list;
+  typedef typename token_list::iterator token_iterator;
+  token_list tokens;
 
-  ~token_ring() {
-    if(!first)
+  void initialize() {
+    if(tokens.size() == 0)
       return;
 
-    while(first != last) {
-      token *del = first;
-      first = first->next;
-      delete del;
+    tokens.front().val = true;
+    tokens.back().next = &tokens.front();
+
+    for(size_t i = 1; i < tokens.size(); ++i) {
+      tokens[i].val    = false;
+      tokens[i-1].next = &tokens[i];
     }
-    delete last;
   }
 
-  void reset() {
-    if(!first)
-      return;
+public:
+  token_ring(int nb_tokens) :
+    tokens(nb_tokens)
+  { initialize(); }
 
-    token *c = first;
-    while(c != last) {
-      c->val = false;
-      c = c->next;
-    }
-    last->val = false;
-    first->val = true;
-  }
+  ~token_ring() { }
 
+  token& operator[](int i) { return tokens[i]; }
 
-  token *new_token() { 
-    token *nt = new token(first, first == 0);
-    if(first) {
-      last->next = nt;
-      last = nt;
-    } else {
-      first = last = nt;
-      nt->next = nt;
-    }
-    return nt;
+  void reset() {
+    if(tokens.size() == 0)
+      return;
+
+    token_iterator it = tokens.begin();
+    it->val = true;
+    for(++it; it != tokens.end(); ++it)
+      it->val = false;
   }
 };
-
+} // namespace jellyfish {
 #endif
diff --git a/include/jellyfish/whole_sequence_parser.hpp b/include/jellyfish/whole_sequence_parser.hpp
new file mode 100644
index 0000000..15b8984
--- /dev/null
+++ b/include/jellyfish/whole_sequence_parser.hpp
@@ -0,0 +1,150 @@
+#ifndef __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__
+#define __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__
+
+#include <string>
+#include <memory>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace jellyfish {
+struct header_sequence_qual {
+  std::string header;
+  std::string seq;
+  std::string qual;
+};
+struct sequence_list {
+  size_t nb_filled;
+  std::vector<header_sequence_qual> data;
+};
+
+template<typename StreamIterator>
+class whole_sequence_parser : public jellyfish::cooperative_pool2<whole_sequence_parser<StreamIterator>, sequence_list> {
+  typedef jellyfish::cooperative_pool2<whole_sequence_parser<StreamIterator>, sequence_list> super;
+  typedef std::unique_ptr<std::istream> stream_type;
+  enum file_type { DONE_TYPE, FASTA_TYPE, FASTQ_TYPE };
+
+  struct stream_status {
+    file_type   type;
+    std::string buffer;
+    stream_type stream;
+    stream_status() : type(DONE_TYPE) { }
+  };
+  cpp_array<stream_status> streams_;
+  StreamIterator&          streams_iterator_;
+
+public:
+  /// Size is the number of buffers to keep around. It should be
+  /// larger than the number of thread expected to read from this
+  /// class. nb_sequences is the number of sequences to read into a
+  /// buffer. 'begin' and 'end' are iterators to a range of istream.
+  whole_sequence_parser(uint32_t size, uint32_t nb_sequences,
+                        uint32_t max_producers, StreamIterator& streams) :
+    super(max_producers, size),
+    streams_(max_producers),
+    streams_iterator_(streams)
+  {
+    for(auto it = super::element_begin(); it != super::element_end(); ++it) {
+      it->nb_filled = 0;
+      it->data.resize(nb_sequences);
+    }
+    for(uint32_t i = 0; i < max_producers; ++i) {
+      streams_.init(i);
+      open_next_file(streams_[i]);
+    }
+  }
+
+  inline bool produce(uint32_t i, sequence_list& buff) {
+    stream_status& st = streams_[i];
+
+    switch(st.type) {
+    case FASTA_TYPE:
+      read_fasta(st, buff);
+      break;
+    case FASTQ_TYPE:
+      read_fastq(st, buff);
+      break;
+    case DONE_TYPE:
+      return true;
+    }
+
+    if(st.stream->good())
+      return false;
+
+    // Reach the end of file, close current and try to open the next one
+    open_next_file(st);
+    return false;
+  }
+
+protected:
+  void open_next_file(stream_status& st) {
+    st.stream.reset();
+    st.stream = streams_iterator_.next();
+    if(!st.stream) {
+      st.type = DONE_TYPE;
+      return;
+    }
+
+    // Update the type of the current file and move past first header
+    // to beginning of sequence.
+    switch(st.stream->peek()) {
+    case EOF: return open_next_file(st);
+    case '>':
+      st.type = FASTA_TYPE;
+      break;
+    case '@':
+      st.type = FASTQ_TYPE;
+      break;
+    default:
+      throw std::runtime_error("Unsupported format"); // Better error management
+    }
+  }
+
+  void read_fasta(stream_status& st, sequence_list& buff) {
+    size_t&      nb_filled = buff.nb_filled;
+    const size_t data_size = buff.data.size();
+
+    for(nb_filled = 0; nb_filled < data_size && st.stream->peek() != EOF; ++nb_filled) {
+      header_sequence_qual& fill_buff = buff.data[nb_filled];
+      st.stream->get(); // Skip '>'
+      std::getline(*st.stream, fill_buff.header);
+      fill_buff.seq.clear();
+      while(st.stream->peek() != '>' && st.stream->peek() != EOF) {
+        std::getline(*st.stream, st.buffer); // Wish there was an easy way to combine the
+        fill_buff.seq.append(st.buffer);             // two lines avoiding copying
+      }
+    }
+  }
+
+  void read_fastq(stream_status& st, sequence_list& buff) {
+    size_t&      nb_filled = buff.nb_filled;
+    const size_t data_size = buff.data.size();
+
+    for(nb_filled = 0; nb_filled < data_size && st.stream->peek() != EOF; ++nb_filled) {
+      header_sequence_qual& fill_buff = buff.data[nb_filled];
+      st.stream->get(); // Skip '@'
+      std::getline(*st.stream, fill_buff.header);
+      fill_buff.seq.clear();
+      while(st.stream->peek() != '+' && st.stream->peek() != EOF) {
+        std::getline(*st.stream, st.buffer); // Wish there was an easy way to combine the
+        fill_buff.seq.append(st.buffer);             // two lines avoiding copying
+      }
+      if(!st.stream->good())
+        throw std::runtime_error("Truncated fastq file");
+      st.stream->ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+      fill_buff.qual.clear();
+      while(fill_buff.qual.size() < fill_buff.seq.size() && st.stream->good()) {
+        std::getline(*st.stream, st.buffer);
+        fill_buff.qual.append(st.buffer);
+      }
+      if(fill_buff.qual.size() != fill_buff.seq.size())
+        throw std::runtime_error("Invalid fastq file: wrong number of quals");
+      if(st.stream->peek() != EOF && st.stream->peek() != '@')
+        throw std::runtime_error("Invalid fastq file: header missing");
+    }
+  }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__ */
diff --git a/install-sh b/install-sh
deleted file mode 100755
index a9244eb..0000000
--- a/install-sh
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	# Protect names problematic for `test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for `test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for `test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/jellyfish-1.1.pc.in b/jellyfish-2.0.pc.in
similarity index 84%
rename from jellyfish-1.1.pc.in
rename to jellyfish-2.0.pc.in
index 4dd3bd0..8a549ec 100644
--- a/jellyfish-1.1.pc.in
+++ b/jellyfish-2.0.pc.in
@@ -6,5 +6,5 @@ includedir=@includedir@
 Name: Jellyfish
 Description: A multi-threaded hash based k-mer counter.
 Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -ljellyfish-1.1 -lpthread
+Libs: -L${libdir} -ljellyfish-2.0 -lpthread
 Cflags: -I${includedir}/jellyfish- at PACKAGE_VERSION@
diff --git a/jellyfish/aligned_values_array.hpp b/jellyfish/aligned_values_array.hpp
deleted file mode 100644
index 0ba9df2..0000000
--- a/jellyfish/aligned_values_array.hpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALIGNED_VALUE_HPP__
-#define __JELLYFISH_ALIGNED_VALUE_HPP__
-
-#include <jellyfish/invertible_hash_array.hpp>
-#include <jellyfish/direct_indexing_array.hpp>
-
-namespace jellyfish {
-  namespace aligned_values {
-    template<typename _key_t, typename _val_t, typename atomic, typename mem_block_t>
-    class array : public storage_t {
-    public:
-      typedef _key_t key_t;
-      typedef _val_t val_t;
-
-    private:
-      typedef typename ::jellyfish::invertible_hash::array<key_t, atomic, mem_block_t> key_ary_t;
-      typedef typename ::jellyfish::direct_indexing::array<size_t, val_t, atomic, mem_block_t> val_ary_t;
-      
-      key_ary_t keys;
-      val_ary_t vals;
-
-    public:
-      array(size_t _size, uint_t _key_len, uint_t _reprobe_limit,
-            size_t *_reprobes) :
-        keys(_size, _key_len, 0, _reprobe_limit, _reprobes),
-        vals(keys.get_lsize())
-      { }
-
-      array(char *keys_map, char *vals_map,
-            size_t _size, uint_t _key_len, uint_t _reprobe_limit,
-            size_t *_reprobes, SquareBinaryMatrix &hash_matrix,
-            SquareBinaryMatrix &hash_inv_matrix) :
-        keys(keys_map, _size, _key_len, 0, _reprobe_limit, _reprobes,
-             hash_matrix, hash_inv_matrix),
-        vals(vals_map, keys.get_lsize())
-      { }
-
-
-      void set_matrix(SquareBinaryMatrix &m) {
-        keys.set_matrix(m);
-      }
-      size_t get_size() const { return keys.get_size(); }
-      uint_t get_key_len() const { return keys.get_key_len(); }
-      uint_t get_val_len() const { return keys.get_val_len(); }
-      uint_t get_max_reprobe() const { return keys.get_max_reprobe(); }
-      size_t get_max_reprobe_offset() const {
-        return keys.get_max_reprobe_offset();
-      }
-      uint_t get_block_len() const { return keys.get_block_len(); }
-      uint_t get_block_word_len() const { 
-        return keys.get_block_word_len() + keys.get_block_len() * sizeof(val_t);
-      }
-
-      size_t floor_block(size_t entries, size_t &blocks) const {
-        return keys.floor_block(entries, blocks);
-      }
-      void zero_keys(const size_t start, const size_t length) {
-        keys.zero_blocks(start, length);
-      }
-      void zero_values(const size_t start, const size_t length) {
-        vals.zero(start, length);
-      }
-      void write_keys_blocks(std::ostream *out, size_t start, size_t length) const {
-        keys.write_blocks(out, start, length);
-      }
-      void write_values(std::ostream *out, size_t start, size_t length) const {
-        vals.write(out, start, length);
-      }
-      void write_matrices(std::ostream *out) {
-        keys.write_ary_header(out);
-      }
-
-      template<typename add_t>
-      bool add(key_t key, const add_t &val, val_t *oval = 0) {
-        bool   is_new;
-        size_t id;
-        
-        if(!keys.set(key, &is_new, &id))
-          return false;
-
-        vals.add(id, val, oval);
-        return true;
-      }
-
-      bool get_val(key_t key, val_t &val, bool full = true) const {
-        key_t  v_ignore;
-        size_t key_id;
-
-        if(!keys.get_val(key, key_id, v_ignore, false))
-          return false;
-
-        vals.get_val(key_id, val);
-        return true;
-      }
-
-      class iterator {
-        typename key_ary_t::iterator              key_it;
-        const val_ary_t                    *const vals;
-
-      public:
-        iterator(typename key_ary_t::iterator _key_it, const val_ary_t *_vals) :
-          key_it(_key_it), vals(_vals) {}
-
-        uint64_t  get_hash() const { return key_it.get_hash(); }
-        uint64_t  get_pos() const { return key_it.get_pos(); }
-        uint64_t  get_start() const { return key_it.get_start(); }
-        uint64_t  get_end() const { return key_it.get_end(); }
-        key_t     get_key() const { return key_it.get_key(); }
-        val_t     get_val() const { return (*vals)[get_id()]; }
-        size_t    get_id() const { return key_it.get_id(); }
-        char     *get_dna_str() { return key_it.get_dna_str(); }
-        bool      next() { return key_it.next(); }
-      };
-      iterator iterator_all() const { 
-        return iterator(keys.iterator_all(), &vals);
-      }
-      iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
-        return iterator(keys.iterator_slice(slice_number, number_of_slice),
-                        &vals);
-      }
-    };
-  }
-}
-
-#endif
diff --git a/jellyfish/allocators_malloc.hpp b/jellyfish/allocators_malloc.hpp
deleted file mode 100644
index e010733..0000000
--- a/jellyfish/allocators_malloc.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/* Allocators return zeroed chunk of memory
- */
-#ifndef __JELLYFISH_ALLOCATORS_MALLOC_HPP__
-#define __JELLYFISH_ALLOCATORS_MALLOC_HPP__
-
-#include <stdlib.h>
-
-namespace allocators
-{
-   class malloc
-  {
-    void        *ptr;
-    size_t      size;
-
-  public:
-    malloc() : ptr(NULL), size(0) {}
-    explicit malloc(size_t _size) : ptr(NULL), size(0) {
-        realloc(_size);
-    }
-    ~malloc() {
-      if(ptr)
-        ::free(ptr);
-    }
-    
-    void *get_ptr() { return ptr; }
-    size_t get_size() const { return size; }
-
-    void *realloc(size_t new_size) {
-      size_t old_size = size;
-      void *new_ptr = ::realloc(ptr, new_size);
-      if(!new_ptr)
-        return NULL;
-      ptr = new_ptr;
-      size = new_size;
-      if(new_size > old_size)
-        ::memset((char *)ptr + old_size, '\0', new_size - old_size);
-      return ptr;
-    }
-
-    // NOOP
-    int lock() { return 0; }
-    int unlock() { return 0; }
-  };
-}
-#endif
diff --git a/jellyfish/allocators_mmap.hpp b/jellyfish/allocators_mmap.hpp
deleted file mode 100644
index 8d975cd..0000000
--- a/jellyfish/allocators_mmap.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALLOCATORS_MMAP_HPP__
-#define __JELLYFISH_ALLOCATORS_MMAP_HPP__
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-
-namespace allocators {
-  class mmap {
-    void   *ptr;
-    size_t  size;
-   
-  public:
-    mmap() : ptr(MAP_FAILED), size(0) {}
-    explicit mmap(size_t _size) : ptr(MAP_FAILED), size(0) {
-      realloc(_size);
-      fast_zero();
-    }
-    ~mmap() {
-      if(ptr != MAP_FAILED)
-        ::munmap(ptr, size);
-    }
-
-    void *get_ptr() const { return ptr != MAP_FAILED ? ptr : NULL; }
-    size_t get_size() const { return size; }
-    void *realloc(size_t new_size);
-    int lock() { return mlock(ptr, size); }
-    int unlock() { return munlock(ptr, size); }
-    
-    // Return a a number of bytes which is a number of whole pages at
-    // least as large as size.
-    static size_t round_to_page(size_t _size);
-
-  private:
-    static const int nb_threads = 4;
-    struct tinfo {
-      pthread_t  thid;
-      char      *start, *end;
-      size_t     pgsize;
-    };
-    void fast_zero();
-    static void * _fast_zero(void *_info);
-  };
-}
-
-#endif
diff --git a/jellyfish/allocators_shm.hpp b/jellyfish/allocators_shm.hpp
deleted file mode 100644
index 123f49f..0000000
--- a/jellyfish/allocators_shm.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALLOCATORS_SHM_HPP__
-#define __JELLYFISH_ALLOCATORS_SHM_HPP__
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sstream>
-
-namespace allocators {
-  class shm
-  {
-    int         fd;
-    void        *ptr;
-    size_t      size;
-    std::string name;
-    bool        unlink;
-
-  public:
-    shm() : fd(-1), ptr(MAP_FAILED), size(0), name(""),
-                      unlink(true) {}
-    explicit shm(size_t _size) :
-      fd(-1), ptr(MAP_FAILED), size(0), name(""), unlink(true) {
-      realloc(_size);
-    }
-    shm(size_t _size, std::string _name) : 
-      fd(-1), ptr(MAP_FAILED), size(0), name(_name), unlink(false) {
-      realloc(_size);
-    }
-    ~shm() {
-      if(ptr != MAP_FAILED)
-        ::munmap(ptr, size);
-      if(fd != -1) {
-        close(fd);
-        if(unlink)
-          ::shm_unlink(name.c_str());
-      }
-    }
-
-    void *get_ptr() { return ptr != MAP_FAILED ? ptr : NULL; }
-    size_t get_size() const { return size; }
-
-    void *realloc(size_t new_size) {
-      size_t old_size = size;
-      if(fd == -1) {
-        // Create a temporary file name. Security considerations?
-        if(name.empty()) {
-          std::ostringstream name_stream("/shm_alloc_");
-          name_stream << getpid() << "_" << (void *)this;
-          name = name_stream.str();
-        }
-        fd = ::shm_open(name.c_str(), O_RDWR|O_CREAT|O_EXCL,
-			S_IRUSR|S_IWUSR);
-        if(fd == -1)
-          return NULL;
-      } else if(ptr != MAP_FAILED) {
-        ::munmap(ptr, old_size);
-        ptr = MAP_FAILED;
-      }
-
-      if(ftruncate(fd, new_size) == -1)
-        return NULL;
-
-      void *new_ptr = ::mmap(NULL, new_size, PROT_WRITE|PROT_READ,
-			     MAP_SHARED, fd, 0);
-      if(new_ptr == MAP_FAILED)
-        return NULL;
-      ptr = new_ptr;
-      size = new_size;
-      return ptr;
-    }
-
-    // Not yet implemented
-    int lock() { return 0; }
-    int unlock() { return 0; }
-  };
-};
-#endif
diff --git a/jellyfish/capped_integer.hpp b/jellyfish/capped_integer.hpp
deleted file mode 100644
index fa0b994..0000000
--- a/jellyfish/capped_integer.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CAPPED_INTEGER_HPP__
-#define __JELLYFISH_CAPPED_INTEGER_HPP__
-
-#include <iostream>
-
-namespace jellyfish {
-  template<typename T> class capped_integer;
-  template<typename T>
-  std::ostream &operator<<(std::ostream &os, const capped_integer<T> &i);
-
-  template<typename T>
-  class capped_integer {
-    T x;
-
-  public:
-    typedef T bits_t;
-    static const T cap = (T)-1;
-
-    capped_integer() : x(0) {}
-    explicit capped_integer(bits_t _x) : x(_x) {}
-
-    static const capped_integer zero;
-    static const capped_integer one;
-    
-    const capped_integer operator+(const capped_integer y) const {
-      return capped_integer((y.x > ~x) ? cap : y.x + x);
-    }
-    const capped_integer operator+(const T& y) const {
-      return capped_integer((y > ~x) ? cap : y + x);
-    }
-
-    bits_t bits() const { return x; }
-    float to_float() const { return (float)x; }
-   
-    bool operator==(const capped_integer &o) { return x == o.x; }
-    bool operator!() const { return x == 0; }
-    
-    friend std::ostream &operator<< <> (std::ostream &os, 
-                                        const capped_integer<T> &i);
-  };
-
-  template<typename T>
-  std::ostream &operator<<(std::ostream &os, const capped_integer<T> &i) {
-    return os << i.x;
-  }
-}
-
-#endif
diff --git a/jellyfish/circular_buffer.hpp b/jellyfish/circular_buffer.hpp
deleted file mode 100644
index 860135c..0000000
--- a/jellyfish/circular_buffer.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CIRCULAR_BUFFER_HPP__
-#define __JELLYFISH_CIRCULAR_BUFFER_HPP__
-
-#include <iostream>
-
-namespace jellyfish {
-  template<typename T>
-  class circular_buffer {
-    const int  size;
-    T         *buffer, *end;
-    T         *start;
-
-  public:
-    explicit circular_buffer(int _size) : size(_size) {
-      buffer = new T[size];
-      end    = buffer + size;
-      start  = buffer;
-    }
-
-    ~circular_buffer() {
-      delete [] buffer;
-    }
-
-    void append(const T v) {
-      //      std::cerr << "append buffer " << (void *)buffer << " end " << (void *)end << " start " << (void *)start << " val " << v << "\n";
-      *start++ = v;
-      
-      if(start == end)
-        start = buffer;
-    }
-
-    template<typename U>
-    T op(U o) const {
-      T *c = start;
-      T acc = *c++;
-      if(c == end)
-        c = buffer;
-
-      do {
-        acc = o(acc, *c++);
-        if(c == end)
-          c = buffer;
-      } while(c != start);
-      return acc;
-    }
-
-    static T T_times(T &x, T &y) { return x * y; }
-    T prod() const { return op(T_times); }
-  };
-}
-
-#endif
diff --git a/jellyfish/cite_cmdline.hpp b/jellyfish/cite_cmdline.hpp
deleted file mode 100644
index aa478f9..0000000
--- a/jellyfish/cite_cmdline.hpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __CITE_CMDLINE_HPP__
-#define __CITE_CMDLINE_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class cite_cmdline {
-public:
-  bool                           bibtex_flag;
-  const char *                   output_arg;
-  bool                           output_given;
-
-  enum {
-    USAGE_OPT = 1000
-  };
-
-  cite_cmdline() : 
-    bibtex_flag(false),
-    output_arg(""), output_given(false)
-  { }
-
-  cite_cmdline(int argc, char* argv[]) :
-    bibtex_flag(false),
-    output_arg(""), output_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"bibtex", 0, 0, 'b'},
-      {"output", 1, 0, 'o'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVbo:";
-
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 'b':
-        bibtex_flag = true;
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 0)
-      error("Requires exactly 0 argument.");
-  }
-
-#define cite_cmdline_USAGE "Usage: jellyfish cite [options]"
-  const char * usage() const { return cite_cmdline_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define cite_cmdline_HELP "How to cite Jellyfish's paper\n\nCitation of paper\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -b, --bibtex                             Bibtex format (false)\n" \
-  " -o, --output=string                      Output file\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return cite_cmdline_HELP; }
-#define cite_cmdline_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return cite_cmdline_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "bibtex_flag:" << bibtex_flag << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-  }
-private:
-};
-
-#endif // __CITE_CMDLINE_HPP__"
diff --git a/jellyfish/compacted_dumper.hpp b/jellyfish/compacted_dumper.hpp
deleted file mode 100644
index 5b3dbe6..0000000
--- a/jellyfish/compacted_dumper.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/dumper.hpp>
-
-namespace jellyfish {
-  template<typename storage_t, typename atomic_t>
-  class compacted_dumper : public dumper_t {
-    define_error_class(ErrorWriting);
-    typedef typename storage_t::iterator iterator;
-    typedef compacted_hash::writer<storage_t> writer_t;
-    struct thread_info_t {
-      pthread_t             thread_id;
-      uint_t                id;
-      locks::pthread::cond  cond;
-      volatile bool         token;
-      writer_t              writer;
-      compacted_dumper     *self;
-    };
-
-    uint_t                threads;
-    std::string           file_prefix;
-    size_t                buffer_size;
-    uint_t                klen, vlen;
-    uint_t                key_len, val_len;
-    size_t                record_len, nb_records, nb_blocks;
-    storage_t            *ary;
-    uint_t                file_index;
-    struct thread_info_t *thread_info;
-    uint64_t              max_count;
-    uint64_t volatile     unique, distinct, total;
-    std::ofstream         out;
-
-  public:
-    // klen: key field length in bits in hash (i.e before rounding up to bytes)
-    // vlen: value field length in bits
-    compacted_dumper(uint_t _threads, const char *_file_prefix, size_t _buffer_size, 
-                     uint_t _vlen, storage_t *_ary) :
-      threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
-      klen(_ary->get_key_len()), vlen(_vlen), ary(_ary), file_index(0)
-    {
-      std::cerr << "Compacted dumper init" << std::endl;
-      key_len    = bits_to_bytes(klen);
-      val_len    = bits_to_bytes(vlen);
-      max_count  = (((uint64_t)1) << (8*val_len)) - 1;
-      record_len = key_len + val_len;
-      nb_records = ary->floor_block(_buffer_size / record_len, nb_blocks);
-
-      thread_info = new struct thread_info_t[threads];
-      for(uint_t i = 0; i < threads; i++) {
-        thread_info[i].token = i == 0;
-        thread_info[i].writer.initialize(nb_records, ary->get_key_len(), vlen, ary);
-        thread_info[i].id = i;
-        thread_info[i].self = this;
-      }
-      unique = distinct = total = 0;
-    }
-
-    ~compacted_dumper() {
-      if(thread_info) {
-        delete[] thread_info;
-      }
-    }
-
-    static void *dump_to_file_thread(void *arg) {
-      struct thread_info_t *info = (struct thread_info_t *)arg;
-      info->self->dump_to_file(info);
-      return NULL;
-    }
-
-    void dump_to_file(struct thread_info_t *my_info);
-
-    virtual void dump();
-    void update_stats() {
-      thread_info[0].writer.update_stats_with(&out, unique, distinct, total);
-    }
-  };
-
-  template<typename storage_t, typename atomic_t>
-  void compacted_dumper<storage_t,atomic_t>::dump() {
-    static const long file_len = pathconf("/", _PC_PATH_MAX);
-    std::cerr << "dump()" << std::endl;
-    char file[file_len + 1];
-    file[file_len] = '\0';
-    int off = snprintf(file, file_len, "%s", file_prefix.c_str());
-    if(off < 0)
-      eraise(ErrorWriting) << "Error creating output path" << err::no;
-    if(off > 0 && off < file_len) {
-      int _off = snprintf(file + off, file_len - off, "_%uld", file_index++);
-      if(_off < 0)
-        eraise(ErrorWriting) << "Error creating output path" << err::no;
-      off += _off;
-    }
-    if(off >= file_len)
-      eraise(ErrorWriting) << "File path is too long";
-      
-    
-    //    out.exceptions(std::ios::eofbit|std::ios::failbit|std::ios::badbit);
-    std::cerr << "Open " << file << std::endl;
-    out.open(file);
-    if(!out.good())
-      eraise(ErrorWriting) << "'" << file << "': " 
-                           << "Can't open file for writing" << err::no;
-
-
-    out.write("JFLISTDN", 8);
-    unique = distinct = total = 0;
-    for(uint_t i = 0; i < threads; i++)
-      thread_info[i].token = i == 0;
-    for(uint_t i = 0; i < threads; i++) {
-      pthread_create(&thread_info[i].thread_id, NULL, dump_to_file_thread, 
-                     &thread_info[i]);
-    }
-
-    for(uint_t i = 0; i < threads; i++)
-      pthread_join(thread_info[i].thread_id, NULL);
-    update_stats();
-    out.close();
-  }
-
-  template<typename storage_t, typename atomic_t>
-  void compacted_dumper<storage_t,atomic_t>::dump_to_file(struct thread_info_t *my_info) {
-    size_t                i;
-    struct thread_info_t *next_info = &thread_info[(my_info->id + 1) % threads];
-    atomic_t              atomic;
-
-    if(my_info->token)
-      my_info->writer.write_header(&out);
-
-    for(i = my_info->id; i * nb_records < ary->get_size(); i += threads) {
-      // fill up buffer
-      iterator it(ary, i * nb_records, (i + 1) * nb_records);
-
-      while(it.next()) {
-        my_info->writer.append(it.key, it.val);
-      }
-
-      // wait for token & write buffer
-      my_info->cond.lock();
-      while(!my_info->token) { my_info->cond.wait(); }
-      my_info->cond.unlock();
-      my_info->writer.dump(&out);
-          
-      // pass on token
-      my_info->token = false;
-      next_info->cond.lock();
-      next_info->token = true;
-      next_info->cond.signal();
-      next_info->cond.unlock();
-
-      // zero out memory
-      ary->zero_blocks(i * nb_blocks, nb_blocks);
-    }
-    atomic.add_fetch(&unique, my_info->writer.get_unique());
-    atomic.add_fetch(&distinct, my_info->writer.get_distinct());
-    atomic.add_fetch(&total, my_info->writer.get_total());
-  }
-}
diff --git a/jellyfish/compacted_hash.hpp b/jellyfish/compacted_hash.hpp
deleted file mode 100644
index 75c7bd0..0000000
--- a/jellyfish/compacted_hash.hpp
+++ /dev/null
@@ -1,530 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_COMPACTED_HASH__
-#define __JELLYFISH_COMPACTED_HASH__
-
-#include <iostream>
-#include <fstream>
-#include <string.h>
-#include <pthread.h>
-#include <jellyfish/err.hpp>
-#include <jellyfish/mapped_file.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/misc.hpp>
-
-namespace jellyfish {
-  namespace compacted_hash {
-    define_error_class(ErrorReading);
-
-    static const char *file_type = "JFLISTDN";
-    struct header {
-      char     type[8];         // type of file. Expect file_type
-      uint64_t key_len;
-      uint64_t val_len;         // In bytes
-      uint64_t size;            // In bytes
-      uint64_t max_reprobe;
-      uint64_t unique;
-      uint64_t distinct;
-      uint64_t total;
-      uint64_t max_count;
-
-      header() { }
-      explicit header(char *ptr) {
-        if(memcmp(ptr, file_type, sizeof(type)))
-          eraise(ErrorReading) << "Bad file type '" << err::substr(ptr, sizeof(type))
-                              << "', expected '" << err::substr(file_type, sizeof(type)) << "'";
-        memcpy((void *)this, ptr, sizeof(struct header));
-      }
-    };
-
-    template<typename storage_t>
-    class writer {
-      uint64_t   unique, distinct, total, max_count;
-      size_t     nb_records;
-      uint_t     klen, vlen;
-      uint_t     key_len, val_len;
-      storage_t *ary;
-      char      *buffer, *end, *ptr;
-
-    public:
-      writer() : unique(0), distinct(0), total(0), max_count(0)
-      { buffer = ptr = end = NULL; }
-
-      writer(size_t _nb_records, uint_t _klen, uint_t _vlen, storage_t *_ary)
-      { 
-        initialize(_nb_records, _klen, _vlen, _ary);
-      }
-
-      void initialize(size_t _nb_records, uint_t _klen, uint_t _vlen, storage_t *_ary) {
-        unique     = distinct = total = max_count = 0;
-        nb_records = _nb_records;
-        klen       = _klen;
-        vlen       = _vlen;
-        key_len    = bits_to_bytes(klen);
-        val_len    = bits_to_bytes(vlen);
-        ary        = _ary;
-        buffer     = new char[nb_records * (key_len + val_len)];
-        end        = buffer + (nb_records * (key_len + val_len));
-        ptr        = buffer;
-      }
-
-      ~writer() {
-        if(buffer)
-          delete buffer;
-      }
-
-      bool append(uint64_t key, uint64_t val) {
-        if(ptr >= end)
-          return false;
-        memcpy(ptr, &key, key_len);
-        ptr += key_len;
-        memcpy(ptr, &val, val_len);
-        ptr += val_len;
-        unique += val == 1;
-        distinct++;
-        total += val;
-        if(val > max_count)
-          max_count = val;
-        return true;
-      }
-
-      void dump(std::ostream *out) {
-        out->write(buffer, ptr - buffer);
-        ptr = buffer;
-      }
-
-      void write_header(std::ostream *out) const {
-        struct header head;
-        memset(&head, '\0', sizeof(head));
-        memcpy(&head.type, file_type, sizeof(head.type));
-        head.key_len = klen;
-        head.val_len = val_len;
-        head.size = ary->get_size();
-        head.max_reprobe = ary->get_max_reprobe_offset();
-        out->write((char *)&head, sizeof(head));
-        ary->write_ary_header(out);
-      }
-
-      void update_stats(std::ostream *out) const {
-        update_stats_with(out, unique, distinct, total, max_count);
-      }
-
-      void update_stats_with(std::ostream *out, uint64_t _unique, uint64_t _distinct,
-                             uint64_t _total, uint64_t _max_count) const {
-        if(!out->good())
-          return;
-        out->seekp(0);
-        if(!out->good()) {
-          out->clear();
-          return;
-        }
-
-        struct header head;
-        memcpy(&head.type, file_type, sizeof(head.type));
-        head.key_len     = klen;
-        head.val_len     = val_len;
-        head.size        = ary->get_size();
-        head.max_reprobe = ary->get_max_reprobe_offset();
-        head.unique      = _unique;
-        head.distinct    = _distinct;
-        head.total       = _total;
-        head.max_count   = _max_count;
-        out->write((char *)&head, sizeof(head));
-      }
-
-      uint64_t get_unique() const { return unique; }
-      uint64_t get_distinct() const { return distinct; }
-      uint64_t get_total() const { return total; }
-      uint64_t get_max_count() const { return max_count; }
-      uint_t   get_key_len_bytes() const { return key_len; }
-      uint_t   get_val_len_bytes() const { return val_len; }
-
-      void reset_counters() {
-        unique = distinct = total = max_count = 0;
-      }
-    };
-    
-    template<typename key_t, typename val_t>
-    class reader {
-      struct header       header;
-      std::ifstream      *io;
-      uint_t              key_len;
-      SquareBinaryMatrix  hash_matrix, hash_inverse_matrix;
-      size_t              record_len, buffer_len;
-      size_t              size_mask;
-      char               *buffer, *end_buffer, *ptr;
-      char                dna_str[33];
-
-    public:
-      key_t key;
-      val_t val;
-
-      reader() { io = 0; buffer = 0; memset(dna_str, '\0', sizeof(dna_str)); }
-      explicit reader(std::string filename, size_t _buff_len = 10000000UL) { 
-        initialize(filename, _buff_len);
-      }
-
-      void initialize(std::string filename, size_t _buff_len) {
-        memset(dna_str, '\0', sizeof(dna_str)); 
-        io = new std::ifstream(filename.c_str());
-        io->read((char *)&header, sizeof(header));
-        if(!io->good())
-          eraise(ErrorReading) << "'" << filename << "': " 
-                               << "File truncated";
-        if(memcmp(header.type, file_type, sizeof(header.type)))
-          eraise(ErrorReading) << "'" << filename << "': " 
-                               << "Bad file type '" 
-                              << err::substr(header.type, sizeof(header.type)) << "', expected '"
-                              << err::substr(file_type, sizeof(header.type)) << "'";
-
-        if(header.key_len > 64 || header.key_len == 0)
-          eraise(ErrorReading) << "'" << filename << "': " 
-                               << "Invalid key length '"
-                               << header.key_len << "'";
-        if(header.size != (1UL << floorLog2(header.size)))
-          eraise(ErrorReading) << "'" << filename << "': " 
-                               << "Size '" << header.size 
-                               << "' is not a power of 2";
-        key_len  = (header.key_len / 8) + (header.key_len % 8 != 0);
-        record_len = key_len + header.val_len;
-        buffer_len = record_len * (_buff_len / record_len);
-        buffer = new char[buffer_len];
-        ptr = buffer;
-        end_buffer = NULL;
-
-        hash_matrix.load(io);
-        hash_inverse_matrix.load(io);
-        
-        if(header.distinct != 0) {
-          std::streamoff list_size = get_file_size(*io);
-          if(list_size != (std::streamoff)-1 &&
-             list_size - (header.distinct * record_len) != 0) {
-            eraise(ErrorReading) << "'" << filename << "': " 
-                                 << "Bad hash size '" << list_size 
-                                 << "', expected '"
-                                 << (header.distinct * record_len) << "' bytes";
-          }
-        }
-        key = val = 0;
-        size_mask = header.size - 1;
-      }
-
-      ~reader() {
-        if(io)
-          delete io;
-        if(buffer)
-          delete[] buffer;
-      }
-
-      uint_t get_key_len() const { return header.key_len; }
-      uint_t get_mer_len() const { return header.key_len / 2; }
-      uint_t get_val_len() const { return header.val_len; }
-      size_t get_size() const { return header.size; }
-      uint64_t get_max_reprobe() const { return header.max_reprobe; }
-      uint64_t get_max_reprobe_offset() const { return header.max_reprobe; }
-      uint64_t get_unique() const { return header.unique; }
-      uint64_t get_distinct() const { return header.distinct; }
-      uint64_t get_total() const { return header.total; }
-      uint64_t get_max_count() const { return header.max_count; }
-      SquareBinaryMatrix get_hash_matrix() const { return hash_matrix; }
-      SquareBinaryMatrix get_hash_inverse_matrix() const { return hash_inverse_matrix; }
-      void write_ary_header(std::ostream *out) const {
-        hash_matrix.dump(out);
-        hash_inverse_matrix.dump(out);
-      }
-
-      key_t get_key() const { return key; }
-      val_t get_val() const { return val; }
-      
-
-      void get_string(char *out) const {
-        parse_dna::mer_binary_to_string(key, get_mer_len(), out);
-      }
-      char* get_dna_str() {
-        parse_dna::mer_binary_to_string(key, get_mer_len(), dna_str);
-        return dna_str;
-      }
-      uint64_t get_hash() const { return hash_matrix.times(key); }
-      uint64_t get_pos() const { return hash_matrix.times(key) & size_mask; }
-
-      bool next() {
-        while(true) {
-          if(ptr <= end_buffer) {
-            memcpy(&key, ptr, key_len);
-            ptr += key_len;
-            memcpy(&val, ptr, header.val_len);
-            ptr += header.val_len;
-            return true;
-          }
-
-          if(io->fail())
-            return false;
-          io->read(buffer, buffer_len);
-          //      if(record_len * (io->gcount() / record_len) != io->gcount())
-          //        return false;
-          ptr = buffer;
-          end_buffer = NULL;
-          if((size_t)io->gcount() >= record_len)
-            end_buffer = ptr + (io->gcount() - record_len);
-        }
-      }
-    };
-
-    template<typename key_t, typename val_t>
-    class query {
-      mapped_file         file;
-      struct header       header;
-      uint_t              key_len;
-      uint_t              val_len;
-      uint_t              record_len;
-      SquareBinaryMatrix  hash_matrix;
-      SquareBinaryMatrix  hash_inverse_matrix;
-      char               *base;
-      uint64_t            size;
-      uint64_t            size_mask;
-      uint64_t            last_id;
-      key_t               first_key, last_key;
-      uint64_t            first_pos, last_pos;
-      bool                canonical;
-
-    public:
-      /* Can't wait for C++0x to be finalized and call constructor
-         from constructor!
-       */
-      explicit query(mapped_file &map) :
-        file(map),
-        header(file.base()), 
-        key_len((header.key_len / 8) + (header.key_len % 8 != 0)),
-        val_len(header.val_len),
-        record_len(key_len + header.val_len),
-        hash_matrix(file.base() + sizeof(header)),
-        hash_inverse_matrix(file.base() + sizeof(header) + hash_matrix.dump_size()),
-        base(file.base() + sizeof(header) + hash_matrix.dump_size() + hash_inverse_matrix.dump_size()),
-        size(header.size),
-        size_mask(header.size - 1),
-        last_id((file.end() - base) / record_len),
-        canonical(false)
-      {
-        if(header.distinct != 0 && file.end() - base - header.distinct * record_len != 0)
-          eraise(ErrorReading) << "'" << file.path() << "': " 
-                               << "Bad hash size '" << (file.end() - base)
-                               << "', expected '" << header.distinct * record_len << "' bytes";
-          
-        get_key(0, &first_key);
-        first_pos = get_pos(first_key);
-        get_key(last_id - 1, &last_key);
-        last_pos = get_pos(last_key);
-      }
-      explicit query(std::string filename) : 
-        file(filename.c_str()), 
-        header(file.base()), 
-        key_len((header.key_len / 8) + (header.key_len % 8 != 0)),
-        val_len(header.val_len),
-        record_len(key_len + header.val_len),
-        hash_matrix(file.base() + sizeof(header)),
-        hash_inverse_matrix(file.base() + sizeof(header) + hash_matrix.dump_size()),
-        base(file.base() + sizeof(header) + hash_matrix.dump_size() + hash_inverse_matrix.dump_size()),
-        size(header.size),
-        size_mask(header.size - 1),
-        last_id((file.end() - base) / record_len),
-        canonical(false)
-      { 
-        if(header.distinct != 0 && file.end() - base - header.distinct * record_len != 0)
-          eraise(ErrorReading) << "'" << file.path() << "': " 
-                               << "Bad hash size '" << (file.end() - base)
-                               << "', expected '" << header.distinct * record_len << "' bytes";
-          
-        get_key(0, &first_key);
-        first_pos = get_pos(first_key);
-        get_key(last_id - 1, &last_key);
-        last_pos = get_pos(last_key);
-      }
-
-      uint_t get_key_len() const { return header.key_len; }
-      uint_t get_mer_len() const { return header.key_len / 2; }
-      uint_t get_val_len() const { return header.val_len; }
-      size_t get_size() const { return header.size; }
-      size_t get_nb_mers() const { return last_id; }
-      uint64_t get_max_reprobe() const { return header.max_reprobe; }
-      uint64_t get_max_reprobe_offset() const { return header.max_reprobe; }
-      uint64_t get_unique() const { return header.unique; }
-      uint64_t get_distinct() const { return header.distinct; }
-      uint64_t get_total() const { return header.total; }
-      uint64_t get_max_count() const { return header.max_count; }
-      SquareBinaryMatrix get_hash_matrix() const { return hash_matrix; }
-      SquareBinaryMatrix get_hash_inverse_matrix() const { return hash_inverse_matrix; }
-      bool get_canonical() const { return canonical; }
-      void set_canonical(bool v) { canonical = v; }
-
-      /* No check is made on the validity of the string passed. Should only contained [acgtACGT] to get a valid answer.
-       */
-      val_t operator[] (const char *key_s) const {
-        return get_key_val(parse_dna::mer_string_to_binary(key_s, get_mer_len()));
-      }
-      val_t operator[] (const key_t key) const { return get_key_val(key); }
-
-      void get_key(size_t id, key_t *k) const {
-        *k = 0;
-        memcpy(k, base + id * record_len, key_len);
-      }
-      void get_val(size_t id, val_t *v) const {
-        *v = 0;
-        memcpy(v, base + id * record_len + key_len, val_len);
-      }
-      uint64_t get_pos(key_t k) const { 
-        return hash_matrix.times(k) & size_mask;
-      }
-        
-      val_t get_key_val(const key_t key) const {
-        uint64_t id;
-        val_t res;
-        if(get_key_val_id(key, &res, &id))
-          return res;
-        else
-          return 0;
-      }
-
-      bool get_key_val_id(const key_t _key, val_t *res, 
-                          uint64_t *id) const {
-        key_t key;
-        if(canonical) {
-          key = parse_dna::reverse_complement(_key, get_mer_len());
-          if(key > _key)
-            key = _key;
-        } else {
-          key = _key;
-        }
-        if(key == first_key) {
-          get_val(0, res);
-          *id = 0;
-          return true;
-        }
-        if(key == last_key) {
-          get_val(last_id - 1, res);
-          *id = last_id;
-          return true;
-        }
-        uint64_t pos = get_pos(key);
-        if(pos < first_pos || pos > last_pos)
-          return false;
-        uint64_t first = 0, last = last_id;
-        while(first < last - 1) {
-          uint64_t middle = (first + last) / 2;
-          key_t mid_key;
-          get_key(middle, &mid_key);
-          //          printf("%ld %ld %ld %ld %ld %ld %ld\n", key, pos, first, middle, last, mid_key, get_pos(mid_key));
-          if(key == mid_key) {
-            get_val(middle, res);
-            *id = middle;
-            return true;
-          }
-          uint64_t mid_pos = get_pos(mid_key);
-          if(mid_pos > pos || (mid_pos == pos && mid_key > key))
-            last = middle;
-          else
-            first = middle;
-        }
-        return false;
-      }
-      
-      class iterator {
-        char     *base, *ptr;
-        uint64_t  last_id;
-        uint_t    key_len;
-        uint_t    val_len;
-        uint_t    record_len;
-        uint_t    mer_len;
-        uint64_t  id;
-        key_t     key;
-        val_t     val;
-        char      dna_str[33];
-
-      public:
-        iterator(char *_base, uint64_t _last_id, uint_t _key_len, uint_t _val_len, uint_t _mer_len) :
-          base(_base), ptr(_base), last_id(_last_id), key_len(_key_len), val_len(_val_len),
-          record_len(key_len + val_len), mer_len(_mer_len), id(0), key(0), val(0)
-        {
-          memset(dna_str, '\0', sizeof(dna_str));
-        }
-
-        key_t get_key() const { return key; }
-        val_t get_val() const { return val; }
-        uint64_t get_id() const { return id; }
-
-        bool next() {
-          if(id >= last_id)
-            return false;
-          ++id;
-          memcpy(&key, ptr, key_len);
-          ptr += key_len;
-          memcpy(&val, ptr, val_len);
-          ptr += val_len;
-          return true;
-        }
-
-        bool next(uint64_t *_id, key_t *_key, val_t *_val) {
-          if(id >= last_id)
-            return false;
-          *_id = atomic::gcc::add_fetch(&id, (uint64_t)1) - 1;
-          if(*_id >= last_id)
-            return false;
-          char *ptr = base + (*_id) * record_len;
-          *_key = 0;
-          memcpy(_key, ptr, key_len);
-          ptr += key_len;
-          *_val = 0;
-          memcpy(_val, ptr, val_len);
-          return true;
-        }
-
-        inline bool next(key_t *_key, val_t *_val) {
-          uint64_t _id;
-          return next(&_id, _key, _val);
-        }
-
-        char *get_dna_str() {
-          parse_dna::mer_binary_to_string(key, mer_len, dna_str);
-          return dna_str;
-        }
-
-        void get_dna_str(char *out) {
-          parse_dna::mer_binary_to_string(key, mer_len, out);
-        }
-      };
-
-      iterator get_iterator() const { return iterator_all(); }
-      iterator iterator_all() const { return iterator(base, last_id, key_len, val_len, get_mer_len()); }
-      iterator iterator_slice(uint64_t slice_number, uint64_t number_of_slice) const {
-        std::pair<uint64_t, uint64_t> res =
-          slice(slice_number, number_of_slice, last_id);
-        char   *it_base    = base + res.first * record_len;
-        uint64_t  it_last_id = res.second - res.first;
-
-        if(it_base >= file.end()) {
-          it_base    = base;
-          it_last_id = 0;
-        } else if(it_base + it_last_id * record_len > file.end())
-          it_last_id = (file.end() - it_base) / record_len;
-
-        return iterator(it_base, it_last_id, key_len, val_len, get_mer_len()); 
-      }
-    };
-  }
-}
-#endif /* __COMPACTED_HASH__ */
diff --git a/jellyfish/concurrent_queues.hpp b/jellyfish/concurrent_queues.hpp
deleted file mode 100644
index 4068849..0000000
--- a/jellyfish/concurrent_queues.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CONCURRENT_QUEUES_HPP__
-#define __JELLYFISH_CONCURRENT_QUEUES_HPP__
-
-#include <sys/time.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <new>
-#include <stdio.h>
-#include <assert.h>
-
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/divisor.hpp>
-
-/***
- * Circular buffer of fixed size with thread safe enqueue and dequeue
- * operation to make it behave like a FIFO. Elements are enqueued at
- * the head and dequeued at the tail. Never more than n elements
- * should be enqueued if the size is n+1. There is no check for this.
- *
- * It is possible for the tail pointer to go past an element (i.e. it
- * has been "dequeued"), but the thread is slow to zero the pointer
- * (i.e. to claim the element). It is then possible for the head
- * pointer to point to this not yet claimed element. The enqueue()
- * method blindly skip over such an element. Hence, it is possible
- * that the same element will be dequeued again before it is
- * claimed. Or, it will be claimed after being skipped and another
- * thread will dequeue what looks like an empty element. The outer
- * loop of dequeue() handles this situation.
- */
-
-namespace jellyfish {
-  template<class Val>
-  class concurrent_queue {
-    Val               **queue;
-    const uint64_t      size;
-    uint64_t volatile   head;
-    uint64_t volatile   tail;
-    bool volatile       closed;
-    divisor64           size_div;
-  
-  public:
-    explicit concurrent_queue(uint64_t _size) : 
-      size(20 *_size), head(0), tail(0), closed(false), size_div(size) 
-    { 
-      queue = new Val *[size];
-      memset(queue, 0, sizeof(Val *) * size);
-    }
-    ~concurrent_queue() { delete [] queue; }
-
-    void enqueue(Val *v);
-    Val *dequeue();
-    bool is_closed() { return closed; }
-    void close() { closed = true; __sync_synchronize(); }
-    bool has_space() { return head != tail; }
-    bool is_low() { 
-      uint64_t ctail = tail;
-      __sync_synchronize();
-      uint64_t chead = head;
-      int64_t len = chead - ctail;
-      if(len < 0)
-        len += size;
-      return (uint64_t)(4*len) <= size;
-    }
-    uint64_t usage() {
-      uint64_t ctail = tail;
-      __sync_synchronize();
-      uint64_t chead = head;
-      int64_t len = chead - ctail;
-      if(len < 0)
-        len += size;
-      return len;
-    }
-  };
-
-  template<class Val>
-  void concurrent_queue<Val>::enqueue(Val *v) {
-    int          done = 0;
-    uint64_t chead;
-
-    chead = head;
-    do {
-      //      uint64_t q, nhead;
-      uint64_t nhead = (chead + 1) % size_div;
-      //      size_div.division(chead + 1, q, nhead);
-      //    uint64_t nhead = (chead + 1) % size;
-
-      done = (atomic::gcc::cas(&queue[chead], (Val*)0, v) == (Val*)0);
-      chead = atomic::gcc::cas(&head, chead, nhead);
-    } while(!done);
-
-    assert(head < size);
-    assert(tail < size);
-  }
-
-  template<class Val>
-  Val *concurrent_queue<Val>::dequeue() {
-    bool done = false;
-    Val *res;
-    uint64_t ctail, ntail;
-
-    ctail = tail;
-    //  __sync_synchronize();
-    do {
-      bool dequeued = false;
-      do {
-        //    if(ctail == head)
-        //      return NULL;
-
-        // Complicated way to do ctail == head. Is it necessary? Or is
-        // the memory barrier above sufficient? Or even necessary?
-        if(atomic::gcc::cas(&head, ctail, ctail) == ctail) {
-          assert(head < size);
-          assert(tail < size);
-          return NULL;
-        }
-        //      ntail    = (ctail + 1) % size;
-        //        uint64_t q;
-        //        size_div.division(ctail + 1, q, ntail);
-        ntail = (ctail + 1) % size_div;
-        ntail    = atomic::gcc::cas(&tail, ctail, ntail);
-        dequeued = ntail == ctail;
-        ctail    = ntail;
-      } while(!dequeued);
-
-      // Claim dequeued slot.  We may have dequeued an element which is
-      // empty or that another thread also has dequeued but not yet
-      // claimed. This can happen if a thread is slow to claim (set
-      // pointer to 0) and the enqueue method has queued elements past
-      // this one.
-      res = queue[ctail];
-      if(res)
-        done = atomic::gcc::cas(&queue[ctail], res, (Val*)0) == res;
-    } while(!done);
-
-    assert(head < size);
-    assert(tail < size);
-
-    return res;
-  }
-}
-  
-#endif
diff --git a/jellyfish/count_main_cmdline.hpp b/jellyfish/count_main_cmdline.hpp
deleted file mode 100644
index 3e6ce7b..0000000
--- a/jellyfish/count_main_cmdline.hpp
+++ /dev/null
@@ -1,684 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __COUNT_ARGS_HPP__
-#define __COUNT_ARGS_HPP__
-
-#include <stdint.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <errno.h>
-#include <string.h>
-#include <stdexcept>
-#include <string>
-#include <limits>
-#include <vector>
-#include <iostream>
-#include <sstream>
-
-class count_args {
- // Boiler plate stuff. Conversion from string to other formats
-  static bool adjust_double_si_suffix(double &res, const char *suffix) {
-    if(*suffix == '\0')
-      return true;
-    if(*(suffix + 1) != '\0')
-      return false;
-
-    switch(*suffix) {
-    case 'a': res *= 1e-18; break;
-    case 'f': res *= 1e-15; break;
-    case 'p': res *= 1e-12; break;
-    case 'n': res *= 1e-9;  break;
-    case 'u': res *= 1e-6;  break;
-    case 'm': res *= 1e-3;  break;
-    case 'k': res *= 1e3;   break;
-    case 'M': res *= 1e6;   break;
-    case 'G': res *= 1e9;   break;
-    case 'T': res *= 1e12;  break;
-    case 'P': res *= 1e15;  break;
-    case 'E': res *= 1e18;  break;
-    default: return false;
-    }
-    return true;
-  }
-
-  static double conv_double(const char *str, ::std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    double res = strtod(str, &endptr);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (double)0.0;
-    }
-    bool invalid =
-      si_suffix ? !adjust_double_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (double)0.0;
-    }
-    return res;
-  }
-
-  static int conv_enum(const char* str, ::std::string& err, const char* const strs[]) {
-    int res = 0;
-    for(const char* const* cstr = strs; *cstr; ++cstr, ++res)
-      if(!strcmp(*cstr, str))
-        return res;
-    err += "Invalid constant '";
-    err += str;
-    err += "'. Expected one of { ";
-    for(const char* const* cstr = strs; *cstr; ++cstr) {
-      if(cstr != strs)
-        err += ", ";
-      err += *cstr;
-    }
-    err += " }";
-    return -1;
-  }
-
-  template<typename T>
-  static bool adjust_int_si_suffix(T &res, const char *suffix) {
-    if(*suffix == '\0')
-      return true;
-    if(*(suffix + 1) != '\0')
-      return false;
-
-    switch(*suffix) {
-    case 'k': res *= (T)1000; break;
-    case 'M': res *= (T)1000000; break;
-    case 'G': res *= (T)1000000000; break;
-    case 'T': res *= (T)1000000000000; break;
-    case 'P': res *= (T)1000000000000000; break;
-    case 'E': res *= (T)1000000000000000000; break;
-    default: return false;
-    }
-    return true;
-  }
-
-  template<typename T>
-  static T conv_int(const char *str, ::std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    long long int res = strtoll(str, &endptr, 0);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (T)0;
-    }
-    bool invalid =
-      si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (T)0;
-    }
-    if(res > ::std::numeric_limits<T>::max() ||
-       res < ::std::numeric_limits<T>::min()) {
-      err.assign("Value out of range");
-      return (T)0;
-    }
-    return (T)res;
-  }
-
-  template<typename T>
-  static T conv_uint(const char *str, ::std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    while(isspace(*str)) { ++str; }
-    if(*str == '-') {
-      err.assign("Negative value");
-      return (T)0;
-    }
-    unsigned long long int res = strtoull(str, &endptr, 0);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (T)0;
-    }
-    bool invalid =
-      si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (T)0;
-    }
-    if(res > ::std::numeric_limits<T>::max() ||
-       res < ::std::numeric_limits<T>::min()) {
-      err.assign("Value out of range");
-      return (T)0;
-    }
-    return (T)res;
-  }
-
-  template<typename T>
-  static ::std::string vec_str(const std::vector<T> &vec) {
-    ::std::ostringstream os;
-    for(typename ::std::vector<T>::const_iterator it = vec.begin();
-        it != vec.end(); ++it) {
-      if(it != vec.begin())
-        os << ",";
-      os << *it;
-    }
-    return os.str();
-  }
-
-  class string : public ::std::string {
-  public:
-    string() : ::std::string() {}
-    explicit string(const ::std::string &s) : std::string(s) {}
-    explicit string(const char *s) : ::std::string(s) {}
-    int as_enum(const char* const strs[]) {
-      ::std::string err;
-      int res = conv_enum((const char*)this->c_str(), err, strs);
-      if(!err.empty())
-        throw ::std::runtime_error(err);
-      return res;
-    }
-
-
-    uint32_t as_uint32_suffix() const { return as_uint32(true); }
-    uint32_t as_uint32(bool si_suffix = false) const {
-      ::std::string err;
-      uint32_t res = conv_uint<uint32_t>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to uint32_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    uint64_t as_uint64_suffix() const { return as_uint64(true); }
-    uint64_t as_uint64(bool si_suffix = false) const {
-      ::std::string err;
-      uint64_t res = conv_uint<uint64_t>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to uint64_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    int32_t as_int32_suffix() const { return as_int32(true); }
-    int32_t as_int32(bool si_suffix = false) const {
-      ::std::string err;
-      int32_t res = conv_int<int32_t>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to int32_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    int64_t as_int64_suffix() const { return as_int64(true); }
-    int64_t as_int64(bool si_suffix = false) const {
-      ::std::string err;
-      int64_t res = conv_int<int64_t>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to int64_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    int as_int_suffix() const { return as_int(true); }
-    int as_int(bool si_suffix = false) const {
-      ::std::string err;
-      int res = conv_int<int>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to int_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    long as_long_suffix() const { return as_long(true); }
-    long as_long(bool si_suffix = false) const {
-      ::std::string err;
-      long res = conv_int<long>((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to long_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-    double as_double_suffix() const { return as_double(true); }
-    double as_double(bool si_suffix = false) const {
-      ::std::string err;
-      double res = conv_double((const char*)this->c_str(), err, si_suffix);
-      if(!err.empty()) {
-        ::std::string msg("Invalid conversion of '");
-        msg += *this;
-        msg += "' to double_t: ";
-        msg += err;
-        throw ::std::runtime_error(msg);
-      }
-      return res;
-    }
-  };
-
-public:
-  struct invalid_char {
-    enum { warn, ignore, error };
-    static const char* const  strs[4];
-  };
-
-  uint32_t                       mer_len_arg;
-  bool                           mer_len_given;
-  uint64_t                       size_arg;
-  bool                           size_given;
-  uint32_t                       threads_arg;
-  bool                           threads_given;
-  string                         output_arg;
-  bool                           output_given;
-  bool                           O_flag;
-  uint32_t                       counter_len_arg;
-  bool                           counter_len_given;
-  uint32_t                       out_counter_len_arg;
-  bool                           out_counter_len_given;
-  bool                           both_strands_flag;
-  uint32_t                       reprobes_arg;
-  bool                           reprobes_given;
-  bool                           raw_flag;
-  bool                           both_flag;
-  bool                           quake_flag;
-  uint32_t                       quality_start_arg;
-  bool                           quality_start_given;
-  uint32_t                       min_quality_arg;
-  bool                           min_quality_given;
-  uint64_t                       lower_count_arg;
-  bool                           lower_count_given;
-  uint64_t                       upper_count_arg;
-  bool                           upper_count_given;
-  int                            invalid_char_arg;
-  bool                           invalid_char_given;
-  string                         matrix_arg;
-  bool                           matrix_given;
-  const char *                   timing_arg;
-  bool                           timing_given;
-  const char *                   stats_arg;
-  bool                           stats_given;
-  bool                           no_write_flag;
-  bool                           measure_flag;
-  uint64_t                       buffers_arg;
-  bool                           buffers_given;
-  uint64_t                       buffer_size_arg;
-  bool                           buffer_size_given;
-  uint64_t                       out_buffer_size_arg;
-  bool                           out_buffer_size_given;
-  bool                           lock_flag;
-  bool                           stream_flag;
-  ::std::vector<const char *>    file_arg;
-  typedef ::std::vector<const char *>::iterator file_arg_it;
-  typedef ::std::vector<const char *>::const_iterator file_arg_const_it;
-
-  enum {
-    START_OPT = 1000,
-    FULL_HELP_OPT,
-    USAGE_OPT,
-    OUT_COUNTER_LEN_OPT,
-    BOTH_OPT,
-    QUALITY_START_OPT,
-    MIN_QUALITY_OPT,
-    INVALID_CHAR_OPT,
-    MATRIX_OPT,
-    TIMING_OPT,
-    STATS_OPT,
-    BUFFERS_OPT,
-    BUFFER_SIZE_OPT,
-    OUT_BUFFER_SIZE_OPT,
-    LOCK_OPT,
-    STREAM_OPT
-  };
-
-  count_args() :
-    mer_len_arg(), mer_len_given(false),
-    size_arg(), size_given(false),
-    threads_arg(1), threads_given(false),
-    output_arg("mer_counts"), output_given(false),
-    O_flag(false),
-    counter_len_arg(7), counter_len_given(false),
-    out_counter_len_arg(4), out_counter_len_given(false),
-    both_strands_flag(false),
-    reprobes_arg(62), reprobes_given(false),
-    raw_flag(false),
-    both_flag(false),
-    quake_flag(false),
-    quality_start_arg(64), quality_start_given(false),
-    min_quality_arg(0), min_quality_given(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    invalid_char_arg(), invalid_char_given(false),
-    matrix_arg(""), matrix_given(false),
-    timing_arg(""), timing_given(false),
-    stats_arg(""), stats_given(false),
-    no_write_flag(false),
-    measure_flag(false),
-    buffers_arg(), buffers_given(false),
-    buffer_size_arg(8192), buffer_size_given(false),
-    out_buffer_size_arg(20000000), out_buffer_size_given(false),
-    lock_flag(false),
-    stream_flag(false),
-    file_arg()
-  { }
-
-  count_args(int argc, char* argv[]) :
-    mer_len_arg(), mer_len_given(false),
-    size_arg(), size_given(false),
-    threads_arg(1), threads_given(false),
-    output_arg("mer_counts"), output_given(false),
-    O_flag(false),
-    counter_len_arg(7), counter_len_given(false),
-    out_counter_len_arg(4), out_counter_len_given(false),
-    both_strands_flag(false),
-    reprobes_arg(62), reprobes_given(false),
-    raw_flag(false),
-    both_flag(false),
-    quake_flag(false),
-    quality_start_arg(64), quality_start_given(false),
-    min_quality_arg(0), min_quality_given(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    invalid_char_arg(), invalid_char_given(false),
-    matrix_arg(""), matrix_given(false),
-    timing_arg(""), timing_given(false),
-    stats_arg(""), stats_given(false),
-    no_write_flag(false),
-    measure_flag(false),
-    buffers_arg(), buffers_given(false),
-    buffer_size_arg(8192), buffer_size_given(false),
-    out_buffer_size_arg(20000000), out_buffer_size_given(false),
-    lock_flag(false),
-    stream_flag(false),
-    file_arg()
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"mer-len", 1, 0, 'm'},
-      {"size", 1, 0, 's'},
-      {"threads", 1, 0, 't'},
-      {"output", 1, 0, 'o'},
-      {"", 0, 0, 'O'},
-      {"counter-len", 1, 0, 'c'},
-      {"out-counter-len", 1, 0, OUT_COUNTER_LEN_OPT},
-      {"both-strands", 0, 0, 'C'},
-      {"reprobes", 1, 0, 'p'},
-      {"raw", 0, 0, 'r'},
-      {"both", 0, 0, BOTH_OPT},
-      {"quake", 0, 0, 'q'},
-      {"quality-start", 1, 0, QUALITY_START_OPT},
-      {"min-quality", 1, 0, MIN_QUALITY_OPT},
-      {"lower-count", 1, 0, 'L'},
-      {"upper-count", 1, 0, 'U'},
-      {"invalid-char", 1, 0, INVALID_CHAR_OPT},
-      {"matrix", 1, 0, MATRIX_OPT},
-      {"timing", 1, 0, TIMING_OPT},
-      {"stats", 1, 0, STATS_OPT},
-      {"no-write", 0, 0, 'w'},
-      {"measure", 0, 0, 'u'},
-      {"buffers", 1, 0, BUFFERS_OPT},
-      {"buffer-size", 1, 0, BUFFER_SIZE_OPT},
-      {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
-      {"lock", 0, 0, LOCK_OPT},
-      {"stream", 0, 0, STREAM_OPT},
-      {"help", 0, 0, 'h'},
-      {"full-help", 0, 0, FULL_HELP_OPT},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVm:s:t:o:Oc:Cp:rqL:U:wu";
-
-    ::std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { ::std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) {
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':':
-        ::std::cerr << "Missing required argument for "
-                  << (index == -1 ? ::std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << ::std::endl;
-        exit(1);
-      case 'h':
-        ::std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        ::std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        ::std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case FULL_HELP_OPT:
-        ::std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
-        exit(0);
-      case 'm':
-        mer_len_given = true;
-        mer_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-m, --mer-len=uint32")
-        break;
-      case 's':
-        size_given = true;
-        size_arg = conv_uint<uint64_t>((const char*)optarg, err, true);
-        CHECK_ERR(uint64_t, optarg, "-s, --size=uint64")
-        break;
-      case 't':
-        threads_given = true;
-        threads_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-t, --threads=uint32")
-        break;
-      case 'o':
-        output_given = true;
-        output_arg.assign(optarg);
-        break;
-      case 'O':
-        O_flag = true;
-        break;
-      case 'c':
-        counter_len_given = true;
-        counter_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-c, --counter-len=Length in bits")
-        break;
-      case OUT_COUNTER_LEN_OPT:
-        out_counter_len_given = true;
-        out_counter_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "    --out-counter-len=Length in bytes")
-        break;
-      case 'C':
-        both_strands_flag = true;
-        break;
-      case 'p':
-        reprobes_given = true;
-        reprobes_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-p, --reprobes=uint32")
-        break;
-      case 'r':
-        raw_flag = true;
-        break;
-      case BOTH_OPT:
-        both_flag = true;
-        break;
-      case 'q':
-        quake_flag = true;
-        break;
-      case QUALITY_START_OPT:
-        quality_start_given = true;
-        quality_start_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "    --quality-start=uint32")
-        break;
-      case MIN_QUALITY_OPT:
-        min_quality_given = true;
-        min_quality_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "    --min-quality=uint32")
-        break;
-      case 'L':
-        lower_count_given = true;
-        lower_count_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
-        break;
-      case 'U':
-        upper_count_given = true;
-        upper_count_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
-        break;
-      case INVALID_CHAR_OPT:
-        invalid_char_given = true;
-        invalid_char_arg = conv_enum((const char*)optarg, err, invalid_char::strs);
-        CHECK_ERR(enum, optarg, "    --invalid-char=warn|ignore|error")
-        break;
-      case MATRIX_OPT:
-        matrix_given = true;
-        matrix_arg.assign(optarg);
-        break;
-      case TIMING_OPT:
-        timing_given = true;
-        timing_arg = optarg;
-        break;
-      case STATS_OPT:
-        stats_given = true;
-        stats_arg = optarg;
-        break;
-      case 'w':
-        no_write_flag = true;
-        break;
-      case 'u':
-        measure_flag = true;
-        break;
-      case BUFFERS_OPT:
-        buffers_given = true;
-        buffers_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "    --buffers=uint64")
-        break;
-      case BUFFER_SIZE_OPT:
-        buffer_size_given = true;
-        buffer_size_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "    --buffer-size=uint64")
-        break;
-      case OUT_BUFFER_SIZE_OPT:
-        out_buffer_size_given = true;
-        out_buffer_size_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "    --out-buffer-size=uint64")
-        break;
-      case LOCK_OPT:
-        lock_flag = true;
-        break;
-      case STREAM_OPT:
-        stream_flag = true;
-        break;
-      }
-    }
-
-    // Check that required switches are present
-    if(!mer_len_given)
-      error("[-m, --mer-len=uint32] required switch");
-    if(!size_given)
-      error("[-s, --size=uint64] required switch");
-
-    // Parse arguments
-    if(argc - optind < 1)
-      error("Requires at least 1 argument.");
-    for( ; optind < argc; ++optind) {
-      file_arg.push_back(argv[optind]);
-    }
-  }
-
-#define count_args_USAGE "Usage: jellyfish count [options] file:path+"
-
-  const char * usage() const { return count_args_USAGE; }
-  void error(const char *msg) {
-    ::std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << ::std::endl;
-    exit(1);
-  }
-
-#define count_args_HELP "Count k-mers or qmers in fasta or fastq files\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -m, --mer-len=uint32                    *Length of mer\n" \
-  " -s, --size=uint64                       *Hash size\n" \
-  " -t, --threads=uint32                     Number of threads (1)\n" \
-  " -o, --output=string                      Output prefix (mer_counts)\n" \
-  " -c, --counter-len=Length in bits         Length of counting field (7)\n" \
-  "     --out-counter-len=Length in bytes    Length of counter field in output (4)\n" \
-  " -C, --both-strands                       Count both strand, canonical representation (false)\n" \
-  " -p, --reprobes=uint32                    Maximum number of reprobes (62)\n" \
-  " -r, --raw                                Write raw database (false)\n" \
-  " -q, --quake                              Quake compatibility mode (false)\n" \
-  "     --quality-start=uint32               Starting ASCII for quality values (64)\n" \
-  "     --min-quality=uint32                 Minimum quality. A base with lesser quality becomes an N (0)\n" \
-  " -L, --lower-count=uint64                 Don't output k-mer with count < lower-count\n" \
-  " -U, --upper-count=uint64                 Don't output k-mer with count > upper-count\n" \
-  "     --invalid-char=warn|ignore|error     How to treat invalid characters. The char is changed to a N. (warn)\n" \
-  "     --matrix=Matrix file                 Hash function binary matrix\n" \
-  "     --timing=Timing file                 Print timing information\n" \
-  "     --stats=Stats file                   Print stats\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  "     --full-help                          Detailed help\n" \
-  " -V, --version                            Version"
-  const char * help() const { return count_args_HELP; }
-
-#define count_args_HIDDEN "Hidden options:\n" \
-  " -O                                       Output is the file name (not a prefix) (false)\n" \
-  "     --both                               Write list and raw database (false)\n" \
-  " -w, --no-write                           Don't write database (false)\n" \
-  " -u, --measure                            Write usage statistics (false)\n" \
-  "     --buffers=uint64                     Number of buffers per thread\n" \
-  "     --buffer-size=uint64                 Size of buffers (8192)\n" \
-  "     --out-buffer-size=uint64             Size of output buffer per thread (20000000)\n" \
-  "     --lock                               Lock hash in memory (no swapping) (false)\n" \
-  "     --stream                             Read from stream, not memory map (false)"
-
-  const char * hidden() const { return count_args_HIDDEN; }
-  void print_version(::std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(::std::ostream &os = std::cout) {
-    os << "mer_len_given:" << mer_len_given << " mer_len_arg:" << mer_len_arg << "\n";
-    os << "size_given:" << size_given << " size_arg:" << size_arg << "\n";
-    os << "threads_given:" << threads_given << " threads_arg:" << threads_arg << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "O_flag:" << O_flag << "\n";
-    os << "counter_len_given:" << counter_len_given << " counter_len_arg:" << counter_len_arg << "\n";
-    os << "out_counter_len_given:" << out_counter_len_given << " out_counter_len_arg:" << out_counter_len_arg << "\n";
-    os << "both_strands_flag:" << both_strands_flag << "\n";
-    os << "reprobes_given:" << reprobes_given << " reprobes_arg:" << reprobes_arg << "\n";
-    os << "raw_flag:" << raw_flag << "\n";
-    os << "both_flag:" << both_flag << "\n";
-    os << "quake_flag:" << quake_flag << "\n";
-    os << "quality_start_given:" << quality_start_given << " quality_start_arg:" << quality_start_arg << "\n";
-    os << "min_quality_given:" << min_quality_given << " min_quality_arg:" << min_quality_arg << "\n";
-    os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
-    os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
-    os << "invalid_char_given:" << invalid_char_given << " invalid_char_arg:" << invalid_char_arg << "|" << invalid_char::strs[invalid_char_arg] << "\n";
-    os << "matrix_given:" << matrix_given << " matrix_arg:" << matrix_arg << "\n";
-    os << "timing_given:" << timing_given << " timing_arg:" << timing_arg << "\n";
-    os << "stats_given:" << stats_given << " stats_arg:" << stats_arg << "\n";
-    os << "no_write_flag:" << no_write_flag << "\n";
-    os << "measure_flag:" << measure_flag << "\n";
-    os << "buffers_given:" << buffers_given << " buffers_arg:" << buffers_arg << "\n";
-    os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
-    os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
-    os << "lock_flag:" << lock_flag << "\n";
-    os << "stream_flag:" << stream_flag << "\n";
-    os << "file_arg:" << vec_str(file_arg) << "\n";
-  }
-};
-const char* const count_args::invalid_char::strs[4] = { "warn", "ignore", "error", (const char*)0 };
-#endif // __COUNT_ARGS_HPP__"
diff --git a/jellyfish/counter.hpp b/jellyfish/counter.hpp
deleted file mode 100644
index 83f0c56..0000000
--- a/jellyfish/counter.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/atomic_gcc.hpp>
-
-class counter_t {
-  volatile uint64_t     count;
-
-public:
-  counter_t() : count(0) {}
-
-  inline uint64_t operator++(int) {
-    return atomic::gcc::fetch_add(&count, (uint64_t)1);
-  }
-  inline uint64_t inc(uint64_t x) {
-    return atomic::gcc::fetch_add(&count, x);
-  }
-  inline uint64_t get() const { return count; }
-
-  class block {
-    counter_t *c;
-    uint64_t   bs;
-    uint64_t   base, i;
-
-    //    friend counter_t;
-  public:
-    block(counter_t *_c, uint64_t _bs) : c(_c), bs(_bs), base(0), i(bs) {}
-
-  public:
-    inline uint64_t operator++(int) {
-      if(i >= bs) {
-        i = 0;
-        base = c->inc(bs);
-      }
-      return base + i++;
-    }
-  };
-  block get_block(uint64_t bs = 100) { return block(this, bs); }
-};
diff --git a/jellyfish/dbg.cc b/jellyfish/dbg.cc
index 4652939..b953224 100644
--- a/jellyfish/dbg.cc
+++ b/jellyfish/dbg.cc
@@ -16,14 +16,7 @@
 
 #include <jellyfish/dbg.hpp>
 #include <jellyfish/time.hpp>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_SYS_SYSCALL_H
 #include <sys/syscall.h>
-#endif
 
 namespace dbg {
   pthread_mutex_t print_t::_lock      = PTHREAD_MUTEX_INITIALIZER;
diff --git a/jellyfish/direct_indexing_array.hpp b/jellyfish/direct_indexing_array.hpp
deleted file mode 100644
index d6b4e9c..0000000
--- a/jellyfish/direct_indexing_array.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DIRECT_INDEXING_ARRAY_HPP__
-#define __JELLYFISH_DIRECT_INDEXING_ARRAY_HPP__
-
-namespace jellyfish {
-  namespace direct_indexing {
-    template<typename key_t, typename val_t, typename atomic_t, typename mem_block_t>
-    class array {
-    public:
-      typedef typename val_t::bits_t bits_t;
-
-      uint_t       key_len;
-      size_t       size;
-      mem_block_t  mem_block;
-      bits_t      *data;
-      atomic_t     atomic;
-      
-
-    public:
-      explicit array(uint_t _key_len) :
-        key_len(_key_len), size(((size_t)1) << key_len),
-        mem_block(size * sizeof(bits_t)),
-        data((bits_t *)mem_block.get_ptr())
-      { }
-
-      array(char *map, uint_t _key_len) :
-        key_len(_key_len), size(((size_t)1) << key_len),
-        data((bits_t *)map)
-      { }
-
-      size_t get_size() const { return size; }
-      uint_t get_key_len() const { return key_len; }
-      uint_t get_val_len() const { return sizeof(bits_t); }
-      size_t get_max_reprobe_offset() const { return 1; }
-
-      void write_ary_header(std::ostream *out) const {
-        SquareBinaryMatrix id(key_len);
-        id.init_identity();
-        id.dump(out);
-        id.dump(out);
-      }
-      void write_raw(std::ostream *out) const {}
-
-      template<typename add_t>
-      bool add(key_t key, const add_t &val, val_t *_oval = 0) {
-        bits_t oval = data[key];
-        val_t nval = val_t(oval) + val;
-
-        while(true) {
-          bits_t noval = atomic.cas(&data[key], oval, nval.bits());
-          if(noval == oval) {
-            if(_oval)
-              *_oval = val_t(oval);
-            return true;
-          }
-          oval = noval;
-          nval = val_t(oval) + val;
-        }
-        return true;
-      }
-
-      bool get_val(key_t key, val_t &val, bool full = true) const {
-        val = data[key];
-        return true;
-      }
-
-      class iterator {
-        const array *ary;
-        size_t       start_id;
-        size_t       nid;
-        size_t       end_id;
-        key_t        key;
-        bits_t       val;
-        size_t       id;
-
-      public:
-        iterator(const array *_ary, size_t start, size_t end) :
-          ary(_ary), start_id(start), nid(start),
-          end_id(end > ary->get_size() ? ary->get_size() : end)
-        {}
-
-        void get_string(char *out) const {
-          parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
-        }
-        uint64_t get_hash() const { return key; }
-        uint64_t get_pos() const { return key; }
-        uint64_t get_start() const { return start_id; }
-        uint64_t get_end() const { return end_id; }
-        key_t    get_key() const { return key; }
-        val_t    get_val() const { return val_t(val); }
-        size_t   get_id() const { return id; }
-        
-        bool next() {
-          while((id = nid) < end_id) {
-            nid++;
-            val = ary->data[id];
-            if(val) {
-              key = id;
-              return true;
-            }
-          }
-          return false;
-        }
-      };
-      friend class iterator;
-      iterator iterator_all() const { return iterator(this, 0, get_size()); }
-      iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
-        std::pair<size_t, size_t> res = slice(slice_number, number_of_slice, get_size());
-        return iterator(this, res.first, res.second);
-      }
-
-      /**
-       * Zero out entries in [start, start+length).
-       */
-      void zero(size_t start, size_t length) {
-        if(start >= size)
-          return;
-        if(start + length > size)
-          length = size - start;
-        memset(data + start, '\0', length * sizeof(*data));
-      }
-
-      void write(std::ostream *out, const size_t start, size_t length) const {
-        if(start >= size)
-          return;
-        if(start + length > size)
-          length = size - start;
-        out->write((char *)(data + start), length * sizeof(*data));
-      }
-
-      val_t operator[](key_t key) const { return val_t(data[key]); }
-    };
-  }
-}
-
-#endif
diff --git a/jellyfish/direct_sorted_dumper.hpp b/jellyfish/direct_sorted_dumper.hpp
deleted file mode 100644
index 163bd7f..0000000
--- a/jellyfish/direct_sorted_dumper.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <limits>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-
-namespace jellyfish {
-  template<typename storage_t, typename atomic_t>
-  class direct_sorted_dumper : public dumper_t, public thread_exec {
-    typedef typename storage_t::iterator               iterator;
-    typedef typename compacted_hash::writer<storage_t> writer_t;
-    typedef token_ring<locks::pthread::cond>           token_ring_t;
-
-    struct thread_info_t {
-      writer_t             writer;
-      token_ring_t::token *token;
-    };
-
-    uint_t                threads;
-    const char           *file_prefix;
-    size_t                buffer_size;
-    uint_t                klen, vlen;
-    uint_t                key_len, val_len;
-    size_t                record_len, nb_records;
-    storage_t            *ary;
-    int                   file_index;
-    token_ring_t          tr;
-    uint64_t              lower_count, upper_count;
-    struct thread_info_t *thread_info;
-    uint64_t volatile     unique, distinct, total, max_count;
-    std::ofstream        *out;
-    bool                  one_file;
-
-  public:
-    direct_sorted_dumper(uint_t _threads, const char *_file_prefix, 
-                         size_t _buffer_size, uint_t _vlen, storage_t *_ary) :
-      threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
-      klen(_ary->get_key_len()), vlen(_vlen), ary(_ary),
-      tr() , lower_count(0), upper_count(std::numeric_limits<uint64_t>::max()),
-      one_file(false)
-    {
-      key_len    = bits_to_bytes(klen);
-      val_len    = bits_to_bytes(vlen);
-      record_len = key_len + val_len;
-      nb_records = _buffer_size / record_len;
-      thread_info = new struct thread_info_t[threads];
-      for(uint_t i = 0; i < threads; i++) {
-        thread_info[i].writer.initialize(nb_records, klen, vlen, ary);
-        thread_info[i].token = tr.new_token();
-      }
-      unique = distinct = total = max_count = 0;
-    }
-
-    ~direct_sorted_dumper() {
-      if(thread_info)
-        delete[] thread_info;
-    }
-
-    bool get_one_file() const { return one_file; }
-    void set_one_file(bool nv) { one_file = nv; }
-
-    void set_lower_count(uint64_t l) { lower_count = l; }
-    void set_upper_count(uint64_t u) { upper_count = u; }
-
-    virtual void start(int i) { dump_to_file(i); }
-    void dump_to_file(int i);
-
-    virtual void _dump();
-    void update_stats() {
-      thread_info[0].writer.update_stats_with(out, unique, distinct, total, 
-                                              max_count);
-    }
-  };
-
-  template<typename storage_t, typename atomic_t>
-  void direct_sorted_dumper<storage_t,atomic_t>::_dump() {
-    std::ofstream _out;
-    if(one_file) {
-      _out.open(file_prefix);
-    } else {
-      open_next_file(file_prefix, &file_index, _out);
-    }
-    out = &_out;
-    unique = distinct = total = max_count = 0;
-    tr.reset();
-    thread_info[0].writer.write_header(out);
-    exec_join(threads);
-    update_stats();
-    _out.close();
-  }
-
-  template<typename storage_t, typename atomic_t>
-  void direct_sorted_dumper<storage_t,atomic_t>::dump_to_file(int id) {
-    size_t                i;
-    struct thread_info_t *my_info = &thread_info[id];
-    atomic_t              atomic;
-      
-    my_info->writer.reset_counters();
-
-    for(i = id; i * nb_records < ary->get_size(); i += threads) {
-      iterator it(ary, i * nb_records, (i + 1) * nb_records);
-      while(it.next())
-        if(it.get_val().bits() >= lower_count && it.get_val().bits() <= upper_count)
-          my_info->writer.append(it.get_key(), it.get_val().bits());
-
-      my_info->token->wait();
-      my_info->writer.dump(out);
-      my_info->token->pass();
-      ary->zero(i * nb_records, nb_records);
-    }
-    atomic.add_fetch(&unique, my_info->writer.get_unique());
-    atomic.add_fetch(&distinct, my_info->writer.get_distinct());
-    atomic.add_fetch(&total, my_info->writer.get_total());
-    atomic.set_to_max(&max_count, my_info->writer.get_max_count());
-  }
-}
diff --git a/jellyfish/divisor.hpp b/jellyfish/divisor.hpp
deleted file mode 100644
index 9ef45cb..0000000
--- a/jellyfish/divisor.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DIVISOR_HPP__
-#define __JELLYFISH_DIVISOR_HPP__
-
-#include <stdint.h>
-#include <jellyfish/misc.hpp>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-namespace jellyfish {
-  class divisor64 {
-    const uint64_t d_;
-#ifdef HAVE_INT128
-    const uint16_t p_;
-    const unsigned __int128 m_;
-#endif
-    
-  public:
-    explicit divisor64(uint64_t d) : 
-      d_(d)
-#ifdef HAVE_INT128
-      , p_(ceilLog2(d_)),
-      m_((div_ceil((unsigned __int128)1 << (64 + p_), (unsigned __int128)d_)) & (uint64_t)-1)
-#endif
-    { }
-
-    divisor64() :
-      d_(0)
-#ifdef HAVE_INT128
-      , p_(0), m_(0)
-#endif
-    { }
-
-    explicit divisor64(const divisor64& rhs) :
-      d_(rhs.d_)
-#ifdef HAVE_INT128
-      , p_(rhs.p_),
-      m_(rhs.m_)
-#endif
-    { }
-
-    inline uint64_t divide(const uint64_t n) const {
-#ifdef HAVE_INT128
-      switch(m_) {
-      case 0:
-        return n >> p_;
-      default:
-        const unsigned __int128 n_ = (unsigned __int128)n;
-        return (n_ + ((n_ * m_) >> 64)) >> p_;
-      }
-#else
-      return n / d_;
-#endif
-    }
-
-    inline uint64_t remainder(uint64_t n) const {
-#ifdef HAVE_INT128
-      switch(m_) {
-      case 0:
-        return n & (((uint64_t)1 << p_) - 1);
-      default:
-        return n - divide(n) * d_;
-      }
-#else
-      return n % d_;
-#endif
-    }
-
-    // Euclidian division: d.division(n, q, r) sets q <- n / d and r
-    // <- n % d. This is faster than doing each independently.
-    inline void division(uint64_t n, uint64_t &q, uint64_t &r) const {
-#ifdef HAVE_INT128
-      switch(m_) {
-      case 0:
-        q = n >> p_;
-        r = n & (((uint64_t)1 << p_) - 1);
-        break;
-      default:
-        q = divide(n);
-        r = n - q * d_;
-        break;
-      }
-#else
-      q = n / d_;
-      r = n % d_;
-#endif
-    }
-
-    uint64_t d() const { return d_; }
-    uint64_t p() const { 
-#ifdef HAVE_INT128
-      return p_;
-#else
-      return 0;
-#endif
-    }
-    uint64_t m() const {
-#ifdef HAVE_INT128
-      return m_;
-#else
-      return 0;
-#endif
-    }
-  };
-
-  inline uint64_t operator/(uint64_t n, const divisor64& d) {
-    return d.divide(n);
-  }
-  inline uint64_t operator%(uint64_t n, const divisor64& d) {
-    return d.remainder(n);
-  }
-}
-
-inline std::ostream& operator<<(std::ostream& os, const jellyfish::divisor64& d) {
-  return os << "d:" << d.d() << ",p:" << d.p() << ",m:" << d.m();
-}
-  
-#endif /* __JELLYFISH_DIVISOR_HPP__ */
-  
diff --git a/jellyfish/dna_codes.cc b/jellyfish/dna_codes.cc
deleted file mode 100644
index 85f1f09..0000000
--- a/jellyfish/dna_codes.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <jellyfish/dna_codes.hpp>
-
-#define R -1
-#define I -2
-#define O -3
-#define A 0
-#define C 1
-#define G 2
-#define T 3
-const char jellyfish::dna_codes[256] = {
-  O, O, O, O, O, O, O, O, O, O, I, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, R, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O, 
-  O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O, 
-  O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O, 
-  O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, 
-  O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O
-};
-
diff --git a/jellyfish/dna_codes.hpp b/jellyfish/dna_codes.hpp
deleted file mode 100644
index 80e92cd..0000000
--- a/jellyfish/dna_codes.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __DNA_CODE_HPP__
-#define __DNA_CODE_HPP__
-
-#include <limits>
-#include <jellyfish/misc.hpp>
-
-namespace jellyfish {
-static const uint_t CODE_A       = 0;
-static const uint_t CODE_C       = 0;
-static const uint_t CODE_G       = 0;
-static const uint_t CODE_T       = 0;
-// Non DNA codes have the MSB on
-static const uint_t CODE_RESET   = (uint_t)-1;
-static const uint_t CODE_IGNORE  = (uint_t)-2;
-static const uint_t CODE_COMMENT = (uint_t)-3;
-static const uint_t CODE_NOT_DNA = ((uint_t)1) << (bsizeof(uint_t) - 1);
-extern const char   dna_codes[256];
-};
-
-#endif /* __DNA_CODE_HPP__ */
diff --git a/jellyfish/double_fifo_input.hpp b/jellyfish/double_fifo_input.hpp
deleted file mode 100644
index 19fa2b8..0000000
--- a/jellyfish/double_fifo_input.hpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DOUBLE_FIFO_INPUT__
-#define __JELLYFISH_DOUBLE_FIFO_INPUT__
-
-#include <jellyfish/concurrent_queues.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/time.hpp>
-
-#include <iostream>
-#include <fstream>
-#include <pthread.h>
-#include <assert.h>
-
-namespace jellyfish {
-  /* Double lock free fifo containing elements of type T. 
-   *
-   * The input thread, created by this class, runs the virtual
-   * function 'fill' to fill up tockens from the wq (to be Written
-   * tocken Queue) and append then into the rq (to be Read tocken
-   * Queue).
-   *
-   * next() returns a pointer to a filled tocken. If the queue is
-   * empty, it will sleep some (start with 1/100th +/- 50%, and
-   * exponential back off) to give time for the queue to fill up.
-   */
-  template<typename T>
-  class double_fifo_input {
-    define_error_class(Error);
-    typedef concurrent_queue<T> queue;
-
-    // The only transitions are:
-    // WORKING -> SLEEPING -> WAKENING -> WORKING
-    enum state_t { WORKING, SLEEPING, WAKENING };
-
-    queue                rq, wq;
-    T *                  buckets;
-    const unsigned long  nb_buckets;
-    state_t volatile     state;
-    pthread_t            input_id;
-    locks::pthread::cond full_queue;
-
-    static void *static_input_routine(void *arg);
-    void         input_routine();
-    
-  public:
-    typedef T bucket_t;
-    explicit double_fifo_input(unsigned long _nb_buckets);
-    virtual ~double_fifo_input();
-
-    virtual void fill() = 0;
-    T *next();
-    void release(T *bucket);
-    bool is_closed() { return rq.is_closed(); }
-
-    typedef T *bucket_iterator;
-    bucket_iterator bucket_begin() const { return buckets; }
-    bucket_iterator bucket_end() const { return buckets + nb_buckets; }
-
-  protected:
-    // Get bucket to fill and release.
-    T *write_next();
-    void write_release(T *bucket);
-    void close() { rq.close(); }
-
-  private:
-    // Wake up input thread if it was sleeping. Returns previous
-    // state.
-    state_t input_wake();
-  };
-
-  /****/
-
-  template<typename T>
-  double_fifo_input<T>::double_fifo_input(unsigned long _nb_buckets) :
-    rq(_nb_buckets), wq(_nb_buckets), nb_buckets(_nb_buckets), state(WORKING),
-    input_id(0)
-  {
-    buckets = new T[nb_buckets];
-
-    for(unsigned long i = 0; i < nb_buckets; ++i)
-      wq.enqueue(&buckets[i]);
-
-    if(pthread_create(&input_id, 0, static_input_routine, (void *)this) != 0)
-      eraise(Error) << "Failed creating input thread" << err::no;
-  }
-
-  template<typename T>
-  double_fifo_input<T>::~double_fifo_input() {
-    if(input_id)
-      if(pthread_cancel(input_id)) {
-        void *input_return;
-        pthread_join(input_id, &input_return);
-      }
-    delete [] buckets;
-  }
-
-  template<typename T>
-  void *double_fifo_input<T>::static_input_routine(void *arg) {
-    double_fifo_input *o = (double_fifo_input *)arg;
-    o->input_routine();
-    return 0;
-  }
-
-  template<typename T>
-  void double_fifo_input<T>::input_routine() {
-    state_t prev_state;
-
-    while(!rq.is_closed()) {
-      // The write queue is full or this is the first iteration, sleep
-      // until it become less than some threshold
-      full_queue.lock();
-      prev_state = atomic::gcc::cas(&state, WORKING, SLEEPING);
-      assert(prev_state == WORKING);
-      do {
-        full_queue.wait();
-      } while(state != WAKENING);
-      prev_state = atomic::gcc::cas(&state, WAKENING, WORKING);
-      assert(prev_state == WAKENING);
-      full_queue.unlock();
-
-      fill();
-    }
-  }
-
-  template<typename T>
-  typename double_fifo_input<T>::state_t double_fifo_input<T>::input_wake() {
-    state_t prev_state = atomic::gcc::cas(&state, SLEEPING, WAKENING);
-    assert(prev_state >= WORKING && prev_state <= WAKENING);
-    if(prev_state == SLEEPING) {
-      full_queue.lock();
-      full_queue.signal();
-      full_queue.unlock();
-    }
-    return prev_state;
-  }
-
-  template<typename T>
-  T *double_fifo_input<T>::next() {
-    if(rq.is_low()) // && !rq.is_closed())
-      input_wake();
-  
-    T *res = 0;
-    while(!(res = rq.dequeue())) {
-      if(rq.is_closed())
-        return 0;
-      input_wake();
-      // TODO Should we wait on a lock instead when the input thread is
-      // already in working state (i.e. it is most likely blocked on
-      // some I/O).
-      static struct timespec time_sleep = { 0, 10000000 };
-      nanosleep(&time_sleep, NULL);
-    }
-
-    return res;
-  }
-
-  template<typename T>
-  void double_fifo_input<T>::release(T *bucket) {
-    assert(bucket - buckets >= 0 && (unsigned long)(bucket - buckets) < nb_buckets);
-    wq.enqueue(bucket);
-  }
-
-  template<typename T>
-  T *double_fifo_input<T>::write_next() {
-    return wq.dequeue();
-  }
-
-  template<typename T>
-  void double_fifo_input<T>::write_release(T *bucket) {
-    assert(bucket - buckets >= 0 && (unsigned long)(bucket - buckets) < nb_buckets);
-    rq.enqueue(bucket);
-  }
-}
-
-#endif
diff --git a/jellyfish/dump_fastq_main.cc b/jellyfish/dump_fastq_main.cc
deleted file mode 100644
index c8b31ed..0000000
--- a/jellyfish/dump_fastq_main.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <float.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/dump_fastq_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-int dump_fastq_main(int argc, char *argv[])
-{
-  dump_fastq_main_args args(argc, argv);
-
-  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
-  if(!out.good())
-    die << "Error opening output file '" << args.output_arg << "'" << err::no;
-
-  fastq_storage_t *hash =
-    raw_fastq_dumper_t::read(args.db_arg);
-  if(args.verbose_flag)
-    std::cerr << 
-      "k-mer length (bases): " << (hash->get_key_len() / 2) << "\n"
-      "entries             : " << hash->get_size() << "\n";
-  
-  float lower_count = args.lower_count_given ? args.lower_count_arg : 0;
-  float upper_count = args.upper_count_given ? args.upper_count_arg : FLT_MAX;
-
-  fastq_storage_t::iterator it = hash->iterator_all();
-  out << std::scientific;
-  if(args.column_flag) {
-    char spacer = args.tab_flag ? '\t' : ' ';
-    while(it.next()) {
-      float val = it.get_val().to_float();
-      if(val < lower_count || val > upper_count)
-        continue;
-      out << it.get_dna_str() << spacer << val << "\n";
-    }
-  } else {
-    while(it.next()) {
-      float val = it.get_val().to_float();
-      if(val < lower_count || val > upper_count)
-        continue;
-      out << ">" << val << "\n" << it.get_dna_str() << "\n";
-    }
-  }
-  out.close();
-
-  return 0;
-}
diff --git a/jellyfish/dump_fastq_main_cmdline.hpp b/jellyfish/dump_fastq_main_cmdline.hpp
deleted file mode 100644
index 6dd8d71..0000000
--- a/jellyfish/dump_fastq_main_cmdline.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __DUMP_FASTQ_MAIN_ARGS_HPP__
-#define __DUMP_FASTQ_MAIN_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class dump_fastq_main_args {
-public:
-  bool                           column_flag;
-  bool                           tab_flag;
-  double                         lower_count_arg;
-  bool                           lower_count_given;
-  double                         upper_count_arg;
-  bool                           upper_count_given;
-  bool                           verbose_flag;
-  const char *                   output_arg;
-  bool                           output_given;
-  yaggo::string                  db_arg;
-
-  enum {
-    USAGE_OPT = 1000
-  };
-
-  dump_fastq_main_args() : 
-    column_flag(false),
-    tab_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    verbose_flag(false),
-    output_arg(""), output_given(false)
-  { }
-
-  dump_fastq_main_args(int argc, char* argv[]) :
-    column_flag(false),
-    tab_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    verbose_flag(false),
-    output_arg(""), output_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"column", 0, 0, 'c'},
-      {"tab", 0, 0, 't'},
-      {"lower-count", 1, 0, 'L'},
-      {"upper-count", 1, 0, 'U'},
-      {"verbose", 0, 0, 'v'},
-      {"output", 1, 0, 'o'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVctL:U:vo:";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 'c':
-        column_flag = true;
-        break;
-      case 't':
-        tab_flag = true;
-        break;
-      case 'L':
-        lower_count_given = true;
-        lower_count_arg = yaggo::conv_double((const char *)optarg, err, false);
-        CHECK_ERR(double_t, optarg, "-L, --lower-count=double")
-        break;
-      case 'U':
-        upper_count_given = true;
-        upper_count_arg = yaggo::conv_double((const char *)optarg, err, false);
-        CHECK_ERR(double_t, optarg, "-U, --upper-count=double")
-        break;
-      case 'v':
-        verbose_flag = true;
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = yaggo::string(argv[optind]);
-    ++optind;
-  }
-
-#define dump_fastq_main_args_USAGE "Usage: jellyfish qdump [options] db:path"
-  const char * usage() const { return dump_fastq_main_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define dump_fastq_main_args_HELP "Dump k-mer from a qmer database\n\nBy default, dump in a fasta format where the header is the count and\n" \
-  "the sequence is the sequence of the k-mer. The column format is a 2\n" \
-  "column output: k-mer count.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -c, --column                             Column format (false)\n" \
-  " -t, --tab                                Tab separator (false)\n" \
-  " -L, --lower-count=double                 Don't output k-mer with count < lower-count\n" \
-  " -U, --upper-count=double                 Don't output k-mer with count > upper-count\n" \
-  " -v, --verbose                            Be verbose (false)\n" \
-  " -o, --output=string                      Output file\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return dump_fastq_main_args_HELP; }
-#define dump_fastq_main_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return dump_fastq_main_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "column_flag:" << column_flag << "\n";
-    os << "tab_flag:" << tab_flag << "\n";
-    os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
-    os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
-    os << "verbose_flag:" << verbose_flag << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __DUMP_FASTQ_MAIN_ARGS_HPP__"
diff --git a/jellyfish/dump_main.cc b/jellyfish/dump_main.cc
deleted file mode 100644
index 187d29d..0000000
--- a/jellyfish/dump_main.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/dump_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-dump_args args; // Command line switches and arguments
-
-template<typename iterator>
-void dump(iterator& it, std::ostream &out,
-          const dump_args &args, uint64_t lower_count, uint64_t upper_count) {
-  if(args.column_flag) {
-    char spacer = args.tab_flag ? '\t' : ' ';
-    while(it.next()) {
-      if(it.get_val() < lower_count || it.get_val() > upper_count)
-        continue;
-      out << it.get_dna_str() << spacer << it.get_val() << "\n";
-    }
-  } else {
-    while(it.next()) {
-      if(it.get_val() < lower_count || it.get_val() > upper_count)
-        continue;
-      out << ">" << it.get_val() << "\n" << it.get_dna_str() << "\n";
-    }
-  }
-}
-
-void dump_mapped_file(mapped_file& dbf, std::ostream& out) {
-  dbf.sequential().will_need();
-  char type[8];
-  memcpy(type, dbf.base(), sizeof(type));
-
-  uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
-  uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
-
-  if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
-    hash_query_t           hash(dbf);
-    hash_query_t::iterator it = hash.iterator_all();
-    dump(it, out, args, lower_count, upper_count);
-  } else if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
-    raw_inv_hash_query_t           hash(dbf);
-    raw_inv_hash_query_t::iterator it = hash.iterator_all();
-    dump(it, out, args, lower_count, upper_count);
-  } else {
-    die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
-  }
-}
-
-int dump_main(int argc, char *argv[])
-{
-  args.parse(argc, argv);
-
-  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
-  if(!out.good())
-    die << "Error opening output file '" << args.output_arg << "'";
-
-  bool dumped = false;
-  try {
-    mapped_file dbf(args.db_arg.c_str());
-    dump_mapped_file(dbf, out);
-    dumped = true;
-  } catch(mapped_file::ErrorMMap) {
-    dumped = false;
-  }
-
-  if(!dumped) { // Memory map failed. Try streaming
-    hash_reader_t hash(args.db_arg.c_str());
-    uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
-    uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
-    dump(hash, out, args, lower_count, upper_count);
-  }
-
-  out.close();
-
-  return 0;
-}
diff --git a/jellyfish/dump_main_cmdline.hpp b/jellyfish/dump_main_cmdline.hpp
deleted file mode 100644
index 8da8b68..0000000
--- a/jellyfish/dump_main_cmdline.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __DUMP_ARGS_HPP__
-#define __DUMP_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class dump_args {
-public:
-  bool                           column_flag;
-  bool                           tab_flag;
-  uint64_t                       lower_count_arg;
-  bool                           lower_count_given;
-  uint64_t                       upper_count_arg;
-  bool                           upper_count_given;
-  const char *                   output_arg;
-  bool                           output_given;
-  yaggo::string                  db_arg;
-
-  enum {
-    USAGE_OPT = 1000
-  };
-
-  dump_args() : 
-    column_flag(false),
-    tab_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    output_arg(""), output_given(false)
-  { }
-
-  dump_args(int argc, char* argv[]) :
-    column_flag(false),
-    tab_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    output_arg(""), output_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"column", 0, 0, 'c'},
-      {"tab", 0, 0, 't'},
-      {"lower-count", 1, 0, 'L'},
-      {"upper-count", 1, 0, 'U'},
-      {"output", 1, 0, 'o'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVctL:U:o:";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 'c':
-        column_flag = true;
-        break;
-      case 't':
-        tab_flag = true;
-        break;
-      case 'L':
-        lower_count_given = true;
-        lower_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
-        break;
-      case 'U':
-        upper_count_given = true;
-        upper_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = yaggo::string(argv[optind]);
-    ++optind;
-  }
-
-#define dump_args_USAGE "Usage: jellyfish dump [options] db:path"
-  const char * usage() const { return dump_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define dump_args_HELP "Dump k-mer counts\n\nBy default, dump in a fasta format where the header is the count and\n" \
-  "the sequence is the sequence of the k-mer. The column format is a 2\n" \
-  "column output: k-mer count.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -c, --column                             Column format (false)\n" \
-  " -t, --tab                                Tab separator (false)\n" \
-  " -L, --lower-count=uint64                 Don't output k-mer with count < lower-count\n" \
-  " -U, --upper-count=uint64                 Don't output k-mer with count > upper-count\n" \
-  " -o, --output=string                      Output file\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return dump_args_HELP; }
-#define dump_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return dump_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "column_flag:" << column_flag << "\n";
-    os << "tab_flag:" << tab_flag << "\n";
-    os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
-    os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __DUMP_ARGS_HPP__"
diff --git a/jellyfish/dumper.hpp b/jellyfish/dumper.hpp
deleted file mode 100644
index 7d2138b..0000000
--- a/jellyfish/dumper.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DUMPER_HPP__
-#define __JELLYFISH_DUMPER_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/time.hpp>
-
-/**
- * A dumper is responsible to dump the hash array to permanent storage
- * and zero out the array.
- **/
-namespace jellyfish {
-  class dumper_t {
-    Time writing_time;
-  public:
-    define_error_class(ErrorWriting);
-
-  protected:
-    void open_next_file(const char *prefix, int *index, std::ofstream &out) {
-      int eindex = atomic::gcc::fetch_add(index, (int)1);
-      std::ostringstream file_path;
-      file_path << prefix << "_" << eindex;
-
-      out.open(file_path.str().c_str());
-      if(out.fail())
-        eraise(ErrorWriting) << "'" << file_path.str() << "': "
-                             << "Can't open file for writing" << err::no;
-    }
-
-  public:
-    dumper_t() : writing_time(::Time::zero) {}
-    void dump() {
-      Time start;
-      _dump();
-      Time end;
-      writing_time += end - start;
-    }
-    virtual void _dump() = 0;
-    Time get_writing_time() const { return writing_time; }
-    virtual ~dumper_t() {};
-  };
-}
-#endif // __DUMPER_HPP__
diff --git a/jellyfish/eLut.h b/jellyfish/eLut.h
deleted file mode 100644
index f028cdb..0000000
--- a/jellyfish/eLut.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// This is an automatically generated file.
-// Do not edit.
-//
-
-{
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,  1024,  2048,  3072,  4096,  5120,  6144,  7168, 
-     8192,  9216, 10240, 11264, 12288, 13312, 14336, 15360, 
-    16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 
-    24576, 25600, 26624, 27648, 28672, 29696,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0, 33792, 34816, 35840, 36864, 37888, 38912, 39936, 
-    40960, 41984, 43008, 44032, 45056, 46080, 47104, 48128, 
-    49152, 50176, 51200, 52224, 53248, 54272, 55296, 56320, 
-    57344, 58368, 59392, 60416, 61440, 62464,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-        0,     0,     0,     0,     0,     0,     0,     0, 
-};
diff --git a/jellyfish/err.hpp b/jellyfish/err.hpp
deleted file mode 100644
index e960aa3..0000000
--- a/jellyfish/err.hpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __ERR_HPP__
-#define __ERR_HPP__
-
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <exception>
-#include <stdexcept>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if HAVE_DECL_STRERROR_R == 0
-#ifdef STRERROR_R_CHAR_P
-extern char* strerror_r(int, char*, size_t);
-#else
-extern int strerror_r(int, char*, size_t);
-#endif
-#endif
-
-namespace err {
-  class code {
-    int _code;
-  public:
-    explicit code(int c) : _code(c) {}
-    int get_code() const { return _code; }
-  };
-
-  class no_t {
-  public:
-    no_t() {}
-    static void write(std::ostream &os, int e) {
-    char  err_str[1024];
-    char* str;
-
-#ifdef STRERROR_R_CHAR_P
-    str = strerror_r(e, err_str, sizeof(err_str));
-    if(!str) { // Should never happen
-      strcpy(err_str, "error");
-    str = err_str;
-    }
-#else
-    int err = strerror_r(e, err_str, sizeof(err_str));
-    if(err)
-      strcpy(err_str, "error");
-      str = err_str;
-#endif
-    os << ": " << str;
-    }
-  };
-  static const no_t no;
-  std::ostream &operator<<(std::ostream &os, const err::no_t &x);
-
-  class substr {
-    const char  *_s;
-    const size_t _l;
-  public:
-    substr(const char *s, size_t len) : _s(s), _l(len) {}
-    friend std::ostream &operator<<(std::ostream &os, const substr &ss);
-  };
-
-  class die_t {
-    int _code;
-    int _errno;
-  public:
-    die_t() : _code(1), _errno(errno) {}
-    explicit die_t(int c) : _code(c), _errno(errno) {}
-    ~die_t() {
-      std::cerr << std::endl;
-      exit(_code);
-    }
-
-    die_t & operator<<(const code &x) {
-      _code = x.get_code();
-      return *this;
-    }
-    die_t & operator<<(const no_t &x) {
-      x.write(std::cerr, _errno);
-      return *this;
-    }
-    die_t & operator<<(const char *a[]) {
-      for(int i = 0; a[i]; i++)
-        std::cerr << (i ? "\n" : "") << a[i];
-      return *this;
-    }
-    die_t & operator<<(const std::exception &e) {
-      std::cerr << e.what();
-      return *this;
-    }
-    template<typename T>
-    die_t & operator<<(const T &x) {
-      std::cerr << x;
-      return *this;
-    }
-  };
-
-  template<typename err_t>
-  class raise_t {
-    int                _errno;
-    std::ostringstream oss;
-  public:
-    raise_t() : _errno(errno) {}
-    ~raise_t() { throw err_t(oss.str()); }
-
-    raise_t & operator<<(const no_t &x) {
-      x.write(oss, _errno);
-      return *this;
-    }
-    template<typename T>
-    raise_t & operator<<(const T &x) {
-      oss << x;
-      return *this;
-    }
-  };
-}
-
-
-#define die if(1) err::die_t()
-#define eraise(e) if(1) err::raise_t<e>()
-#define define_error_class(name)                                        \
-  class name : public std::runtime_error {                              \
-  public: explicit name(const std::string &txt) : std::runtime_error(txt) {} \
-  }
-
-#endif
diff --git a/jellyfish/fastq_dumper.hpp b/jellyfish/fastq_dumper.hpp
deleted file mode 100644
index 1613f17..0000000
--- a/jellyfish/fastq_dumper.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __FASTQ_DUMPER_HPP__
-#define __FASTQ_DUMPER_HPP__
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/mapped_file.hpp>
-
-namespace jellyfish {
-  namespace fastq_hash {
-    define_error_class(ErrorReading);
-    static const char *file_type = "JFFSTQDN";
-    struct header {
-      char     type[8];
-      uint64_t key_len;
-      uint64_t size;
-      uint64_t max_reprobes;
-      uint64_t values_pos;
-
-      header(uint64_t _key_len, uint64_t _size, uint64_t _max_reprobes, 
-             uint64_t _values_pos) : 
-        key_len(_key_len), size(_size), max_reprobes(_max_reprobes), 
-        values_pos(_values_pos)
-      {
-        memcpy(&type, file_type, sizeof(type));
-      }
-
-      explicit header(const char *ptr) {
-        if(memcmp(ptr, file_type, sizeof(type)))
-          eraise(ErrorReading) << "Bad file type '" << err::substr(ptr, sizeof(type))
-                               << "', expected '" << err::substr(file_type, sizeof(type)) << "'";
-        memcpy((void *)this, ptr, sizeof(struct header));
-      }
-    };
-
-    template<typename storage_t>
-    class raw_dumper : public dumper_t {
-      const uint_t      threads;
-      const std::string file_prefix;
-      storage_t *const  ary;
-      int               file_index;
-
-    public:
-      raw_dumper(uint_t _threads, const char *_file_prefix, size_t chunk_size,
-                 storage_t *_ary) :
-        threads(_threads), file_prefix(_file_prefix),
-        ary(_ary), file_index(0) {}
-
-      virtual void _dump();
-
-      static storage_t * read(const mapped_file &file);
-      static storage_t * read(const std::string &file);
-      static storage_t * read(const char *file);
-    };
-
-    template<typename storage_t>
-    void raw_dumper<storage_t>::_dump() {
-      std::ofstream _out;
-      open_next_file(file_prefix.c_str(), &file_index, _out);
-
-      // TODO: the zeroing out of the hash is not parallelized.
-
-      // Skip header
-      _out.seekp(sizeof(struct header));
-      // Write matrices
-      ary->write_matrices(&_out);
-      // Write key set
-      ary->write_keys_blocks(&_out, 0, ary->get_size());
-      std::streampos pos = _out.tellp();
-      ary->zero_keys(0, ary->get_size());
-      // Write values array
-      ary->write_values(&_out, 0, ary->get_size());
-      ary->zero_values(0, ary->get_size());
-      // Update header      
-      _out.seekp(0);
-      struct header header(ary->get_key_len(), ary->get_size(),
-                           ary->get_max_reprobe(), pos);
-      _out.write((char *)&header, sizeof(header));
-      _out.close();
-    }
-    
-    template<typename storage_t>
-    storage_t * raw_dumper<storage_t>::read(const std::string &file) {
-      mapped_file mf(file.c_str());
-      return read(mf);
-    }
-
-    template<typename storage_t>
-    storage_t * raw_dumper<storage_t>::read(const char *file) {
-      mapped_file mf(file);
-      return read(mf);
-    }
-
-    template<typename storage_t>
-    storage_t * raw_dumper<storage_t>::read(const mapped_file &mf) {
-      if(mf.length() < sizeof(struct header))
-        eraise(ErrorReading) << "File '" << mf.path() 
-                             << "' too short. Should be at least '" 
-                            << sizeof(struct header) << "' bytes";
-
-      struct header header(mf.base());
-      size_t off = sizeof(header);
-      SquareBinaryMatrix hash_matrix, hash_inv_matrix;
-      off += hash_matrix.read(mf.base() + off);
-      off += hash_inv_matrix.read(mf.base() + off);
-      return new storage_t(mf.base() + off,
-                           mf.base() + header.values_pos,
-                           header.size, header.key_len, header.max_reprobes,
-                           jellyfish::quadratic_reprobes, hash_matrix,
-                           hash_inv_matrix);
-    }
-  }
-}
-
-#endif
diff --git a/jellyfish/file_parser.cc b/jellyfish/file_parser.cc
deleted file mode 100644
index e374220..0000000
--- a/jellyfish/file_parser.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/time.hpp>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <assert.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-int jellyfish::file_parser::file_peek(const char *path, char *peek) {
-  int fd = open(path, O_RDONLY);
-  if(fd == -1)
-    eraise(FileParserError) << "Error opening file '" 
-                            << path << "'" << err::no;
-      
-  if(read(fd, peek, 1) <= 0)
-    eraise(FileParserError) << "Empty input file '" << path << "'" << err::no;
-  
-  return fd;
-}
-
-jellyfish::file_parser::file_parser(int fd, const char *path, 
-                                    const char *str, size_t len, char pbase) : 
-  _fd(fd), _base(pbase), _pbase(pbase) {
-  
-  struct stat stat_buf;
-  if(fstat(fd, &stat_buf) == -1)
-    eraise(FileParserError) << "Can't fstat '" << path << "'" << err::no;
-  _size       = stat_buf.st_size;
-  if(_do_mmap) {
-    _buffer     = (char *)mmap(0, _size , PROT_READ, MAP_PRIVATE, fd, 0);
-    _is_mmapped = _buffer != MAP_FAILED;
-  } else {
-    _is_mmapped  = false;
-  }
-  if(_is_mmapped) {
-    _end_buffer = _buffer + _size;
-    _data       = _buffer;
-    _end_data   = _end_buffer;
-    close(_fd);
-  } else {
-    if(_force_mmap)
-      eraise(FileParserError) << "Cannot mmap file '" << path 
-                              << "' as required";
-    _buffer     = new char[_buff_size];
-    _end_buffer = _buffer + _buff_size;
-    _data       = _end_data = _buffer;
-    // What if len > _buff_size!!!
-    if(str && len) {
-      memcpy(_buffer, str, len);
-      _end_data   = _buffer + len;
-    }        
-  }
-}
-
-jellyfish::file_parser::~file_parser() {
-  if(_is_mmapped) {
-    munmap(_buffer, _size);
-  } else {
-    delete[] _buffer;
-    close(_fd);
-  }
-}
-
-bool jellyfish::file_parser::read_next_buffer() {
-  if(_is_mmapped)
-    return false;
-  ssize_t gcount = read(_fd, _buffer, _buff_size);
-  if(gcount <= 0)
-    return false;
-  _data     = _buffer;
-  _end_data = _buffer + gcount;
-
-  return true;
-}
-
-bool jellyfish::file_parser::_do_mmap = true;
-bool jellyfish::file_parser::_force_mmap = false;
-
diff --git a/jellyfish/file_parser.hpp b/jellyfish/file_parser.hpp
deleted file mode 100644
index a6cdd37..0000000
--- a/jellyfish/file_parser.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FILE_PARSER_HPP__
-#define __JELLYFISH_FILE_PARSER_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <unistd.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
-  class file_parser {
-    int         _fd;
-    int         _base, _pbase;
-    char       *_buffer;
-    const char *_end_buffer;
-    const char *_data;
-    const char *_end_data;
-    size_t      _size;
-    bool        _is_mmapped;
-
-    static bool _do_mmap;
-    static bool _force_mmap;
-
-  protected:
-    define_error_class(FileParserError);
-    // Get next character in "stream"
-    inline int sbumpc() {
-      _pbase = _base;
-      if(_data >= _end_data)
-        if(!read_next_buffer())
-          return _base = _eof;
-      return (_base = *_data++);
-    }
-    int speekc() {
-      if(_data >= _end_data)
-        if(!read_next_buffer())
-          return _eof;
-      return *_data;
-    }
-
-
-  public:
-    static const size_t _buff_size = 1024 * 1024;
-    static const int    _eof       = -1;
-
-    // [str, str+len) is content on initial buffer
-    file_parser(int fd, const char *path, const char *str, size_t len,
-                char pbase = '\n');
-    ~file_parser();
-
-    static bool do_mmap() { return _do_mmap; };
-    static bool do_mmap(bool new_value) { bool oval = _do_mmap; _do_mmap = new_value; return oval; }
-    // throw an error if mmap fails
-    static bool force_mmap();
-    static bool force_mmap(bool new_value);
-    static int file_peek(const char *path, char *peek);
-
-    // current base and previous base
-    int base() const { return _base; }
-    int pbase() const { return _pbase; }
-    bool eof() const { return _base == _eof; }
-
-    // ptr to base. Valid only for mmaped files
-    const char *ptr() const { return _data; }
-    const char *base_ptr() const { return _data - 1; }
-    const char *pbase_ptr() const { return _data; }
-
-  private:
-    // Buffers next chunk of data. Returns _eof if at end of file or next character
-    bool read_next_buffer();
-  };
-}
-
-#endif
diff --git a/jellyfish/floats.cc b/jellyfish/floats.cc
deleted file mode 100644
index 2c1b5cd..0000000
--- a/jellyfish/floats.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/floats.hpp>
-
-namespace jellyfish {
-  std::ostream &operator<<(std::ostream &os, const Float &f) {
-    return os << f.v.fv;
-  }
-}
diff --git a/jellyfish/floats.hpp b/jellyfish/floats.hpp
deleted file mode 100644
index 06042c2..0000000
--- a/jellyfish/floats.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FLOATS_HPP__
-#define __JELLYFISH_FLOATS_HPP__
-
-#include <stdint.h>
-#include <iostream>
-#ifdef HALF_FLOATS
-#include <jellyfish/half.h>
-#endif
-
-namespace jellyfish {
-  class Float {
-  public:
-#ifdef HALF_FLOATS
-    typedef uint16_t bits_t;
-    typedef half     float_t;
-#else
-    typedef uint32_t bits_t;
-    typedef float    float_t;
-#endif
-
-  private:
-    union float_int {
-      float_t      fv;
-      bits_t     iv;
-      explicit float_int(float_t v) : fv(v) {}
-      explicit float_int(bits_t v) : iv(v) {}
-    };
-    float_int v;
-
-  public:
-    Float() : v(0.0f) {}
-    explicit Float(int _v) : v((bits_t)_v) {}
-    explicit Float(float_t _v) : v(_v) {}
-    explicit Float(bits_t _v) : v(_v) {}
-
-    // static const Float zero;
-    // static const Float one;
-
-    const Float operator+(const Float &y) const {
-      return Float(v.fv + y.v.fv);
-    }
-    const Float operator+(const float& y) const {
-      return Float(v.fv + y);
-    }
-
-    bits_t bits() const { return v.iv; };
-    float_t to_float() const { return v.fv; };
-
-    // Should we use the floating point ==?
-    bool operator==(Float o) { return v.iv == o.v.iv; }
-    friend std::ostream &operator<<(std::ostream &os, const Float &f);
-  };
-}
-
-#endif
diff --git a/jellyfish/generate_sequence.cc b/jellyfish/generate_sequence.cc
index 47630c9..c1f4eb9 100644
--- a/jellyfish/generate_sequence.cc
+++ b/jellyfish/generate_sequence.cc
@@ -21,13 +21,14 @@
 
 #include <jellyfish/err.hpp>
 #include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
 #include <jellyfish/randomc.h>
 #include <jellyfish/generate_sequence_cmdline.hpp>
 
+namespace err = jellyfish::err;
+
 class rDNAg_t {
 public:
-  explicit rDNAg_t(CRandomMersenne *_rng) : rng(_rng), i(15), buff(0) {}
+  rDNAg_t(CRandomMersenne *_rng) : rng(_rng), i(15), buff(0) {}
   char letter() {
     i = (i+1) % 16;
     if(i == 0)
@@ -47,6 +48,43 @@ private:
 };
 const char rDNAg_t::letters[4] = { 'A', 'C', 'G', 'T' };
 
+// Output matrix
+  // Generate matrices
+  // uint64_t lines[64];
+  // for(unsigned int j = 0; j < args.mer_arg.size(); j++) {
+  //   if(args.mer_arg[j] <= 0 || args.mer_arg[j] > 31)
+  //     die << "Mer size (" << args.mer_arg[j] << ") must be between 1 and 31.";
+  //   int matrix_size = args.mer_arg[j] << 1;
+  //   SquareBinaryMatrix mat(matrix_size), inv(matrix_size);
+  //   while(true) {
+  //     for(int i = 0; i < matrix_size; i++)
+  //       lines[i] = (uint64_t)rng.BRandom() | ((uint64_t)rng.BRandom() << 32);
+  //     mat = SquareBinaryMatrix(lines, matrix_size);
+  //     try {
+  //       inv = mat.inverse();
+  //       break;
+  //     } catch(SquareBinaryMatrix::SingularMatrix &e) {}
+  //   }
+
+  //   char path[4096];
+  //   int len = snprintf(path, sizeof(path), "%s_matrix_%d", args.output_arg,
+  //                      args.mer_arg[j]);
+  //   if(len < 0)
+  //     die << "Error creating the matrix file '" << path << "'" << err::no;
+  //   if((unsigned int)len >= sizeof(path))
+  //     die << "Output prefix too long '" << args.output_arg << "'";
+  //   std::ofstream fd(path);
+  //   if(!fd.good())
+  //     die << "Can't open matrix file '" << path << "'" << err::no;
+  //   if(args.verbose_flag)
+  //     std::cout << "Creating matrix file '" << path << "'\n";
+  //   mat.dump(&fd);
+  //   if(!fd.good())
+  //     die << "Error while writing matrix '" << path << "'" << err::no;
+  //   fd.close();
+  // }
+
+
 void create_path(char *path, unsigned int path_size, const char *ext, bool many, int i, const char *output_arg) {
   int len;
   if(many)
@@ -54,112 +92,89 @@ void create_path(char *path, unsigned int path_size, const char *ext, bool many,
   else
     len = snprintf(path, path_size, "%s.%s", output_arg, ext);
   if(len < 0)
-    die << "Error creating the fasta file '" << path << "'" << err::no;
+    die(err::msg() << "Error creating the fasta file '" << path << "': " << err::no);
   if((unsigned int)len >= path_size)
-    die << "Output prefix too long '" << output_arg << "'";
+    die(err::msg() << "Output prefix too long '" << output_arg << "'");
+}
+
+generate_sequence_args args;
+
+void output_fastq(size_t length, const char* path, CRandomMersenne& rng) {
+  rDNAg_t rDNAg(&rng);
+  std::ofstream fd(path);
+  if(!fd.good())
+    die(err::msg() << "Can't open fasta file '" << path << "': " << jellyfish::err::no);
+  if(args.verbose_flag)
+    std::cout << "Creating fastq file '" << path << "'\n";
+
+  size_t        total_len = 0;
+  unsigned long read_id   = 0;
+  while(total_len < length) {
+    fd << "@read_" << (read_id++) << "\n";
+    int base;
+    for(base = 0; base < 70 && total_len < length; base++, total_len++)
+      fd << rDNAg.letter();
+    fd << "\n+\n";
+    for(int j = 0; j < base; j++)
+      fd << rDNAg.qual_Illumina();
+    fd << "\n";
+  }
+  if(!fd.good())
+    die(err::msg() << "Error while writing fasta file '" << path << "': " << jellyfish::err::no);
+  fd.close();
+}
+
+void output_fasta(size_t length, const char* path, CRandomMersenne& rng) {
+  rDNAg_t rDNAg(&rng);
+  std::ofstream fd(path);
+  if(!fd.good())
+    die(err::msg() << "Can't open fasta file '" << path << "': " << jellyfish::err::no);
+  if(args.verbose_flag)
+    std::cout << "Creating fasta file '" << path << "'\n";
+
+  size_t read_length = args.read_length_given ? args.read_length_arg : length;
+  size_t total_len   = 0;
+  size_t read        = 0;
+  long   rid         = 0;
+  fd << ">read" << ++rid << "\n";
+  while(total_len < length) {
+    for(int base = 0; base < 70 && total_len < length && read < read_length;
+        base++) {
+      fd << rDNAg.letter();
+      total_len++;
+      read++;
+    }
+    fd << "\n";
+    if(read >= read_length) {
+      fd << ">read" << ++rid << "\n";
+      read = 0;
+    }
+  }
+  if(!fd.good())
+    die(err::msg() << "Error while writing fasta file '" << path << "': " << jellyfish::err::no);
+  fd.close();
 }
 
 int main(int argc, char *argv[])
 {
-  generate_sequence_args args(argc, argv);
-  
+  args.parse(argc, argv);
+
   if(args.verbose_flag)
     std::cout << "Seed: " << args.seed_arg << "\n";
   CRandomMersenne rng(args.seed_arg);
-  
-  // Generate matrices
-  uint64_t lines[64];
-  for(unsigned int j = 0; j < args.mer_arg.size(); j++) {
-    if(args.mer_arg[j] <= 0 || args.mer_arg[j] > 31)
-      die << "Mer size (" << args.mer_arg[j] << ") must be between 1 and 31.";
-    int matrix_size = args.mer_arg[j] << 1;
-    SquareBinaryMatrix mat(matrix_size), inv(matrix_size);
-    while(true) {
-      for(int i = 0; i < matrix_size; i++)
-        lines[i] = (uint64_t)rng.BRandom() | ((uint64_t)rng.BRandom() << 32);
-      mat = SquareBinaryMatrix(lines, matrix_size);
-      try {
-        inv = mat.inverse();
-        break;
-      } catch(SquareBinaryMatrix::SingularMatrix &e) {}
-    }
-    char path[4096];
-    int len = snprintf(path, sizeof(path), "%s_matrix_%d", args.output_arg, 
-                       args.mer_arg[j]);
-    if(len < 0)
-      die << "Error creating the matrix file '" << path << "'" << err::no;
-    if((unsigned int)len >= sizeof(path))
-      die << "Output prefix too long '" << args.output_arg << "'";
-    std::ofstream fd(path);
-    if(!fd.good())
-      die << "Can't open matrix file '" << path << "'" << err::no;
-    if(args.verbose_flag)
-      std::cout << "Creating matrix file '" << path << "'\n";
-    mat.dump(&fd);
-    if(!fd.good())
-      die << "Error while writing matrix '" << path << "'" << err::no;
-    fd.close();
-  }
-  
+
+
   // Output sequence
-  rDNAg_t rDNAg(&rng);
   char path[4096];
   bool many = args.length_arg.size() > 1;
-  
+
   for(unsigned int i = 0; i < args.length_arg.size(); ++i) {
-    size_t length = args.length_arg[i];
-  
     if(args.fastq_flag) {
       create_path(path, sizeof(path), "fq", many, i, args.output_arg);
-      std::ofstream fd(path);
-      if(!fd.good())
-        die << "Can't open fasta file '" << path << err::no;
-      if(args.verbose_flag)
-        std::cout << "Creating fastq file '" << path << "'\n";
-      size_t total_len = 0;
-      unsigned long read_id = 0;
-      while(total_len < length) {
-        fd << "@read_" << (read_id++) << "\n";
-        int base;
-        for(base = 0; base < 70 && total_len < length; base++, total_len++)
-          fd << rDNAg.letter();
-        fd << "\n+\n";
-        for(int j = 0; j < base; j++)
-          fd << rDNAg.qual_Illumina();
-        fd << "\n";
-      }
-      if(!fd.good())
-        die << "Error while writing fasta file '" << path << err::no;
-      fd.close();
+      output_fastq(args.length_arg[i], path, rng);
     } else {
       create_path(path, sizeof(path), "fa", many, i, args.output_arg);
-      std::ofstream fd(path);
-      if(!fd.good())
-        die << "Can't open fasta file '" << path << err::no;
-      if(args.verbose_flag)
-        std::cout << "Creating fasta file '" << path << "'\n";
-
-      size_t read_length = args.read_length_given ? args.read_length_arg : length;
-      size_t total_len = 0;
-      size_t read = 0;
-      long rid = 0;
-      fd << ">read" << ++rid << "\n";
-      while(total_len < length) {
-        for(int base = 0; base < 70 && total_len < length && read < read_length; 
-            base++) {
-          fd << rDNAg.letter();
-          total_len++;
-          read++;
-        }
-        fd << "\n";
-        if(read >= read_length) {
-          fd << ">read" << ++rid << "\n";
-          read = 0;
-        }
-      }
-      if(!fd.good())
-        die << "Error while writing fasta file '" << path << err::no;
-      fd.close();
+      output_fasta(args.length_arg[i], path, rng);
     }
   }
 
diff --git a/jellyfish/generate_sequence_cmdline.hpp b/jellyfish/generate_sequence_cmdline.hpp
deleted file mode 100644
index 3fd4345..0000000
--- a/jellyfish/generate_sequence_cmdline.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __GENERATE_SEQUENCE_ARGS_HPP__
-#define __GENERATE_SEQUENCE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class generate_sequence_args {
-public:
-  long                           seed_arg;
-  bool                           seed_given;
-  std::vector<uint32_t>          mer_arg;
-  typedef std::vector<uint32_t>::iterator mer_arg_it;
-  typedef std::vector<uint32_t>::const_iterator mer_arg_const_it;
-  bool                           mer_given;
-  const char *                   output_arg;
-  bool                           output_given;
-  bool                           fastq_flag;
-  uint32_t                       read_length_arg;
-  bool                           read_length_given;
-  bool                           verbose_flag;
-  std::vector<uint64_t>          length_arg;
-  typedef std::vector<uint64_t>::iterator length_arg_it;
-  typedef std::vector<uint64_t>::const_iterator length_arg_const_it;
-
-  enum {
-    USAGE_OPT = 1000
-  };
-
-  generate_sequence_args() : 
-    seed_arg(), seed_given(false),
-    mer_arg(), mer_given(false),
-    output_arg("output"), output_given(false),
-    fastq_flag(false),
-    read_length_arg(), read_length_given(false),
-    verbose_flag(false)
-  { }
-
-  generate_sequence_args(int argc, char* argv[]) :
-    seed_arg(), seed_given(false),
-    mer_arg(), mer_given(false),
-    output_arg("output"), output_given(false),
-    fastq_flag(false),
-    read_length_arg(), read_length_given(false),
-    verbose_flag(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"seed", 1, 0, 's'},
-      {"mer", 1, 0, 'm'},
-      {"output", 1, 0, 'o'},
-      {"fastq", 0, 0, 'q'},
-      {"read-length", 1, 0, 'r'},
-      {"verbose", 0, 0, 'v'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVs:m:o:qr:v";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 's':
-        seed_given = true;
-        seed_arg = yaggo::conv_int<long>((const char *)optarg, err, false);
-        CHECK_ERR(long_t, optarg, "-s, --seed=long")
-        break;
-      case 'm':
-        mer_given = true;
-        mer_arg.push_back(yaggo::conv_uint<uint32_t>((const char *)optarg, err, false));
-        CHECK_ERR(uint32_t, optarg, "-m, --mer=uint32")
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      case 'q':
-        fastq_flag = true;
-        break;
-      case 'r':
-        read_length_given = true;
-        read_length_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-r, --read-length=uint32")
-        break;
-      case 'v':
-        verbose_flag = true;
-        break;
-      }
-    }
-
-    // Check that required switches are present
-    if(!seed_given)
-      error("[-s, --seed=long] required switch");
-
-    // Parse arguments
-    if(argc - optind < 1)
-      error("Requires at least 1 argument.");
-    for( ; optind < argc; ++optind) {
-      length_arg.push_back(yaggo::conv_uint<uint64_t>((const char *)argv[optind], err, false));
-      CHECK_ERR(uint64_t, argv[optind], "length")
-    }
-  }
-
-#define generate_sequence_args_USAGE "Usage: generate_sequence [options] length:uint64+"
-  const char * usage() const { return generate_sequence_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define generate_sequence_args_HELP "Generate randome sequence of given lengths.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -s, --seed=long                         *Seed\n" \
-  " -m, --mer=uint32                         Mer length. Generate matrix of size 2*length\n" \
-  " -o, --output=string                      Output prefix (output)\n" \
-  " -q, --fastq                              Generate fastq file (false)\n" \
-  " -r, --read-length=uint32                 Read length for fasta format (default=size of sequence)\n" \
-  " -v, --verbose                            Be verbose (false)\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return generate_sequence_args_HELP; }
-#define generate_sequence_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return generate_sequence_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "seed_given:" << seed_given << " seed_arg:" << seed_arg << "\n";
-    os << "mer_given:" << mer_given << " mer_arg:" << yaggo::vec_str(mer_arg) << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "fastq_flag:" << fastq_flag << "\n";
-    os << "read_length_given:" << read_length_given << " read_length_arg:" << read_length_arg << "\n";
-    os << "verbose_flag:" << verbose_flag << "\n";
-    os << "length_arg:" << yaggo::vec_str(length_arg) << "\n";
-  }
-private:
-};
-
-#endif // __GENERATE_SEQUENCE_ARGS_HPP__"
diff --git a/jellyfish/generate_sequence_cmdline.yaggo b/jellyfish/generate_sequence_cmdline.yaggo
new file mode 100644
index 0000000..94525c7
--- /dev/null
+++ b/jellyfish/generate_sequence_cmdline.yaggo
@@ -0,0 +1,27 @@
+purpose "Generate randome sequence of given lengths."
+package "generate_sequence"
+
+output "generate_sequence_cmdline.hpp"
+name "generate_sequence_args"
+
+option("seed", "s") {
+  description "Seed"
+  long; required }
+option("mer", "m") {
+  description "Mer length. Generate matrix of size 2*length"
+  uint32; multiple }
+option("output", "o") {
+  description "Output prefix"
+  c_string; default "output" }
+option("fastq", "q") {
+  description "Generate fastq file"
+  flag; off }
+option("read-length", "r") {
+  description "Read length for fasta format (default=size of sequence)"
+  uint32 }
+option("verbose", "v") {
+  description "Be verbose"
+  flag; off }
+arg("length") {
+  description "Length of sequence to generate"
+  uint64; multiple; at_least 1 }
diff --git a/jellyfish/half.cpp b/jellyfish/half.cpp
deleted file mode 100644
index 0d566bb..0000000
--- a/jellyfish/half.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
-// Digital Ltd. LLC
-// 
-// 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 Industrial Light & Magic nor the names of
-// its contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission. 
-// 
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-///////////////////////////////////////////////////////////////////////////
-
-// Primary authors:
-//     Florian Kainz <kainz at ilm.com>
-//     Rod Bogart <rgb at ilm.com>
-
-
-//---------------------------------------------------------------------------
-//
-//	class half --
-//	implementation of non-inline members
-//
-//---------------------------------------------------------------------------
-
-#include <assert.h>
-#include <jellyfish/half.h>
-
-// using namespace std;
-
-//-------------------------------------------------------------
-// Lookup tables for half-to-float and float-to-half conversion
-//-------------------------------------------------------------
-
-HALF_EXPORT_CONST half::uif half::_toFloat[1 << 16] =
-#include <jellyfish/toFloat.h>
-HALF_EXPORT_CONST unsigned short half::_eLut[1 << 9] =
-#include <jellyfish/eLut.h>
-
-
-//-----------------------------------------------
-// Overflow handler for float-to-half conversion;
-// generates a hardware floating-point overflow,
-// which may be trapped by the operating system.
-//-----------------------------------------------
-
-float
-half::overflow ()
-{
-    volatile float f = 1e10;
-
-    for (int i = 0; i < 10; i++)	
-	f *= f;				// this will overflow before
-					// the for�loop terminates
-    return f;
-}
-
-
-//-----------------------------------------------------
-// Float-to-half conversion -- general case, including
-// zeroes, denormalized numbers and exponent overflows.
-//-----------------------------------------------------
-
-short
-half::convert (int i)
-{
-    //
-    // Our floating point number, f, is represented by the bit
-    // pattern in integer i.  Disassemble that bit pattern into
-    // the sign, s, the exponent, e, and the significand, m.
-    // Shift s into the position where it will go in in the
-    // resulting half number.
-    // Adjust e, accounting for the different exponent bias
-    // of float and half (127 versus 15).
-    //
-
-    register int s =  (i >> 16) & 0x00008000;
-    register int e = ((i >> 23) & 0x000000ff) - (127 - 15);
-    register int m =   i        & 0x007fffff;
-
-    //
-    // Now reassemble s, e and m into a half:
-    //
-
-    if (e <= 0)
-    {
-	if (e < -10)
-	{
-	    //
-	    // E is less than -10.  The absolute value of f is
-	    // less than HALF_MIN (f may be a small normalized
-	    // float, a denormalized float or a zero).
-	    //
-	    // We convert f to a half zero with the same sign as f.
-	    //
-
-	    return s;
-	}
-
-	//
-	// E is between -10 and 0.  F is a normalized float
-	// whose magnitude is less than HALF_NRM_MIN.
-	//
-	// We convert f to a denormalized half.
-	//
-
-	//
-	// Add an explicit leading 1 to the significand.
-	// 
-
-	m = m | 0x00800000;
-
-	//
-	// Round to m to the nearest (10+e)-bit value (with e between
-	// -10 and 0); in case of a tie, round to the nearest even value.
-	//
-	// Rounding may cause the significand to overflow and make
-	// our number normalized.  Because of the way a half's bits
-	// are laid out, we don't have to treat this case separately;
-	// the code below will handle it correctly.
-	// 
-
-	int t = 14 - e;
-	int a = (1 << (t - 1)) - 1;
-	int b = (m >> t) & 1;
-
-	m = (m + a + b) >> t;
-
-	//
-	// Assemble the half from s, e (zero) and m.
-	//
-
-	return s | m;
-    }
-    else if (e == 0xff - (127 - 15))
-    {
-	if (m == 0)
-	{
-	    //
-	    // F is an infinity; convert f to a half
-	    // infinity with the same sign as f.
-	    //
-
-	    return s | 0x7c00;
-	}
-	else
-	{
-	    //
-	    // F is a NAN; we produce a half NAN that preserves
-	    // the sign bit and the 10 leftmost bits of the
-	    // significand of f, with one exception: If the 10
-	    // leftmost bits are all zero, the NAN would turn 
-	    // into an infinity, so we have to set at least one
-	    // bit in the significand.
-	    //
-
-	    m >>= 13;
-	    return s | 0x7c00 | m | (m == 0);
-	}
-    }
-    else
-    {
-	//
-	// E is greater than zero.  F is a normalized float.
-	// We try to convert f to a normalized half.
-	//
-
-	//
-	// Round to m to the nearest 10-bit value.  In case of
-	// a tie, round to the nearest even value.
-	//
-
-	m = m + 0x00000fff + ((m >> 13) & 1);
-
-	if (m & 0x00800000)
-	{
-	    m =  0;		// overflow in significand,
-	    e += 1;		// adjust exponent
-	}
-
-	//
-	// Handle exponent overflow
-	//
-
-	if (e > 30)
-	{
-	    overflow ();	// Cause a hardware floating point overflow;
-	    return s | 0x7c00;	// if this returns, the half becomes an
-	}   			// infinity with the same sign as f.
-
-	//
-	// Assemble the half from s, e and m.
-	//
-
-	return s | (e << 10) | (m >> 13);
-    }
-}
-
-
-//---------------------
-// Stream I/O operators
-//---------------------
-
-std::ostream &
-operator << (std::ostream &os, half h)
-{
-  os << float (h);
-  return os;
-}
-
-
-std::istream &
-operator >> (std::istream &is, half &h)
-{
-    float f;
-    is >> f;
-    h = half (f);
-    return is;
-}
-
-
-//---------------------------------------
-// Functions to print the bit-layout of
-// floats and halfs, mostly for debugging
-//---------------------------------------
-
-void
-printBits (std::ostream &os, half h)
-{
-    unsigned short b = h.bits();
-
-    for (int i = 15; i >= 0; i--)
-    {
-	os << (((b >> i) & 1)? '1': '0');
-
-	if (i == 15 || i == 10)
-	    os << ' ';
-    }
-}
-
-
-void
-printBits (std::ostream &os, float f)
-{
-    half::uif x;
-    x.f = f;
-
-    for (int i = 31; i >= 0; i--)
-    {
-	os << (((x.i >> i) & 1)? '1': '0');
-
-	if (i == 31 || i == 23)
-	    os << ' ';
-    }
-}
-
-
-void
-printBits (char c[19], half h)
-{
-    unsigned short b = h.bits();
-
-    for (int i = 15, j = 0; i >= 0; i--, j++)
-    {
-	c[j] = (((b >> i) & 1)? '1': '0');
-
-	if (i == 15 || i == 10)
-	    c[++j] = ' ';
-    }
-    
-    c[18] = 0;
-}
-
-
-void
-printBits (char c[35], float f)
-{
-    half::uif x;
-    x.f = f;
-
-    for (int i = 31, j = 0; i >= 0; i--, j++)
-    {
-	c[j] = (((x.i >> i) & 1)? '1': '0');
-
-	if (i == 31 || i == 23)
-	    c[++j] = ' ';
-    }
-
-    c[34] = 0;
-}
diff --git a/jellyfish/half.h b/jellyfish/half.h
deleted file mode 100644
index 2d89200..0000000
--- a/jellyfish/half.h
+++ /dev/null
@@ -1,766 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
-// Digital Ltd. LLC
-// 
-// 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 Industrial Light & Magic nor the names of
-// its contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission. 
-// 
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-///////////////////////////////////////////////////////////////////////////
-
-// Primary authors:
-//     Florian Kainz <kainz at ilm.com>
-//     Rod Bogart <rgb at ilm.com>
-
-//---------------------------------------------------------------------------
-//
-//	half -- a 16-bit floating point number class:
-//
-//	Type half can represent positive and negative numbers whose
-//	magnitude is between roughly 6.1e-5 and 6.5e+4 with a relative
-//	error of 9.8e-4; numbers smaller than 6.1e-5 can be represented
-//	with an absolute error of 6.0e-8.  All integers from -2048 to
-//	+2048 can be represented exactly.
-//
-//	Type half behaves (almost) like the built-in C++ floating point
-//	types.  In arithmetic expressions, half, float and double can be
-//	mixed freely.  Here are a few examples:
-//
-//	    half a (3.5);
-//	    float b (a + sqrt (a));
-//	    a += b;
-//	    b += a;
-//	    b = a + 7;
-//
-//	Conversions from half to float are lossless; all half numbers
-//	are exactly representable as floats.
-//
-//	Conversions from float to half may not preserve a float's value
-//	exactly.  If a float is not representable as a half, then the
-//	float value is rounded to the nearest representable half.  If a
-//	float value is exactly in the middle between the two closest
-//	representable half values, then the float value is rounded to
-//	the closest half whose least significant bit is zero.
-//
-//	Overflows during float-to-half conversions cause arithmetic
-//	exceptions.  An overflow occurs when the float value to be
-//	converted is too large to be represented as a half, or if the
-//	float value is an infinity or a NAN.
-//
-//	The implementation of type half makes the following assumptions
-//	about the implementation of the built-in C++ types:
-//
-//	    float is an IEEE 754 single-precision number
-//	    sizeof (float) == 4
-//	    sizeof (unsigned int) == sizeof (float)
-//	    alignof (unsigned int) == alignof (float)
-//	    sizeof (unsigned short) == 2
-//
-//---------------------------------------------------------------------------
-
-#ifndef _HALF_H_
-#define _HALF_H_
-
-#include <iostream>
-
-#if defined(OPENEXR_DLL)
-    #if defined(HALF_EXPORTS)
-	#define HALF_EXPORT __declspec(dllexport)
-    #else
-	#define HALF_EXPORT __declspec(dllimport)
-    #endif
-    #define HALF_EXPORT_CONST
-#else
-    #define HALF_EXPORT
-    #define HALF_EXPORT_CONST const
-#endif
-
-class HALF_EXPORT half
-{
-  public:
-
-    //-------------
-    // Constructors
-    //-------------
-
-    half ();			// no initialization
-    explicit half (float f);
-
-
-    //--------------------
-    // Conversion to float
-    //--------------------
-
-    operator		float () const;
-
-
-    //------------
-    // Unary minus
-    //------------
-
-    half		operator - () const;
-
-
-    //-----------
-    // Assignment
-    //-----------
-
-    half &		operator = (half  h);
-    half &		operator = (float f);
-
-    half &		operator += (half  h);
-    half &		operator += (float f);
-
-    half &		operator -= (half  h);
-    half &		operator -= (float f);
-
-    half &		operator *= (half  h);
-    half &		operator *= (float f);
-
-    half &		operator /= (half  h);
-    half &		operator /= (float f);
-
-
-    //---------------------------------------------------------
-    // Round to n-bit precision (n should be between 0 and 10).
-    // After rounding, the significand's 10-n least significant
-    // bits will be zero.
-    //---------------------------------------------------------
-
-    half		round (unsigned int n) const;
-
-
-    //--------------------------------------------------------------------
-    // Classification:
-    //
-    //	h.isFinite()		returns true if h is a normalized number,
-    //				a denormalized number or zero
-    //
-    //	h.isNormalized()	returns true if h is a normalized number
-    //
-    //	h.isDenormalized()	returns true if h is a denormalized number
-    //
-    //	h.isZero()		returns true if h is zero
-    //
-    //	h.isNan()		returns true if h is a NAN
-    //
-    //	h.isInfinity()		returns true if h is a positive
-    //				or a negative infinity
-    //
-    //	h.isNegative()		returns true if the sign bit of h
-    //				is set (negative)
-    //--------------------------------------------------------------------
-
-    bool		isFinite () const;
-    bool		isNormalized () const;
-    bool		isDenormalized () const;
-    bool		isZero () const;
-    bool		isNan () const;
-    bool		isInfinity () const;
-    bool		isNegative () const;
-
-
-    //--------------------------------------------
-    // Special values
-    //
-    //	posInf()	returns +infinity
-    //
-    //	negInf()	returns -infinity
-    //
-    //	qNan()		returns a NAN with the bit
-    //			pattern 0111111111111111
-    //
-    //	sNan()		returns a NAN with the bit
-    //			pattern 0111110111111111
-    //--------------------------------------------
-
-    static half		posInf ();
-    static half		negInf ();
-    static half		qNan ();
-    static half		sNan ();
-
-
-    //--------------------------------------
-    // Access to the internal representation
-    //--------------------------------------
-
-    unsigned short	bits () const;
-    void		setBits (unsigned short bits);
-
-
-  public:
-
-    union uif
-    {
-	unsigned int	i;
-	float		f;
-    };
-
-  private:
-
-    static short	convert (int i);
-    static float	overflow ();
-
-    unsigned short	_h;
-
-    static HALF_EXPORT_CONST uif		_toFloat[1 << 16];
-    static HALF_EXPORT_CONST unsigned short _eLut[1 << 9];
-};
-
-//-----------
-// Stream I/O
-//-----------
-
-HALF_EXPORT std::ostream &		operator << (std::ostream &os, half  h);
-HALF_EXPORT std::istream &		operator >> (std::istream &is, half &h);
-
-
-//----------
-// Debugging
-//----------
-
-HALF_EXPORT void			printBits   (std::ostream &os, half  h);
-HALF_EXPORT void			printBits   (std::ostream &os, float f);
-HALF_EXPORT void			printBits   (char  c[19], half  h);
-HALF_EXPORT void			printBits   (char  c[35], float f);
-
-
-//-------------------------------------------------------------------------
-// Limits
-//
-// Visual C++ will complain if HALF_MIN, HALF_NRM_MIN etc. are not float
-// constants, but at least one other compiler (gcc 2.96) produces incorrect
-// results if they are.
-//-------------------------------------------------------------------------
-
-#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
-
-  #define HALF_MIN	5.96046448e-08f	// Smallest positive half
-
-  #define HALF_NRM_MIN	6.10351562e-05f	// Smallest positive normalized half
-
-  #define HALF_MAX	65504.0f	// Largest positive half
-
-  #define HALF_EPSILON	0.00097656f	// Smallest positive e for which
-					// half (1.0 + e) != half (1.0)
-#else
-
-  #define HALF_MIN	5.96046448e-08	// Smallest positive half
-
-  #define HALF_NRM_MIN	6.10351562e-05	// Smallest positive normalized half
-
-  #define HALF_MAX	65504.0		// Largest positive half
-
-  #define HALF_EPSILON	0.00097656	// Smallest positive e for which
-					// half (1.0 + e) != half (1.0)
-#endif
-
-
-#define HALF_MANT_DIG	11		// Number of digits in mantissa
-					// (significand + hidden leading 1)
-
-#define HALF_DIG	2		// Number of base 10 digits that
-					// can be represented without change
-
-#define HALF_RADIX	2		// Base of the exponent
-
-#define HALF_MIN_EXP	-13		// Minimum negative integer such that
-					// HALF_RADIX raised to the power of
-					// one less than that integer is a
-					// normalized half
-
-#define HALF_MAX_EXP	16		// Maximum positive integer such that
-					// HALF_RADIX raised to the power of
-					// one less than that integer is a
-					// normalized half
-
-#define HALF_MIN_10_EXP	-4		// Minimum positive integer such
-					// that 10 raised to that power is
-					// a normalized half
-
-#define HALF_MAX_10_EXP	4		// Maximum positive integer such
-					// that 10 raised to that power is
-					// a normalized half
-
-
-//---------------------------------------------------------------------------
-//
-// Implementation --
-//
-// Representation of a float:
-//
-//	We assume that a float, f, is an IEEE 754 single-precision
-//	floating point number, whose bits are arranged as follows:
-//
-//	    31 (msb)
-//	    | 
-//	    | 30     23
-//	    | |      | 
-//	    | |      | 22                    0 (lsb)
-//	    | |      | |                     |
-//	    X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX
-//
-//	    s e        m
-//
-//	S is the sign-bit, e is the exponent and m is the significand.
-//
-//	If e is between 1 and 254, f is a normalized number:
-//
-//	            s    e-127
-//	    f = (-1)  * 2      * 1.m
-//
-//	If e is 0, and m is not zero, f is a denormalized number:
-//
-//	            s    -126
-//	    f = (-1)  * 2      * 0.m
-//
-//	If e and m are both zero, f is zero:
-//
-//	    f = 0.0
-//
-//	If e is 255, f is an "infinity" or "not a number" (NAN),
-//	depending on whether m is zero or not.
-//
-//	Examples:
-//
-//	    0 00000000 00000000000000000000000 = 0.0
-//	    0 01111110 00000000000000000000000 = 0.5
-//	    0 01111111 00000000000000000000000 = 1.0
-//	    0 10000000 00000000000000000000000 = 2.0
-//	    0 10000000 10000000000000000000000 = 3.0
-//	    1 10000101 11110000010000000000000 = -124.0625
-//	    0 11111111 00000000000000000000000 = +infinity
-//	    1 11111111 00000000000000000000000 = -infinity
-//	    0 11111111 10000000000000000000000 = NAN
-//	    1 11111111 11111111111111111111111 = NAN
-//
-// Representation of a half:
-//
-//	Here is the bit-layout for a half number, h:
-//
-//	    15 (msb)
-//	    | 
-//	    | 14  10
-//	    | |   |
-//	    | |   | 9        0 (lsb)
-//	    | |   | |        |
-//	    X XXXXX XXXXXXXXXX
-//
-//	    s e     m
-//
-//	S is the sign-bit, e is the exponent and m is the significand.
-//
-//	If e is between 1 and 30, h is a normalized number:
-//
-//	            s    e-15
-//	    h = (-1)  * 2     * 1.m
-//
-//	If e is 0, and m is not zero, h is a denormalized number:
-//
-//	            S    -14
-//	    h = (-1)  * 2     * 0.m
-//
-//	If e and m are both zero, h is zero:
-//
-//	    h = 0.0
-//
-//	If e is 31, h is an "infinity" or "not a number" (NAN),
-//	depending on whether m is zero or not.
-//
-//	Examples:
-//
-//	    0 00000 0000000000 = 0.0
-//	    0 01110 0000000000 = 0.5
-//	    0 01111 0000000000 = 1.0
-//	    0 10000 0000000000 = 2.0
-//	    0 10000 1000000000 = 3.0
-//	    1 10101 1111000001 = -124.0625
-//	    0 11111 0000000000 = +infinity
-//	    1 11111 0000000000 = -infinity
-//	    0 11111 1000000000 = NAN
-//	    1 11111 1111111111 = NAN
-//
-// Conversion:
-//
-//	Converting from a float to a half requires some non-trivial bit
-//	manipulations.  In some cases, this makes conversion relatively
-//	slow, but the most common case is accelerated via table lookups.
-//
-//	Converting back from a half to a float is easier because we don't
-//	have to do any rounding.  In addition, there are only 65536
-//	different half numbers; we can convert each of those numbers once
-//	and store the results in a table.  Later, all conversions can be
-//	done using only simple table lookups.
-//
-//---------------------------------------------------------------------------
-
-
-//--------------------
-// Simple constructors
-//--------------------
-
-inline
-half::half () : _h(0)
-{
-    // no initialization
-}
-
-
-//----------------------------
-// Half-from-float constructor
-//----------------------------
-
-inline
-half::half (float f)
-{
-    uif x;
-
-    x.f = f;
-
-    if (f == 0)
-    {
-	//
-	// Common special case - zero.
-	// Preserve the zero's sign bit.
-	//
-
-	_h = (x.i >> 16);
-    }
-    else
-    {
-	//
-	// We extract the combined sign and exponent, e, from our
-	// floating-point number, f.  Then we convert e to the sign
-	// and exponent of the half number via a table lookup.
-	//
-	// For the most common case, where a normalized half is produced,
-	// the table lookup returns a non-zero value; in this case, all
-	// we have to do is round f's significand to 10 bits and combine
-	// the result with e.
-	//
-	// For all other cases (overflow, zeroes, denormalized numbers
-	// resulting from underflow, infinities and NANs), the table
-	// lookup returns zero, and we call a longer, non-inline function
-	// to do the float-to-half conversion.
-	//
-
-	register int e = (x.i >> 23) & 0x000001ff;
-
-	e = _eLut[e];
-
-	if (e)
-	{
-	    //
-	    // Simple case - round the significand, m, to 10
-	    // bits and combine it with the sign and exponent.
-	    //
-
-	    register int m = x.i & 0x007fffff;
-	    _h = e + ((m + 0x00000fff + ((m >> 13) & 1)) >> 13);
-	}
-	else
-	{
-	    //
-	    // Difficult case - call a function.
-	    //
-
-	    _h = convert (x.i);
-	}
-    }
-}
-
-
-//------------------------------------------
-// Half-to-float conversion via table lookup
-//------------------------------------------
-
-inline
-half::operator float () const
-{
-    return _toFloat[_h].f;
-}
-
-
-//-------------------------
-// Round to n-bit precision
-//-------------------------
-
-inline half
-half::round (unsigned int n) const
-{
-    //
-    // Parameter check.
-    //
-
-    if (n >= 10)
-	return *this;
-
-    //
-    // Disassemble h into the sign, s,
-    // and the combined exponent and significand, e.
-    //
-
-    unsigned short s = _h & 0x8000;
-    unsigned short e = _h & 0x7fff;
-
-    //
-    // Round the exponent and significand to the nearest value
-    // where ones occur only in the (10-n) most significant bits.
-    // Note that the exponent adjusts automatically if rounding
-    // up causes the significand to overflow.
-    //
-
-    e >>= 9 - n;
-    e  += e & 1;
-    e <<= 9 - n;
-
-    //
-    // Check for exponent overflow.
-    //
-
-    if (e >= 0x7c00)
-    {
-	//
-	// Overflow occurred -- truncate instead of rounding.
-	//
-
-	e = _h;
-	e >>= 10 - n;
-	e <<= 10 - n;
-    }
-
-    //
-    // Put the original sign bit back.
-    //
-
-    half h;
-    h._h = s | e;
-
-    return h;
-}
-
-
-//-----------------------
-// Other inline functions
-//-----------------------
-
-inline half	
-half::operator - () const
-{
-    half h;
-    h._h = _h ^ 0x8000;
-    return h;
-}
-
-
-inline half &
-half::operator = (half h)
-{
-    _h = h._h;
-    return *this;
-}
-
-
-inline half &
-half::operator = (float f)
-{
-    *this = half (f);
-    return *this;
-}
-
-
-inline half &
-half::operator += (half h)
-{
-    *this = half (float (*this) + float (h));
-    return *this;
-}
-
-
-inline half &
-half::operator += (float f)
-{
-    *this = half (float (*this) + f);
-    return *this;
-}
-
-
-inline half &
-half::operator -= (half h)
-{
-    *this = half (float (*this) - float (h));
-    return *this;
-}
-
-
-inline half &
-half::operator -= (float f)
-{
-    *this = half (float (*this) - f);
-    return *this;
-}
-
-
-inline half &
-half::operator *= (half h)
-{
-    *this = half (float (*this) * float (h));
-    return *this;
-}
-
-
-inline half &
-half::operator *= (float f)
-{
-    *this = half (float (*this) * f);
-    return *this;
-}
-
-
-inline half &
-half::operator /= (half h)
-{
-    *this = half (float (*this) / float (h));
-    return *this;
-}
-
-
-inline half &
-half::operator /= (float f)
-{
-    *this = half (float (*this) / f);
-    return *this;
-}
-
-
-inline bool	
-half::isFinite () const
-{
-    unsigned short e = (_h >> 10) & 0x001f;
-    return e < 31;
-}
-
-
-inline bool
-half::isNormalized () const
-{
-    unsigned short e = (_h >> 10) & 0x001f;
-    return e > 0 && e < 31;
-}
-
-
-inline bool
-half::isDenormalized () const
-{
-    unsigned short e = (_h >> 10) & 0x001f;
-    unsigned short m =  _h & 0x3ff;
-    return e == 0 && m != 0;
-}
-
-
-inline bool
-half::isZero () const
-{
-    return (_h & 0x7fff) == 0;
-}
-
-
-inline bool
-half::isNan () const
-{
-    unsigned short e = (_h >> 10) & 0x001f;
-    unsigned short m =  _h & 0x3ff;
-    return e == 31 && m != 0;
-}
-
-
-inline bool
-half::isInfinity () const
-{
-    unsigned short e = (_h >> 10) & 0x001f;
-    unsigned short m =  _h & 0x3ff;
-    return e == 31 && m == 0;
-}
-
-
-inline bool	
-half::isNegative () const
-{
-    return (_h & 0x8000) != 0;
-}
-
-
-inline half
-half::posInf ()
-{
-    half h;
-    h._h = 0x7c00;
-    return h;
-}
-
-
-inline half
-half::negInf ()
-{
-    half h;
-    h._h = 0xfc00;
-    return h;
-}
-
-
-inline half
-half::qNan ()
-{
-    half h;
-    h._h = 0x7fff;
-    return h;
-}
-
-
-inline half
-half::sNan ()
-{
-    half h;
-    h._h = 0x7dff;
-    return h;
-}
-
-
-inline unsigned short
-half::bits () const
-{
-    return _h;
-}
-
-
-inline void
-half::setBits (unsigned short bits)
-{
-    _h = bits;
-}
-
-#endif
diff --git a/jellyfish/hash.hpp b/jellyfish/hash.hpp
deleted file mode 100644
index 6daeb7a..0000000
--- a/jellyfish/hash.hpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_HASH_HPP__
-#define __JELLYFISH_HASH_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <list>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <jellyfish/mapped_file.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
-  /* Wrapper around a "storage". The hash class manages threads. In
-     particular, it synchronizes the threads for the size-doubling
-     operation and manages dumping the hash to disk. The storage class
-     is reponsible for the details of storing the key,value pairs,
-     memory management, reprobing, etc.
-  */
-
-  class hash_t {
-  public:
-    virtual ~hash_t() {}
-  };
-
-  template<typename key_t, typename val_t, typename ary_t, typename atomic>
-  class hash : public hash_t {
-  public:
-    define_error_class(TableFull);
-    //    typedef typename std::pair<key_t,val_t> kv_t;
-    typedef ary_t storage_t;
-    typedef typename ary_t::iterator iterator;
-
-    hash() : ary(NULL), dumper(NULL), dumping_initiated(false) {}
-    explicit hash(ary_t *_ary) : ary(_ary), dumper(NULL), dumping_initiated(false) {}
-
-    virtual ~hash() {}
-
-    size_t get_size() const { return ary->get_size(); }
-    uint_t get_key_len() const { return ary->get_key_len(); }
-    uint_t get_val_len() const { return ary->get_val_len(); }
-    uint_t get_max_reprobe() const { return ary->get_max_reprobe(); }
-    size_t get_max_reprobe_offset() const { return ary->get_max_reprobe_offset(); }
-    
-    void set_dumper(dumper_t *new_dumper) { dumper = new_dumper; }
-    Time get_writing_time() const { 
-      if(!dumper)
-        return Time::zero;
-      return dumper->get_writing_time();
-    }
-
-    void write_raw(std::ostream &out) { ary->write_raw(out); }
-
-    iterator iterator_all() const { return ary->iterator_all(); }
-    iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
-      return ary->iterator_slice(slice_number, number_of_slice);
-    }
-
-    /*
-     * Thread handle to the hash.
-     */
-    enum status_t { FREE, INUSE, BLOCKED };
-    class thread {
-      ary_t    *ary;
-      size_t    hsize_mask;
-      status_t  status;
-      status_t  ostatus;
-      hash     *my_hash;
-    
-    public:
-      typedef val_t val_type;
-      thread(ary_t *_ary, hash *_my_hash) :
-        ary(_ary), hsize_mask(ary->get_size() - 1), status(FREE), my_hash(_my_hash)
-      { }
-
-      // Add val to the value associated with key. Returns the old
-      // value in *oval if oval is not NULL
-      template<typename add_t>
-      inline void add(key_t key, const add_t &val, val_t *oval = 0) {
-        while(true) {
-          while(atomic::cas(&status, FREE, INUSE) != FREE)
-            my_hash->wait_event_is_done();
-
-          if(ary->add(key, val, oval))
-            break;
-
-          // Improve this. Undefined behavior if dump_to_file throws an error.
-          if(my_hash->get_event_locks()) {
-            my_hash->dump();
-            my_hash->release_event_locks();
-          }
-        }
-        
-        if(atomic::cas(&status, INUSE, FREE) != INUSE)
-          my_hash->signal_not_in_use();
-      }
-
-      // void inc(key_t key, val_t *oval = 0) { return this->add(key, (add_t)1, oval); }
-      // inline void operator()(key_t key) { return this->add(key, (val_t)1); }
-
-      friend class hash;
-    };
-    friend class thread;
-    typedef std::list<thread> thread_list_t;
-    class thread_ptr_t : public thread_list_t::iterator {
-    public:
-      explicit thread_ptr_t(const typename thread_list_t::iterator &thl) : thread_list_t::iterator(thl) {}
-      typedef val_t val_type;
-    };
-    // typedef typename thread_list_t::iterator thread_ptr_t;
-
-    thread_ptr_t new_thread() { 
-      user_thread_lock.lock();
-      thread_ptr_t res(user_thread_list.insert(user_thread_list.begin(), thread(ary, this)));
-      user_thread_lock.unlock();
-      return res;
-    }
-
-    void release_thread(thread_ptr_t &th) {
-      user_thread_lock.lock();
-      user_thread_list.erase(th);
-      user_thread_lock.unlock();
-    }
-
-    void dump() {
-      if(dumper)
-        dumper->dump();
-      else
-        eraise(TableFull) << "No dumper defined";
-    }
-
-  private:
-    /**
-     * The following methods are called by threads to manage
-     * administrative events: size doubling or dumping the hash to
-     * disk.
-     **/
-
-    /**
-     * Called by a thread if it failed to switch its states from INUSE
-     * to FREE. It lets the thread triggering the event that the hash
-     * is free. This method returns after the signaling and does not
-     * wait for the handling of the event to be over.
-     **/
-    void signal_not_in_use(bool take_inuse_lock = true) {
-      if(take_inuse_lock)
-        inuse_thread_cond.lock();
-      if(--inuse_thread_count == 0)
-        inuse_thread_cond.signal();
-      inuse_thread_cond.unlock();
-    }
-
-    /**
-     * Called by a thread if it failed to switch its states from FREE
-     * to INUSE. An event management has been initiated. This call
-     * waits for the event handling to be over.
-     **/
-    void wait_event_is_done(bool take_event_lock = true) {
-      if(take_event_lock)
-        event_cond.lock();
-      while(dumping_initiated)
-        event_cond.wait();
-      event_cond.unlock();
-    }
-
-    /**
-     * Get the locks before handling an event and returns true if
-     * success. It guarantees than no thread is doing an operation on
-     * the hash. If another thread is already handling an event,
-     * degrade to wait_event_is_done and returns false.
-     **/
-    bool get_event_locks() {
-      inuse_thread_cond.lock();
-      event_cond.lock();
-      if(dumping_initiated) {
-        // Another thread is doing the dumping
-        signal_not_in_use(false);
-        wait_event_is_done(false);
-        return false;
-      }
-
-      // I am the thread doing the dumping
-      user_thread_lock.lock();
-      dumping_initiated = true;
-      event_cond.unlock();
-
-      inuse_thread_count = 0;
-      
-      // Block access to hash and wait for threads with INUSE state
-      for(thread_ptr_t it(user_thread_list.begin());
-          it != user_thread_list.end();
-          it++) {
-        it->ostatus = atomic::set(&it->status, BLOCKED);
-        if(it->ostatus == INUSE)
-          inuse_thread_count++;
-      }
-      inuse_thread_count--; // Remove 1 for myself!
-      while(inuse_thread_count > 0) {
-        inuse_thread_cond.wait();
-      }
-      inuse_thread_cond.unlock();
-
-      return true;
-    }    
-
-    void release_event_locks() {
-      event_cond.lock();
-      for(thread_ptr_t it(user_thread_list.begin());
-          it != user_thread_list.end();
-          it++) {
-        atomic::set(&it->status, FREE);
-      }
-      user_thread_lock.unlock();
-      dumping_initiated = false;
-      event_cond.broadcast();
-      event_cond.unlock();
-    }
-
-  private:
-    ary_t                 *ary;
-    dumper_t              *dumper;
-    volatile bool          dumping_initiated;
-    thread_list_t          user_thread_list;
-    locks::pthread::mutex  user_thread_lock;
-    locks::pthread::cond   event_cond;
-    locks::pthread::cond   inuse_thread_cond;
-    volatile uint_t        inuse_thread_count;
-  };
-}
-
-#endif // __HASH_HPP__
diff --git a/jellyfish/hash_fastq_merge.cc b/jellyfish/hash_fastq_merge.cc
deleted file mode 100644
index b018ff7..0000000
--- a/jellyfish/hash_fastq_merge.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/hash_fastq_merge_cmdline.hpp>
-
-int hash_fastq_merge_main(int argc, char *argv[])
-{
-  hash_fastq_merge_args args(argc, argv);
-
-  fastq_hash_t::storage_t ary(args.size_arg, 2*args.mer_len_arg,
-                              args.reprobes_arg, jellyfish::quadratic_reprobes);
-  fastq_hash_t hash(&ary);
-  fastq_hash_t::thread_ptr_t counter(hash.new_thread());
-  
-  int num_hashes = args.db_arg.size();
-  for(int i = 0; i < num_hashes; ++i) {
-    fastq_storage_t *ihash = raw_fastq_dumper_t::read(args.db_arg[i]);
-    if(ihash->get_key_len() != hash.get_key_len())
-      die << "Invalid mer length '" << (ihash->get_key_len() / 2)
-          << "' for database '" << args.db_arg[i] 
-          << "'. Should be '" << (hash.get_key_len() / 2) << "'";
-    fastq_storage_t::iterator iit = ihash->iterator_all();
-    while(iit.next()) {
-      counter->add(iit.get_key(), iit.get_val().to_float());
-    }
-    delete ihash;
-  }
-
-  raw_fastq_dumper_t dumper(4, args.output_arg, 
-                            args.out_buffer_size_arg, &ary);
-  hash.set_dumper(&dumper);
-  hash.dump();
-
-  return 0;
-}
diff --git a/jellyfish/hash_fastq_merge_cmdline.hpp b/jellyfish/hash_fastq_merge_cmdline.hpp
deleted file mode 100644
index 98f4002..0000000
--- a/jellyfish/hash_fastq_merge_cmdline.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HASH_FASTQ_MERGE_ARGS_HPP__
-#define __HASH_FASTQ_MERGE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class hash_fastq_merge_args {
-public:
-  uint64_t                       size_arg;
-  bool                           size_given;
-  uint32_t                       mer_len_arg;
-  bool                           mer_len_given;
-  const char *                   output_arg;
-  bool                           output_given;
-  uint32_t                       reprobes_arg;
-  bool                           reprobes_given;
-  uint64_t                       out_buffer_size_arg;
-  bool                           out_buffer_size_given;
-  std::vector<const char *>      db_arg;
-  typedef std::vector<const char *>::iterator db_arg_it;
-  typedef std::vector<const char *>::const_iterator db_arg_const_it;
-
-  enum {
-    USAGE_OPT = 1000,
-    FULL_HELP_OPT,
-    OUT_BUFFER_SIZE_OPT
-  };
-
-  hash_fastq_merge_args() : 
-    size_arg(), size_given(false),
-    mer_len_arg(), mer_len_given(false),
-    output_arg("merged.jf"), output_given(false),
-    reprobes_arg(62), reprobes_given(false),
-    out_buffer_size_arg(20000000), out_buffer_size_given(false)
-  { }
-
-  hash_fastq_merge_args(int argc, char* argv[]) :
-    size_arg(), size_given(false),
-    mer_len_arg(), mer_len_given(false),
-    output_arg("merged.jf"), output_given(false),
-    reprobes_arg(62), reprobes_given(false),
-    out_buffer_size_arg(20000000), out_buffer_size_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"size", 1, 0, 's'},
-      {"mer-len", 1, 0, 'm'},
-      {"output", 1, 0, 'o'},
-      {"reprobes", 1, 0, 'p'},
-      {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
-      {"help", 0, 0, 'h'},
-      {"full-help", 0, 0, FULL_HELP_OPT},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVs:m:o:p:";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case FULL_HELP_OPT:
-        std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
-        exit(0);
-      case 's':
-        size_given = true;
-        size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-s, --size=uint64")
-        break;
-      case 'm':
-        mer_len_given = true;
-        mer_len_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-m, --mer-len=uint32")
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      case 'p':
-        reprobes_given = true;
-        reprobes_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-p, --reprobes=uint32")
-        break;
-      case OUT_BUFFER_SIZE_OPT:
-        out_buffer_size_given = true;
-        out_buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "    --out-buffer-size=uint64")
-        break;
-      }
-    }
-
-    // Check that required switches are present
-    if(!size_given)
-      error("[-s, --size=uint64] required switch");
-    if(!mer_len_given)
-      error("[-m, --mer-len=uint32] required switch");
-
-    // Parse arguments
-    if(argc - optind < 2)
-      error("Requires at least 2 arguments.");
-    for( ; optind < argc; ++optind) {
-      db_arg.push_back(argv[optind]);
-    }
-  }
-
-#define hash_fastq_merge_args_USAGE "Usage: jellyfish merge [options] db:string+"
-  const char * usage() const { return hash_fastq_merge_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define hash_fastq_merge_args_HELP "Merge quake databases\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -s, --size=uint64                       *Merged hash table size\n" \
-  " -m, --mer-len=uint32                    *Mer length\n" \
-  " -o, --output=string                      Output file (merged.jf)\n" \
-  " -p, --reprobes=uint32                    Maximum number of reprobes (62)\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  "     --full-help                          Detailed help\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return hash_fastq_merge_args_HELP; }
-#define hash_fastq_merge_args_HIDDEN "Hidden options:\n" \
-  "     --out-buffer-size=uint64             Size of output buffer per thread (20000000)"
-
-  const char * hidden() const { return hash_fastq_merge_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "size_given:" << size_given << " size_arg:" << size_arg << "\n";
-    os << "mer_len_given:" << mer_len_given << " mer_len_arg:" << mer_len_arg << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "reprobes_given:" << reprobes_given << " reprobes_arg:" << reprobes_arg << "\n";
-    os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
-    os << "db_arg:" << yaggo::vec_str(db_arg) << "\n";
-  }
-private:
-};
-
-#endif // __HASH_FASTQ_MERGE_ARGS_HPP__"
diff --git a/jellyfish/hash_merge.cc b/jellyfish/hash_merge.cc
deleted file mode 100644
index 5ee4b90..0000000
--- a/jellyfish/hash_merge.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdint.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/heap.hpp>
-#include <jellyfish/hash_merge_cmdline.hpp>
-
-#define MAX_KMER_SIZE 32
-
-class ErrorWriting : public std::exception {
-  std::string msg;
-public:
-  explicit ErrorWriting(const std::string &_msg) : msg(_msg) {}
-  virtual ~ErrorWriting() throw() {}
-  virtual const char* what() const throw() {
-    return msg.c_str();
-  }
-};
-
-struct writer_buffer {
-  volatile bool full;
-  hash_writer_t writer;
-};
-struct writer_info {
-  locks::pthread::cond  cond;
-  volatile bool         done;
-  uint_t                nb_buffers;
-  std::ostream         *out;
-  writer_buffer        *buffers;
-};
-
-void *writer_function(void *_info) {
-  writer_info *info = (writer_info *)_info;
-  uint_t buf_id = 0;
-  uint64_t waiting = 0;
-
-  while(true) {
-    info->cond.lock();
-    while(!info->buffers[buf_id].full) {
-      if(info->done) {
-        info->cond.unlock();
-        return new uint64_t(waiting);
-      }
-      waiting++;
-      info->cond.wait();
-    }
-    info->cond.unlock();
-
-    info->buffers[buf_id].writer.dump(info->out);
-
-    info->cond.lock();
-    info->buffers[buf_id].full = false;
-    info->cond.signal();
-    info->cond.unlock();
-
-    buf_id = (buf_id + 1) % info->nb_buffers;
-  }
-}
-
-int merge_main(int argc, char *argv[])
-{
-  merge_args args(argc, argv);
-
-  int                i;
-  unsigned int       rklen       = 0;
-  size_t             max_reprobe = 0;
-  size_t             hash_size   = 0;
-  SquareBinaryMatrix hash_matrix;
-  SquareBinaryMatrix hash_inverse_matrix;
-
-  // compute the number of hashes we're going to read
-  int num_hashes = args.input_arg.size();
-
-  // this is our row of iterators
-  std::vector<hash_reader_t> iters(num_hashes);
- 
-  // create an iterator for each hash file
-  for(i = 0; i < num_hashes; i++) {
-    // open the hash database
-    const char *db_file = args.input_arg[i];
-
-    try {
-      iters[i].initialize(db_file, args.out_buffer_size_arg);
-    } catch(std::exception *e) {
-      die << "Can't open k-mer database: " << e;
-    }
-
-    unsigned int len = iters[i].get_key_len();
-    if(rklen != 0 && len != rklen)
-      die << "Can't merge hashes of different key lengths";
-    rklen = len;
-
-    uint64_t rep = iters[i].get_max_reprobe();
-    if(max_reprobe != 0 && rep != max_reprobe)
-      die << "Can't merge hashes with different reprobing stratgies";
-    max_reprobe = rep;
-
-    size_t size = iters[i].get_size();
-    if(hash_size != 0 && size != hash_size)
-      die << "Can't merge hash with different size";
-    hash_size = size;
-
-    if(hash_matrix.get_size() == 0) {
-      hash_matrix = iters[i].get_hash_matrix();
-      hash_inverse_matrix = iters[i].get_hash_inverse_matrix();
-    } else {
-      SquareBinaryMatrix new_hash_matrix = iters[i].get_hash_matrix();
-      SquareBinaryMatrix new_hash_inverse_matrix = 
-	iters[i].get_hash_inverse_matrix();
-      if(new_hash_matrix != hash_matrix || 
-	 new_hash_inverse_matrix != hash_inverse_matrix)
-	die << "Can't merge hash with different hash function";
-    }
-  }
-
-  if(rklen == 0)
-    die << "No valid hash tables found";
-
-  typedef jellyfish::heap_t<hash_reader_t> hheap_t;
-  hheap_t heap(num_hashes);
-
-  if(args.verbose_flag)
-    std::cerr << "mer length  = " << (rklen / 2) << "\n"
-              << "hash size   = " << hash_size << "\n"
-              << "num hashes  = " << num_hashes << "\n"
-              << "max reprobe = " << max_reprobe << "\n"
-              << "heap capa   = " << heap.capacity() << "\n"
-              << "matrix      = " << hash_matrix.xor_sum() << "\n"
-              << "inv_matrix  = " << hash_inverse_matrix.xor_sum() << "\n";
-
-  // populate the initial heap
-  for(int h = 0; h < num_hashes; ++h) {
-    if(iters[h].next())
-      heap.push(iters[h]);
-  }
-  assert(heap.size() == heap.capacity());
-
-  if(heap.is_empty()) 
-    die << "Hashes contain no items.";
-
-  // open the output file
-  std::ofstream out(args.output_arg.c_str());
-  size_t nb_records = args.out_buffer_size_arg /
-    (bits_to_bytes(rklen) + bits_to_bytes(8 * args.out_counter_len_arg));
-  if(args.verbose_flag)
-    std::cerr << "buffer size " << args.out_buffer_size_arg 
-              << " nb_records " << nb_records << "\n";
-  writer_info info;
-  info.nb_buffers = 4;
-  info.out = &out;
-  info.done = false;
-  info.buffers = new writer_buffer[info.nb_buffers];
-  for(uint_t j = 0; j < info.nb_buffers; j++) {
-    info.buffers[j].full = false;
-    info.buffers[j].writer.initialize(nb_records, rklen,
-                                      8 * args.out_counter_len_arg, &iters[0]);
-  }
-  info.buffers[0].writer.write_header(&out);
-
-  pthread_t writer_thread;
-  pthread_create(&writer_thread, NULL, writer_function, &info);
-
-  if(args.verbose_flag)
-    std::cerr << "out kmer len = " << info.buffers[0].writer.get_key_len_bytes() << " bytes\n"
-              << "out val len  = " << info.buffers[0].writer.get_val_len_bytes() << " bytes\n";
-
-  uint_t buf_id = 0;
-  uint64_t waiting = 0;
-  hheap_t::const_item_t head = heap.head();
-  while(heap.is_not_empty()) {
-    uint64_t key = head->key;
-    uint64_t sum = 0;
-    do {
-      sum += head->val;
-      heap.pop();
-      if(head->it->next())
-        heap.push(*head->it);
-      head = heap.head();
-    } while(heap.is_not_empty() && head->key == key);
-
-    while(!info.buffers[buf_id].writer.append(key, sum)) {
-      info.cond.lock();
-      info.buffers[buf_id].full = true;
-      buf_id = (buf_id + 1) % info.nb_buffers;
-      while(info.buffers[buf_id].full) { waiting++; info.cond.wait(); }
-      info.cond.signal();
-      info.cond.unlock();
-    }
-  }
-  info.cond.lock();
-  //  while(info.buffers[buf_id].full) { waiting++; info.cond.wait(); }
-  info.buffers[buf_id].full = true;
-  info.done = true;
-  info.cond.signal();
-  info.cond.unlock();
-
-  //uint64_t *writer_waiting;
-  pthread_join(writer_thread, NULL);
-
-  uint64_t unique = 0, distinct = 0, total = 0, max_count = 0;
-  for(uint_t j = 0; j < info.nb_buffers; j++) {
-    unique += info.buffers[j].writer.get_unique();
-    distinct += info.buffers[j].writer.get_distinct();
-    total += info.buffers[j].writer.get_total();
-    if(info.buffers[j].writer.get_max_count() > max_count)
-      max_count = info.buffers[j].writer.get_max_count();
-  }
-  info.buffers[0].writer.update_stats_with(&out, unique, distinct, total, max_count);
-  out.close();
-  return 0;
-}
diff --git a/jellyfish/hash_merge_cmdline.hpp b/jellyfish/hash_merge_cmdline.hpp
deleted file mode 100644
index 04b6c70..0000000
--- a/jellyfish/hash_merge_cmdline.hpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __MERGE_ARGS_HPP__
-#define __MERGE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class merge_args {
-public:
-  uint64_t                       buffer_size_arg;
-  bool                           buffer_size_given;
-  yaggo::string                  output_arg;
-  bool                           output_given;
-  uint32_t                       out_counter_len_arg;
-  bool                           out_counter_len_given;
-  uint64_t                       out_buffer_size_arg;
-  bool                           out_buffer_size_given;
-  bool                           verbose_flag;
-  std::vector<const char *>      input_arg;
-  typedef std::vector<const char *>::iterator input_arg_it;
-  typedef std::vector<const char *>::const_iterator input_arg_const_it;
-
-  enum {
-    USAGE_OPT = 1000,
-    OUT_COUNTER_LEN_OPT,
-    OUT_BUFFER_SIZE_OPT
-  };
-
-  merge_args() : 
-    buffer_size_arg(10000000), buffer_size_given(false),
-    output_arg("mer_counts_merged.jf"), output_given(false),
-    out_counter_len_arg(4), out_counter_len_given(false),
-    out_buffer_size_arg(10000000), out_buffer_size_given(false),
-    verbose_flag(false)
-  { }
-
-  merge_args(int argc, char* argv[]) :
-    buffer_size_arg(10000000), buffer_size_given(false),
-    output_arg("mer_counts_merged.jf"), output_given(false),
-    out_counter_len_arg(4), out_counter_len_given(false),
-    out_buffer_size_arg(10000000), out_buffer_size_given(false),
-    verbose_flag(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"buffer-size", 1, 0, 's'},
-      {"output", 1, 0, 'o'},
-      {"out-counter-len", 1, 0, OUT_COUNTER_LEN_OPT},
-      {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
-      {"verbose", 0, 0, 'v'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVs:o:v";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 's':
-        buffer_size_given = true;
-        buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-s, --buffer-size=Buffer length")
-        break;
-      case 'o':
-        output_given = true;
-        output_arg.assign(optarg);
-        break;
-      case OUT_COUNTER_LEN_OPT:
-        out_counter_len_given = true;
-        out_counter_len_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "    --out-counter-len=uint32")
-        break;
-      case OUT_BUFFER_SIZE_OPT:
-        out_buffer_size_given = true;
-        out_buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "    --out-buffer-size=uint64")
-        break;
-      case 'v':
-        verbose_flag = true;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind < 2)
-      error("Requires at least 2 arguments.");
-    for( ; optind < argc; ++optind) {
-      input_arg.push_back(argv[optind]);
-    }
-  }
-
-#define merge_args_USAGE "Usage: jellyfish merge [options] input:string+"
-  const char * usage() const { return merge_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define merge_args_HELP "Merge jellyfish databases\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -s, --buffer-size=Buffer length          Length in bytes of input buffer (10000000)\n" \
-  " -o, --output=string                      Output file (mer_counts_merged.jf)\n" \
-  "     --out-counter-len=uint32             Length (in bytes) of counting field in output (4)\n" \
-  "     --out-buffer-size=uint64             Size of output buffer per thread (10000000)\n" \
-  " -v, --verbose                            Be verbose (false)\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return merge_args_HELP; }
-#define merge_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return merge_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "out_counter_len_given:" << out_counter_len_given << " out_counter_len_arg:" << out_counter_len_arg << "\n";
-    os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
-    os << "verbose_flag:" << verbose_flag << "\n";
-    os << "input_arg:" << yaggo::vec_str(input_arg) << "\n";
-  }
-private:
-};
-
-#endif // __MERGE_ARGS_HPP__"
diff --git a/jellyfish/heap.hpp b/jellyfish/heap.hpp
deleted file mode 100644
index cae37f1..0000000
--- a/jellyfish/heap.hpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_HEAP_HPP__
-#define __JELLYFISH_HEAP_HPP__
-
-#include <algorithm>
-
-namespace jellyfish {
-  template<typename iterator>
-  struct heap_item_t {
-    uint64_t       key;
-    uint64_t       val;
-    uint64_t       pos;
-    iterator      *it;
-
-    heap_item_t() : key(0), val(0), pos(0) { }
-
-    explicit heap_item_t(iterator &iter) { 
-      initialize(iter);
-    }
-
-    void initialize(iterator &iter) {
-      key = iter.key;
-      val = iter.val;
-      pos = iter.get_pos();
-      it  = &iter;
-    }
-
-    // STL make_heap creates a max heap. We want a min heap, so
-    // reverse comparator!
-    bool operator<(const heap_item_t & other) {
-      if(pos == other.pos)
-        return key > other.key;
-      return pos > other.pos;
-    }
-  };
-
-  template<typename iterator>
-  class heap_item_compare {
-  public:
-    inline bool operator() (heap_item_t<iterator> *i1, heap_item_t<iterator> *i2) {
-      return *i1 < *i2;
-    }
-  };
-
-  template<typename iterator>
-  class heap_t {
-    heap_item_t<iterator>       *storage;
-    heap_item_t<iterator>      **elts;
-    size_t                       capacity_;
-    size_t                       h;
-    heap_item_compare<iterator>  compare;
-  public:
-    typedef const heap_item_t<iterator> *const_item_t;
-
-    heap_t() : storage(0), elts(0), capacity_(0), h(0) { }
-    explicit heap_t(size_t _capacity)  { initialize(_capacity); }
-    ~heap_t() {
-      delete[] storage;
-      delete[] elts;
-    }
-
-    void initialize(size_t _capacity) {
-      capacity_ = _capacity;
-      h = 0;
-      storage = new heap_item_t<iterator>[capacity_];
-      elts = new heap_item_t<iterator>*[capacity_];
-      for(size_t h1 = 0; h1 < capacity_; ++h1)
-        elts[h1] = &storage[h1];
-    }
-
-    void fill(iterator &it) {
-      h = 0;
-      while(h < capacity_) {
-        if(!it.next())
-          break;
-        storage[h].initialize(it);
-        elts[h] = &storage[h];
-        h++;
-      }
-      std::make_heap(elts, elts + h, compare);
-    }
-    template<typename ForwardIterator>
-    void fill(ForwardIterator first, ForwardIterator last) {
-      h = 0;
-      while(h < capacity_ && first != last) {
-        if(!first->next())
-          break;
-        storage[h].initialize(*first++);
-        elts[h] = &storage[h];
-        h++;
-      }
-      std::make_heap(elts, elts + h, compare);
-    }
-    
-    bool is_empty() const { return h == 0; }
-    bool is_not_empty() const { return h > 0; }
-    size_t size() const { return h; }
-    size_t capacity() const { return capacity_; }
-
-    // The following 3 should only be used after fill has been called
-    const_item_t head() const { return elts[0]; }
-    void pop() { std::pop_heap(elts, elts + h--, compare); }
-    void push(iterator &item) {
-      elts[h]->initialize(item);
-      std::push_heap(elts, elts + ++h, compare);
-    }
-  };
-}
-
-#endif // __HEAP_HPP__
diff --git a/jellyfish/histo_fastq_main.cc b/jellyfish/histo_fastq_main.cc
deleted file mode 100644
index d26b97f..0000000
--- a/jellyfish/histo_fastq_main.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <math.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/histo_fastq_main_cmdline.hpp>
-
-int histo_fastq_main(int argc, char *argv[])
-{
-  histo_fastq_main_args args(argc, argv);
-
-  if(args.low_arg < 0.0)
-    args.error("Low count (option --low,-l) must be >= 0.0");
-
-  fastq_storage_t *hash = raw_fastq_dumper_t::read(args.db_arg);
-  fastq_storage_t::iterator it = hash->iterator_all();
-  float low_arg = args.low_arg;
-  float increment_arg = args.increment_arg;
-  float high_arg = args.high_arg;
-  const float base = 
-    low_arg > 0.0 ? (increment_arg >= low_arg ? 0.0 : low_arg - increment_arg) : 0.0;
-  const float ceil = high_arg + increment_arg;
-  const int nb_buckets = (int)ceilf((ceil + increment_arg - base) / increment_arg);
-  const int last_bucket = nb_buckets - 1;
-  std::vector<uint64_t> histogram(nb_buckets, 0UL);
-
-  while(it.next()) {
-    int i = (int)roundf((it.get_val().to_float() - base) / increment_arg);
-    if(i < 0) {
-      histogram[0]++;
-    } else if(i >= last_bucket) {
-      histogram[last_bucket]++;
-    } else {
-      histogram[i]++;
-    }
-  }
-
-  for(int i = 0; i < nb_buckets; i++)
-    if(histogram[i] > 0.0 || args.full_flag)
-      std::cout << (base + (float)i * increment_arg) 
-                << " " << histogram[i] << "\n";
-
-  std::cout << std::flush;
-
-  return 0;
-}
diff --git a/jellyfish/histo_fastq_main_cmdline.hpp b/jellyfish/histo_fastq_main_cmdline.hpp
deleted file mode 100644
index 69a89e6..0000000
--- a/jellyfish/histo_fastq_main_cmdline.hpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HISTO_FASTQ_MAIN_ARGS_HPP__
-#define __HISTO_FASTQ_MAIN_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class histo_fastq_main_args {
-public:
-  double                         low_arg;
-  bool                           low_given;
-  double                         high_arg;
-  bool                           high_given;
-  double                         increment_arg;
-  bool                           increment_given;
-  bool                           full_flag;
-  const char *                   db_arg;
-
-  enum {
-    USAGE_OPT = 1000,
-    HELP_OPT
-  };
-
-  histo_fastq_main_args() : 
-    low_arg(0.0), low_given(false),
-    high_arg(10000.0), high_given(false),
-    increment_arg(1.0), increment_given(false),
-    full_flag(false)
-  { }
-
-  histo_fastq_main_args(int argc, char* argv[]) :
-    low_arg(0.0), low_given(false),
-    high_arg(10000.0), high_given(false),
-    increment_arg(1.0), increment_given(false),
-    full_flag(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"low", 1, 0, 'l'},
-      {"high", 1, 0, 'h'},
-      {"increment", 1, 0, 'i'},
-      {"full", 0, 0, 'f'},
-      {"help", 0, 0, HELP_OPT},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "Vl:h:i:f";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case HELP_OPT:
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 'l':
-        low_given = true;
-        low_arg = yaggo::conv_double((const char *)optarg, err, false);
-        CHECK_ERR(double_t, optarg, "-l, --low=double")
-        break;
-      case 'h':
-        high_given = true;
-        high_arg = yaggo::conv_double((const char *)optarg, err, false);
-        CHECK_ERR(double_t, optarg, "-h, --high=double")
-        break;
-      case 'i':
-        increment_given = true;
-        increment_arg = yaggo::conv_double((const char *)optarg, err, false);
-        CHECK_ERR(double_t, optarg, "-i, --increment=double")
-        break;
-      case 'f':
-        full_flag = true;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = argv[optind];
-    ++optind;
-  }
-
-#define histo_fastq_main_args_USAGE "Usage: jellyfish qhisto [options] db:string"
-  const char * usage() const { return histo_fastq_main_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define histo_fastq_main_args_HELP "Create an histogram of k-mer occurences\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -l, --low=double                         Low count value of histogram (0.0)\n" \
-  " -h, --high=double                        High count value of histogram (10000.0)\n" \
-  " -i, --increment=double                   Increment value for buckets (1.0)\n" \
-  " -f, --full                               Full histo. Don't skip count 0. (false)\n" \
-  "     --usage                              Usage\n" \
-  "     --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return histo_fastq_main_args_HELP; }
-#define histo_fastq_main_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return histo_fastq_main_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "low_given:" << low_given << " low_arg:" << low_arg << "\n";
-    os << "high_given:" << high_given << " high_arg:" << high_arg << "\n";
-    os << "increment_given:" << increment_given << " increment_arg:" << increment_arg << "\n";
-    os << "full_flag:" << full_flag << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __HISTO_FASTQ_MAIN_ARGS_HPP__"
diff --git a/jellyfish/histo_main.cc b/jellyfish/histo_main.cc
deleted file mode 100644
index 77d7478..0000000
--- a/jellyfish/histo_main.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/counter.hpp>
-#include <jellyfish/histo_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-class histogram : public thread_exec {
-  const hash_t   *hash;
-  const uint_t    threads;
-  const uint64_t  base, ceil, inc, nb_buckets, nb_slices;
-  uint64_t       *data;
-  counter_t       slice_id;
-
-public:
-  histogram(const hash_t *_hash, uint_t _threads, uint64_t _base,
-            uint64_t _ceil, uint64_t _inc) :
-    hash(_hash), threads(_threads), base(_base), ceil(_ceil), inc(_inc), 
-    nb_buckets((ceil + inc - base) / inc), nb_slices(threads * 100)
-  {
-    data = new uint64_t[threads * nb_buckets];
-    memset(data, '\0', threads * nb_buckets * sizeof(uint64_t));
-  }
-
-  ~histogram() {
-    if(data)
-      delete [] data;
-  }
-
-  void do_it() {
-    exec_join(threads);
-  }
-
-  void start(int th_id) {
-    uint64_t *hist = &data[th_id * nb_buckets];
-
-    for(size_t i = slice_id++; i < nb_slices; i = slice_id++) {
-      typename hash_t::iterator it = hash->iterator_slice(i, nb_slices);
-      while(it.next()) {
-        if(it.get_val() < base)
-          ++hist[0];
-        else if(it.get_val() > ceil)
-          ++hist[nb_buckets - 1];
-        else
-          ++hist[(it.get_val() - base) / inc];
-      }
-    }
-  }
-
-  void print(std::ostream &out, bool full) {
-    uint64_t col = base;
-    for(uint64_t i = 0; i < nb_buckets; i++, col += inc) {
-      uint64_t count = 0;
-      for(uint_t j = 0; j < threads; j++)
-        count += data[j * nb_buckets + i];
-      if(count > 0 || full)
-        out << col << " " << count << "\n";
-    }
-  }
-};
-
-int histo_main(int argc, char *argv[])
-{
-  histo_args args(argc, argv);
-
-  if(args.low_arg < 1)
-    args.error("Low count value must be >= 1");
-  if(args.high_arg < args.low_arg)
-    args.error("High count value must be >= to low count value");
-  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
-  if(!out.good())
-    die << "Error opening output file '" << args.output_arg << "'" << err::no;
-
-  const uint64_t base = 
-    args.low_arg > 1 ? (args.increment_arg >= args.low_arg ? 1 : args.low_arg - args.increment_arg) : 1;
-  const uint64_t ceil = args.high_arg + args.increment_arg;
-
-  mapped_file dbf(args.db_arg.c_str());
-  dbf.sequential().will_need();
-  char type[8];
-  memcpy(type, dbf.base(), sizeof(type));
-  if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
-    raw_inv_hash_query_t hash(dbf);
-    histogram<raw_inv_hash_query_t> histo(&hash, args.threads_arg, base, ceil, args.increment_arg);
-    histo.do_it();
-    histo.print(out, args.full_flag);
-  } else if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
-    hash_query_t hash(dbf);
-    if(args.verbose_flag)
-      std::cerr << "mer length  = " << hash.get_mer_len() << "\n"
-                << "hash size   = " << hash.get_size() << "\n"
-                << "max reprobe = " << hash.get_max_reprobe() << "\n"
-                << "matrix      = " << hash.get_hash_matrix().xor_sum() << "\n"
-                << "inv_matrix  = " << hash.get_hash_inverse_matrix().xor_sum() << "\n";
-    histogram<hash_query_t> histo(&hash, args.threads_arg, base, ceil, args.increment_arg);
-    histo.do_it();
-    histo.print(out, args.full_flag);
-  } else {
-    die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
-  }
-  out.close();
-
-  return 0;
-}
diff --git a/jellyfish/histo_main_cmdline.hpp b/jellyfish/histo_main_cmdline.hpp
deleted file mode 100644
index 7539294..0000000
--- a/jellyfish/histo_main_cmdline.hpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HISTO_ARGS_HPP__
-#define __HISTO_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class histo_args {
-public:
-  uint64_t                       low_arg;
-  bool                           low_given;
-  uint64_t                       high_arg;
-  bool                           high_given;
-  uint64_t                       increment_arg;
-  bool                           increment_given;
-  uint32_t                       threads_arg;
-  bool                           threads_given;
-  bool                           full_flag;
-  const char *                   output_arg;
-  bool                           output_given;
-  uint64_t                       buffer_size_arg;
-  bool                           buffer_size_given;
-  bool                           verbose_flag;
-  yaggo::string                  db_arg;
-
-  enum {
-    USAGE_OPT = 1000,
-    FULL_HELP_OPT,
-    HELP_OPT
-  };
-
-  histo_args() : 
-    low_arg(1), low_given(false),
-    high_arg(10000), high_given(false),
-    increment_arg(1), increment_given(false),
-    threads_arg(1), threads_given(false),
-    full_flag(false),
-    output_arg(""), output_given(false),
-    buffer_size_arg(10000000), buffer_size_given(false),
-    verbose_flag(false)
-  { }
-
-  histo_args(int argc, char* argv[]) :
-    low_arg(1), low_given(false),
-    high_arg(10000), high_given(false),
-    increment_arg(1), increment_given(false),
-    threads_arg(1), threads_given(false),
-    full_flag(false),
-    output_arg(""), output_given(false),
-    buffer_size_arg(10000000), buffer_size_given(false),
-    verbose_flag(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"low", 1, 0, 'l'},
-      {"high", 1, 0, 'h'},
-      {"increment", 1, 0, 'i'},
-      {"threads", 1, 0, 't'},
-      {"full", 0, 0, 'f'},
-      {"output", 1, 0, 'o'},
-      {"buffer-size", 1, 0, 's'},
-      {"verbose", 0, 0, 'v'},
-      {"help", 0, 0, HELP_OPT},
-      {"full-help", 0, 0, FULL_HELP_OPT},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "Vl:h:i:t:fo:s:v";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case HELP_OPT:
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case FULL_HELP_OPT:
-        std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
-        exit(0);
-      case 'l':
-        low_given = true;
-        low_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-l, --low=uint64")
-        break;
-      case 'h':
-        high_given = true;
-        high_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-h, --high=uint64")
-        break;
-      case 'i':
-        increment_given = true;
-        increment_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-i, --increment=uint64")
-        break;
-      case 't':
-        threads_given = true;
-        threads_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint32_t, optarg, "-t, --threads=uint32")
-        break;
-      case 'f':
-        full_flag = true;
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      case 's':
-        buffer_size_given = true;
-        buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, true);
-        CHECK_ERR(uint64_t, optarg, "-s, --buffer-size=Buffer length")
-        break;
-      case 'v':
-        verbose_flag = true;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = yaggo::string(argv[optind]);
-    ++optind;
-  }
-
-#define histo_args_USAGE "Usage: jellyfish histo [options] db:path"
-  const char * usage() const { return histo_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define histo_args_HELP "Create an histogram of k-mer occurrences\n\nCreate an histogram with the number of k-mers having a given\n" \
-  "count. In bucket 'i' are tallied the k-mers which have a count 'c'\n" \
-  "satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are\n" \
-  "labeled by the low end point (low+i*inc).\n" \
-  "\n" \
-  "The last bucket in the output behaves as a catchall: it tallies all\n" \
-  "k-mers with a count greater or equal to the low end point of this\n" \
-  "bucket.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -l, --low=uint64                         Low count value of histogram (1)\n" \
-  " -h, --high=uint64                        High count value of histogram (10000)\n" \
-  " -i, --increment=uint64                   Increment value for buckets (1)\n" \
-  " -t, --threads=uint32                     Number of threads (1)\n" \
-  " -f, --full                               Full histo. Don't skip count 0. (false)\n" \
-  " -o, --output=string                      Output file\n" \
-  " -v, --verbose                            Output information (false)\n" \
-  "     --usage                              Usage\n" \
-  "     --help                               This message\n" \
-  "     --full-help                          Detailed help\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return histo_args_HELP; }
-#define histo_args_HIDDEN "Hidden options:\n" \
-  " -s, --buffer-size=Buffer length          Length in bytes of input buffer (10000000)"
-
-  const char * hidden() const { return histo_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "low_given:" << low_given << " low_arg:" << low_arg << "\n";
-    os << "high_given:" << high_given << " high_arg:" << high_arg << "\n";
-    os << "increment_given:" << increment_given << " increment_arg:" << increment_arg << "\n";
-    os << "threads_given:" << threads_given << " threads_arg:" << threads_arg << "\n";
-    os << "full_flag:" << full_flag << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
-    os << "verbose_flag:" << verbose_flag << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __HISTO_ARGS_HPP__"
diff --git a/jellyfish/invertible_hash_array.hpp b/jellyfish/invertible_hash_array.hpp
deleted file mode 100644
index f86f3f4..0000000
--- a/jellyfish/invertible_hash_array.hpp
+++ /dev/null
@@ -1,1015 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_REVERSIBLE_HASH__
-#define __JELLYFISH_REVERSIBLE_HASH__
-
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <iostream>
-#include <utility>
-#include <exception>
-#include <assert.h>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/offsets_key_value.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/simple_circular_buffer.hpp>
-
-namespace jellyfish {
-  namespace invertible_hash {
-    define_error_class(InvalidMap);
-    define_error_class(ErrorAllocation);
-    define_error_class(InvalidMatrix);
-
-    /* Contains an integer, the reprobe limit. It is capped based on
-     * the reprobe strategy to not be bigger than the size of the hash
-     * array.
-     */
-    class reprobe_limit_t {
-      uint_t limit;
-    public:
-      reprobe_limit_t(uint_t _limit, size_t *_reprobes, size_t _size) :
-        limit(_limit)
-      {
-        while(_reprobes[limit] >= _size && limit >= 1)
-          limit--;
-      }
-      inline uint_t val() const { return limit; }
-    };
-
-    /* (key,value) pair bit-packed array.  It implements the logic of the
-     * packed hash except for size doubling. Setting or incrementing a key
-     * will return false if the hash is full. No memory management is done
-     * in this class either.
-     *
-     * The hash function is assumed to be invertible. The key is not
-     * directly stored in the hash. Let h = hash(key), size_table =
-     * 2**k and key_len = h+k. In the key field is written
-     *
-     * h high bits of h, reprobe value + 1
-     *
-     * The +1 for the reprobe value is so that the field is guaranteed
-     * not to be zero.
-     */
-    template <typename word, typename atomic_t, typename mem_block_t>
-    class array : public storage_t {
-      typedef typename Offsets<word>::offset_t offset_t;
-      uint_t             lsize;    // log of size
-      size_t             size, size_mask;
-      reprobe_limit_t    reprobe_limit;
-      uint_t             key_len;  // original key len
-      word               key_mask; // mask for high bits of hash(key)
-      uint_t             key_off;  // offset in key field for reprobe value
-      Offsets<word>      offsets;  // key len reduced by size of hash array
-      mem_block_t        mem_block;
-      word              *data;
-      atomic_t           atomic;
-      size_t            *reprobes;
-      SquareBinaryMatrix hash_matrix;
-      SquareBinaryMatrix hash_inverse_matrix;
-      struct header {
-        uint64_t klen;
-        uint64_t clen;
-        uint64_t size;
-        uint64_t reprobe_limit;
-      };
-
-    public:
-      typedef word key_t;
-      typedef word val_t;
-
-      array(size_t _size, uint_t _key_len, uint_t _val_len,
-            uint_t _reprobe_limit, size_t *_reprobes) :
-        lsize(ceilLog2(_size)), size(((size_t)1) << lsize),
-        size_mask(size - 1),
-        reprobe_limit(_reprobe_limit, _reprobes, size), key_len(_key_len),
-        key_mask(key_len <= lsize ? 0 : (((word)1) << (key_len - lsize)) - 1),
-        key_off(key_len <= lsize ? 0 : key_len - lsize),
-        offsets(key_off + bitsize(reprobe_limit.val() + 1), _val_len,
-                reprobe_limit.val() + 1),
-        mem_block(div_ceil(size, (size_t)offsets.get_block_len()) * offsets.get_block_word_len() * sizeof(word)),
-        data((word *)mem_block.get_ptr()), reprobes(_reprobes),
-        hash_matrix(key_len), 
-        hash_inverse_matrix(hash_matrix.init_random_inverse())
-      {
-        if(!data)
-          eraise(ErrorAllocation) << "Failed to allocate " 
-                                 << (div_ceil(size, (size_t)offsets.get_block_len()) * offsets.get_block_word_len() * sizeof(word))
-                                 << " bytes of memory";
-      }
-      
-      // TODO: This parsing should be done in another class and use
-      // the following constructor.
-      // array(char *map, size_t length) :
-      //   hash_matrix(0), hash_inverse_matrix(0) {
-      //   if(length < sizeof(struct header))
-      //     eraise(InvalidMap) << "File truncated";
-      //   struct header *header = (struct header *)map;
-      //   size = header->size;
-      //   if(size != (1UL << floorLog2(size)))
-      //     eraise(InvalidMap) << "Size '" << size << "' is not a power of 2";
-      //   lsize = ceilLog2(size);
-      //   size_mask = size - 1;
-      //   reprobe_limit = header->reprobe_limit;
-      //   key_len = header->klen;
-      //   if(key_len > 64 || key_len == 0)
-      //     eraise(InvalidMap) << "Invalid key length '" << key_len << "'";
-      //   offsets.init(key_len + bitsize(reprobe_limit + 1) - lsize, header->clen,
-      //                reprobe_limit);
-      //   key_mask = (((word)1) << (key_len - lsize)) - 1;
-      //   key_off = key_len - lsize;
-      //   map += sizeof(struct header);
-      //   // reprobes = new size_t[header->reprobe_limit + 1];
-      //   // TODO: should that be in the database file?
-      //   reprobes = jellyfish::quadratic_reprobes;
-      //   // memcpy(reprobes, map, sizeof(size_t) * (header->reprobe_limit + 1));
-      //   // map += sizeof(size_t) * (header->reprobe_limit + 1);
-      //   map += hash_matrix.read(map);
-      //   if((uint_t)hash_matrix.get_size() != key_len)
-      //     eraise(InvalidMatrix) << "Size of hash matrix '" << hash_matrix.get_size() 
-      //                          << "' not equal to key length '" << key_len << "'";
-      //   map += hash_inverse_matrix.read(map);
-      //   if((uint_t)hash_inverse_matrix.get_size() != key_len)
-      //     eraise(InvalidMatrix) << "Size of inverse hash matrix '" << hash_inverse_matrix.get_size()
-      //                          << "' not equal to key length '" << key_len << "'";
-      //   if((size_t)map & 0x7)
-      //     map += 0x8 - ((size_t)map & 0x7); // Make sure aligned for 64bits word. TODO: use alignof?
-      //   data = (word *)map;
-      // }
-
-      // Assume _size is already a power of 2
-      // map must point to a memory area written by "write_blocks". No header
-      array(char *map, size_t _size, uint_t _key_len, uint_t _val_len,
-            uint_t _reprobe_limit, size_t *_reprobes,
-            SquareBinaryMatrix &_hash_matrix, 
-            SquareBinaryMatrix &_hash_inverse_matrix) :
-        lsize(ceilLog2(_size)), size(_size), size_mask(size-1),
-        reprobe_limit(_reprobe_limit, _reprobes, size), key_len(_key_len),
-        key_mask(key_len <= lsize ? 0 : (((word)1) << (key_len - lsize)) - 1),
-        key_off(key_len <= lsize ? 0 : key_len - lsize),
-        offsets(key_off + bitsize(reprobe_limit.val() + 1), _val_len,
-                reprobe_limit.val() + 1),
-        data((word *)map), reprobes(_reprobes),
-        hash_matrix(_hash_matrix), hash_inverse_matrix(_hash_inverse_matrix)
-      { }
-
-      ~array() { }
-
-      // Lock in memory
-      int lock() {
-        return mem_block.lock();
-      }
-
-      void set_matrix(SquareBinaryMatrix &m) {
-        if((uint_t)m.get_size() != key_len)
-          eraise(InvalidMatrix) << "Size of matrix '" << m.get_size() 
-                               << "' not equal to key length '" << key_len << "'";
-        hash_matrix = m;
-        hash_inverse_matrix = m.inverse();
-      }
-
-      size_t get_size() const { return size; }
-      size_t get_lsize() const { return lsize; }
-      uint_t get_key_len() const { return key_len; }
-      uint_t get_val_len() const { return offsets.get_val_len(); }
-      
-      uint_t get_max_reprobe() const { return reprobe_limit.val(); }
-      size_t get_max_reprobe_offset() const { 
-        return reprobes[reprobe_limit.val()]; 
-      }
-
-      
-      uint_t get_block_len() const { return offsets.get_block_len(); }
-      uint_t get_block_word_len() const { return offsets.get_block_word_len(); }
-      size_t floor_block(size_t entries, size_t &blocks) const {
-	return offsets.floor_block(entries, blocks);
-      }
-
-    private:
-      void block_to_ptr(const size_t start, const size_t blen,
-                        char **start_ptr, size_t *memlen) const {
-	*start_ptr = (char *)(data + start * offsets.get_block_word_len());
-	char *end_ptr = (char *)mem_block.get_ptr() + mem_block.get_size();
-
-	if(*start_ptr >= end_ptr) {
-          *memlen = 0;
-	  return;
-        }
-	*memlen = blen * offsets.get_block_word_len() * sizeof(word);
-	if(*start_ptr + *memlen > end_ptr)
-	  *memlen = end_ptr - *start_ptr;
-      }
-
-    public:
-      /**
-       * Zero out blocks in [start, start+length), where start and
-       * length are given in number of blocks.
-       **/
-      void zero_blocks(const size_t start, const size_t length) {
-        char   *start_ptr;
-        size_t  memlen;
-        block_to_ptr(start, length, &start_ptr, &memlen);
-	memset(start_ptr, '\0', memlen);
-      }
-
-      /**
-       * Write to out blocks [start, start+length).
-       */
-      void write_blocks(std::ostream *out, const size_t start, const size_t length) const {
-        char   *start_ptr;
-        size_t  memlen;
-        block_to_ptr(start, length, &start_ptr, &memlen);
-	out->write(start_ptr, memlen);
-      }
-
-      // Iterator
-      class iterator {
-      protected:
-        const array	*ary;
-        size_t		 start_id, nid, end_id;
-        uint64_t	 mask;
-	char		 dna_str[33];
-      public:
-        word     key;
-        word     val;
-        size_t   id;
-        uint64_t hash;
-
-        iterator(const array *_ary, size_t start, size_t end) :
-          ary(_ary),
-          start_id(start > ary->get_size() ? ary->get_size() : start),
-          nid(start), 
-	  end_id(end > ary->get_size() ? ary->get_size() : end),
-          mask(ary->get_size() - 1)
-        {}
-        
-        void get_string(char *out) const {
-          parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
-        }
-        uint64_t get_hash() const { return hash; }
-        uint64_t get_pos() const { return hash & mask; }
-	uint64_t get_start() const { return start_id; }
-	uint64_t get_end() const { return end_id; }
-	word get_key() const { return key; }
-	word get_val() const { return val; }
-	size_t get_id() const { return id; }
-	char *get_dna_str() {
-	  parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, dna_str);
-	  return dna_str;
-	}
-
-        bool next() {
-          bool success;
-          while((id = nid) < end_id) {
-            nid++;
-            success = ary->get_key_val_full(id, key, val);
-            if(success) {
-              hash = (key & ary->key_mask) << ary->lsize;
-              uint_t reprobep = (key >> ary->key_off) - 1;
-              hash |= (id - (reprobep > 0 ? ary->reprobes[reprobep] : 0)) & ary->size_mask;
-              key = ary->hash_inverse_matrix.times(hash);
-              return true;
-            }
-          }
-          return false;
-        }
-      };
-      friend class iterator;
-      iterator iterator_all() const { return iterator(this, 0, get_size()); }
-      iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
-        std::pair<size_t, size_t> res = slice(slice_number, number_of_slice, get_size());
-        return iterator(this, res.first, res.second);
-      }
-
-      /* Why on earth doesn't inheritance with : public iterator work
-         here? Resort to copying code. Arrrgggg....
-       */
-      class overlap_iterator {
-      protected:
-        const array *ary;
-        uint64_t     mask;
-        size_t       start_id, end_id, start_oid;
-        size_t       moid, oid;
-      public:
-        word     key;
-        word     val;
-        size_t   id;
-        uint64_t hash;
-
-        overlap_iterator(const array *_ary, size_t start, size_t end) :
-          ary(_ary),
-          mask(ary->get_size() - 1),
-          start_id(start),
-          end_id(end > ary->get_size() ? ary->get_size() : end),
-          start_oid(start),
-          moid(end_id - start_id + ary->get_max_reprobe_offset()),
-          oid(0)
-        {
-          // Adjust for very small arrays and it overlaps with itself
-          if(moid > ary->get_size() - start_id) {
-            size_t last_id = (start_id + moid) % mask;
-            if(last_id > start_id)
-              moid -= last_id - start_id - 1;
-          }
-        }
-        
-        void get_string(char *out) const {
-          parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
-        }
-        uint64_t get_hash() const { return hash; }
-        uint64_t get_pos() const { return hash & mask; }
-	uint64_t get_start() const { return start_id; }
-	uint64_t get_end() const { return end_id; }
-
-        bool next() {
-          bool success;
-          while(oid < moid) {
-            id = (start_oid + oid++) & mask;
-            success = ary->get_key_val_full(id, key, val);
-            if(success) {
-              hash = (key & ary->key_mask) << ary->lsize;
-              uint_t reprobep = (key >> ary->key_off) - 1;
-              hash |= (id - (reprobep > 0 ? ary->reprobes[reprobep] : 0)) & ary->size_mask;
-              if(get_pos() < start_id || get_pos() >= end_id)
-                continue;
-              key = ary->hash_inverse_matrix.times(hash);
-              return true;
-            }
-          }
-          return false;
-        }
-      };
-      friend class overlap_iterator;
-
-      /* Return whether the entry is empty and if not, it returns the
-       * key and if it has the large bit set.
-       */
-      void get_entry_stats(size_t id, bool &empty, word &key, bool &large) const {
-        word           *w, *kvw = NULL;
-        const offset_t *o, *lo  = NULL;
-
-        w = offsets.get_word_offset(id, &o, &lo, data);
-        kvw = w + o->key.woff;
-        key = *kvw;
-        large = key & o->key.lb_mask;
-        if(large)
-          o = lo;
-        if(o->key.mask2) {
-          key = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
-          key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
-        } else {
-          key = (key & o->key.mask1) >> o->key.boff;
-        }
-        empty = key == 0;
-      }
-
-      /*
-       * Return the key and value at position id. If the slot at id is
-       * empty, returns false. If the slot at position id has the large
-       * bit set, the key is resolved by looking backward in the
-       * table. The value returned on the other hand is the value at
-       * position id. No summation of the other entries for the key is
-       * done.
-       */
-      bool get_key_val(size_t id, word &key, word &val) const {
-        word           *w, *kvw, *fw = NULL;
-        const offset_t *o, *lo, *fo  = NULL;
-        bool            large;
-        uint_t          overflows;
-
-        overflows = 0;
-        while(true) {
-          w = offsets.get_word_offset(id, &o, &lo, data);
-          kvw = w + o->key.woff;
-          key = *kvw;
-          large = key & o->key.lb_mask;
-          if(large)
-            o = lo;
-          if(o->key.mask2) {
-            key = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
-            key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
-          } else {
-            key = (key & o->key.mask1) >> o->key.boff;
-          }
-
-          // Save offset and word for value retrieval
-          if(!fo) {
-            fo = o;
-            fw = w;
-          }
-
-          if(large) {
-            if(key)
-              id -= reprobes[key];
-            id = (id - reprobes[0]) & size_mask;
-            overflows++;
-          } else {
-            break;
-          }
-        }
-        if(!key)
-          return false;
-
-        kvw = fw + fo->val.woff;
-        val = ((*kvw) & fo->val.mask1) >> fo->val.boff;
-        if(fo->val.mask2) {
-          val |= ((*(kvw+1)) & fo->val.mask2) << fo->val.shift;
-        }
-        if(overflows > 0) {
-          val <<= offsets.get_val_len();
-          if(--overflows > 0)
-            val <<= offsets.get_lval_len() * overflows;
-        }
-        return true;
-      }
-
-      /*
-       * Return the key and value at position id. If the slot at id is
-       * empty or has the large bit set, returns false. Otherwise,
-       * returns the key and the value is the sum of all the entries
-       * in the hash table for that key. I.e., the table is search
-       * forward for entries with large bit set pointing back to the
-       * key at id, and all those values are summed up.
-       */
-      bool get_key_val_full(size_t id, word &key, word &val,
-                            bool carry_bit = false) const {
-        const offset_t	*o, *lo;
-        word		*w, *kvw, nkey, nval;
-        uint_t		 reprobe = 0, overflows = 0;
-        size_t		 cid;
-
-        w   = offsets.get_word_offset(id, &o, &lo, data);
-        kvw = w + o->key.woff;
-        key = *kvw;
-        if(key & o->key.lb_mask)
-          return false;
-        if(o->key.mask2) {
-          if((key & o->key.sb_mask1) == 0)
-            return false;
-          key  = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
-          key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift; 
-        } else {
-          key = (key & o->key.mask1) >> o->key.boff;
-          if(key == 0)
-            return false;
-        }
-
-        kvw = w + o->val.woff;
-        val = ((*kvw) & o->val.mask1) >> o->val.boff;
-        if(o->val.mask2)
-          val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
-
-        if(carry_bit) {
-          bool do_reprobe = val & 0x1;
-          val >>= 1;
-          if(!do_reprobe)
-            return true;
-        }
-
-        // Resolve value
-        reprobe = 0;
-        cid = id = (id + reprobes[0]) & size_mask;
-        while(reprobe <= reprobe_limit.val()) {
-          if(reprobe)
-            cid  = (id + reprobes[reprobe]) & size_mask;
-
-          w    = offsets.get_word_offset(cid, &o, &lo, data);
-          kvw  = w + o->key.woff;
-          nkey = *kvw;
-          if(nkey & o->key.lb_mask) {
-            if(lo->key.mask2) {
-              nkey  = (nkey & lo->key.mask1 & ~lo->key.sb_mask1) >> lo->key.boff;
-              nkey |= ((*(kvw+1)) & lo->key.mask2 & ~lo->key.sb_mask2) << lo->key.shift;
-            } else {
-              nkey = (nkey & lo->key.mask1) >> lo->key.boff;
-            }
-            if(nkey == reprobe) {
-              kvw = w + lo->val.woff;
-              nval = ((*kvw) & lo->val.mask1) >> lo->val.boff;
-              if(lo->val.mask2)
-                nval |= ((*(kvw+1)) & lo->val.mask2) << lo->val.shift;
-              bool do_reprobe = true;
-              if(carry_bit) {
-                do_reprobe = nval & 0x1;
-                nval >>= 1;
-              }
-
-              nval <<= offsets.get_val_len();
-              nval <<= offsets.get_lval_len() * overflows;
-              val += nval;
-
-              if(!do_reprobe)
-                return true;
-
-              overflows++;
-              reprobe = 0;
-              cid = id = (cid + reprobes[0]) & size_mask;
-              continue;
-            }
-          } else {
-            if(o->key.mask2) {
-              if((nkey & o->key.sb_mask1) == 0)
-                return true;
-            } else {
-              if((nkey & o->key.mask1) == 0)
-                return true;
-            }
-          }
-
-          reprobe++;
-        }
-
-        return true;
-      }
-
-      inline bool get_val(const word key, word &val, bool full = false,
-                          bool carry_bit = false) const {
-        uint64_t hash = hash_matrix.times(key);
-        size_t key_id;
-        return _get_val(hash & size_mask, key_id, (hash >> lsize) & key_mask, val, 
-                        full, carry_bit);
-      }
-
-      inline bool get_val(const word key, size_t &key_id, word &val, 
-                          bool full = false, bool carry_bit = false) const {
-        uint64_t hash = hash_matrix.times(key);
-        return _get_val(hash & size_mask, key_id, (hash >> lsize) & key_mask, val,
-                        full, carry_bit);
-      }
-
-      // /* InputIterator points to keys (words). OutputIterator points
-      //    to struct containing at least the fields { bool found; size_t
-      //    key_id; word val; }.
-      //  */
-      // template<typename InputIterator, typename OutputIterator>
-      // void get_multi_val(InputIterator key, const InputIterator& key_end,
-      //                    OutputIterator val, bool full, bool carry_bit) const {
-      //   uint64_t        phash, chash;
-      //   const offset_t *po, *plo, *co, *clo;
-      //   const word     *pw, *cw;
-
-      //   if(key == key_end)
-      //     return;
-
-      //   // Call __get_val with a delay. Let prefetch work while we
-      //   // compute the hash/get the previous key.
-      //   phash = hash_matrix.times(*key);
-      //   pw    = offsets.get_word_offset(phash & size_mask, &po, &plo, data);
-      //   //__builtin_prefetch(pw + po->key.woff, 0, 3);
-
-      //   for(++key; key != key_end; ++key, ++val) {
-      //     chash = hash_matrix.times(*key);
-      //     cw    = offsets.get_word_offset(chash & size_mask, &co, &clo, data);
-      //     //__builtin_prefetch(cw + co->key.woff, 0, 3);
-
-      //     val->found = __get_val(phash & size_mask, val->key_id, 
-      //                            (phash >> lsize) & key_mask, val->val,
-      //                            full, carry_bit, pw, po, plo);
-
-
-      //     pw    = cw;
-      //     po    = co;
-      //     plo   = clo;
-      //     phash = chash;
-      //   }
-      //   // Last one
-      //   val->found =  __get_val(phash & size_mask, val->key_id, 
-      //                           (phash >> lsize) & key_mask, val->val,
-      //                           full, carry_bit, pw, po, plo);
-      // }
-
-      struct prefetch_info {
-        const word*     w;
-        const offset_t *o, *lo;
-      };
-      typedef simple_circular_buffer::pre_alloc<prefetch_info, 8> prefetch_buffer;
-
-      void warm_up_cache(prefetch_buffer& buffer, size_t id, bool load_lo) const {
-        buffer.clear();
-        for(int i = 0; i < buffer.capacity(); ++i) {
-          buffer.push_back();
-          prefetch_info& info = buffer.back();
-          size_t         cid  = (id + (i > 0 ? reprobes[i] : 0)) & size_mask;
-          info.w              = offsets.get_word_offset(cid, &info.o, &info.lo, data);
-          __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
-          __builtin_prefetch(info.o, 0, 3);
-          if(load_lo)
-            __builtin_prefetch(info.lo, 0, 3);
-        }
-      }
-
-      void prefetch_next(prefetch_buffer& buffer, size_t id, uint_t reprobe, bool load_lo) const {
-        buffer.pop_front();
-        if(reprobe + buffer.capacity() <= reprobe_limit.val()) {
-          buffer.push_back();
-          prefetch_info& info = buffer.back();
-          size_t         fid  = (id + reprobes[reprobe + buffer.capacity() - 1]) & size_mask;
-          info.w = offsets.get_word_offset(fid, &info.o, &info.lo, data);
-          __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
-          __builtin_prefetch(info.o, 0, 3);
-          if(load_lo)
-            __builtin_prefetch(info.lo, 0, 3);
-        }
-
-      }
-
-      bool _get_val(const size_t id, size_t &key_id, const word key, word &val, 
-                           bool full = false, bool carry_bit = false) const {
-        // Buffer for pre-cached information
-        prefetch_info info_ary[prefetch_buffer::capacity()];
-        prefetch_buffer buffer(info_ary);
-        warm_up_cache(buffer, id, false);
-
-        return __get_val(id, key_id, key, val, full, carry_bit, buffer);
-      }
-
-      bool __get_val(const size_t id, size_t &key_id, const word key, word &val, 
-                     const bool full, bool carry_bit,
-                     prefetch_buffer& buffer) const {
-        const word     *kvw;
-        word            nkey, nval;
-        size_t          cid     = id;
-        uint_t          reprobe = 0;
-        word            akey    = key | ((word)1 << key_off);
-
-        // Find key
-        const offset_t *o, *lo;
-        const word* w;
-        while(true) {
-          prefetch_info& info = buffer.front();
-          w                   = info.w;
-          o                   = info.o;
-          kvw                 = w + o->key.woff;
-          nkey                = *kvw;
-      
-          if(!(nkey & o->key.lb_mask)) {
-            if(o->key.mask2) {
-              nkey = (nkey & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
-              nkey |=  ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
-            } else {
-              nkey = (nkey & o->key.mask1) >> o->key.boff;
-            }
-            if(nkey == akey)
-              break;
-          }
-          if(++reprobe > reprobe_limit.val())
-            return false;
-          // Do reprobe
-          cid  = (id + reprobes[reprobe]) & size_mask;
-          akey = key | ((reprobe + 1) << key_off);
-
-          prefetch_next(buffer, id, reprobe, false);
-        }
-
-        // Get value
-        kvw = w + o->val.woff;
-        val = ((*kvw) & o->val.mask1) >> o->val.boff;
-        if(o->val.mask2) {
-          val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
-        }
-        bool do_reprobe = true;
-        if(carry_bit) {
-          do_reprobe   = val & 0x1;
-          val        >>= 1;
-        }
-        key_id = cid;
-
-        // Eventually get large values...  TODO: this seems buggy. It
-        // only looks for large values once, not as many times as
-        // needed.
-        if(full && do_reprobe) {
-          const size_t bid = (cid + reprobes[0]) & size_mask;
-          cid = bid;
-
-          warm_up_cache(buffer, bid, true);
-
-          reprobe = 0;
-          do {
-            prefetch_info& info = buffer.front();
-            const word*    w    = info.w;
-            o                   = info.o;
-            lo                  = info.lo;
-            kvw                 = w + o->key.woff;
-            nkey                = *kvw;
-            if(nkey & o->key.lb_mask) {
-              if(lo->key.mask2) {
-                nkey = (nkey & lo->key.mask1 & ~lo->key.sb_mask1) >> lo->key.boff;
-                nkey |=  ((*(kvw+1)) & lo->key.mask2 & ~lo->key.sb_mask2) << lo->key.shift;
-              } else {
-                nkey = (nkey & lo->key.mask1) >> lo->key.boff;
-              }
-              if(nkey == reprobe) {
-                kvw = w + lo->val.woff;
-                nval = ((*kvw) & lo->val.mask1) >> lo->val.boff;
-                if(lo->val.mask2)
-                  nval |= ((*(kvw+1)) & lo->val.mask2) << lo->val.shift;
-                if(carry_bit) {
-                  nval >>= 1;
-                  val |= nval << (offsets.get_val_len() - 1);
-                } else
-                  val |= nval << offsets.get_val_len();
-                break; // Should break only if carry_bit of nval is
-                       // not set. Otherwise, we should reset the
-                       // reprobe to 0 and try again.
-              }
-            }
-
-            cid = (bid + reprobes[++reprobe]) & size_mask;
-            
-            prefetch_next(buffer, bid, reprobe, true);
-          } while(reprobe <= reprobe_limit.val());
-        }
-
-        return true;
-      }
-  
-      /**
-       * Use hash values as counters
-       */
-      inline bool add(word key, word val, word *oval = 0) {
-        uint64_t hash = hash_matrix.times(key);
-        return add_rec(hash & size_mask, (hash >> lsize) & key_mask,
-                       val, false, oval);
-      }
-
-      
-
-      /**
-       * Use hash as a set.
-       */
-      inline bool add(word _key, bool *is_new) __attribute__((deprecated)) {
-	size_t id;
-        return set(_key, is_new, &id);
-      }
-      inline bool set(word _key, bool *is_new) {
-	size_t id;
-	return set(_key, is_new, &id);
-      }
-      bool add(word _key, bool *is_new, size_t *id)  __attribute__((deprecated)) {
-        return set(_key, is_new, id);
-      }
-      bool set(word _key, bool *is_new, size_t *id) {
-        const offset_t *ao;
-        uint64_t hash = hash_matrix.times(_key);
-        word *w;
-        *id = hash & size_mask;
-        return claim_key((hash >> lsize) & key_mask, is_new, id, false,
-                         &ao, &w);
-      }
-
-      /**
-       * Use hash as a map. This sets a value with the key. It is only
-       * partially thread safe. I.e., multiple different key can be
-       * added concurrently. On the other hand, the same key can not
-       * be added at the same time by different thread: the value set
-       * may not be correct.
-       */
-      inline bool map(word _key, word val) {
-        bool   is_new;
-        return map(_key, val, &is_new);
-      }
-
-      bool map(word _key, word val, bool* is_new) {
-        uint64_t hash = hash_matrix.times(_key);
-        return map_rec(hash & size_mask, (hash >> lsize) & key_mask, val, false, 
-                       is_new);
-      }
-
-      void write_ary_header(std::ostream *out) const {
-        hash_matrix.dump(out);
-        hash_inverse_matrix.dump(out);
-      }
-
-      void write_raw(std::ostream *out) const {
-        if(out->tellp() & 0x7) { // Make sure aligned
-          std::string padding(0x8 - (out->tellp() & 0x7), '\0');
-          out->write(padding.c_str(), padding.size());
-        }
-        out->write((char *)mem_block.get_ptr(), mem_block.get_size());
-      }
-
-    private:
-      /* id is input/output. Equal to hash & size_maks on input. Equal
-       * to actual id where key was set on output. key is already hash
-       * shifted and masked to get higher bits. (>> lsize & key_mask)
-       *
-       * is_new is set on output to true if key did not exists in hash
-       * before. *ao points to the actual offsets object.
-       */
-      bool claim_key(const word &key, bool *is_new, size_t *id, bool large,
-                     const offset_t **_ao, word **_w) {
-        uint_t		 reprobe     = 0;
-        const offset_t	*o, *lo, *ao;
-        word		*w, *kw, nkey;
-        bool		 key_claimed = false;
-        size_t		 cid         = *id;
-        word		 akey        = large ? 0 :(key | ((word)1 << key_off));
-
-        do {
-          *_w  = w = offsets.get_word_offset(cid, &o, &lo, data);
-          *_ao = ao = large ? lo : o;
-
-          kw = w + ao->key.woff;
-
-          if(ao->key.mask2) { // key split on two words
-            nkey = akey << ao->key.boff;
-            nkey |= ao->key.sb_mask1;
-            if(large)
-              nkey |= ao->key.lb_mask;
-            nkey &= ao->key.mask1;
-
-            // Use o->key.mask1 and not ao->key.mask1 as the first one is
-            // guaranteed to be bigger. The key needs to be free on its
-            // longer mask to claim it!
-            key_claimed = set_key(kw, nkey, o->key.mask1, ao->key.mask1);
-            if(key_claimed) {
-              nkey = ((akey >> ao->key.shift) | ao->key.sb_mask2) & ao->key.mask2;
-              key_claimed = key_claimed && set_key(kw + 1, nkey, o->key.mask2, ao->key.mask2, is_new);
-            }
-          } else { // key on one word
-            nkey = akey << ao->key.boff;
-            if(large)
-              nkey |= ao->key.lb_mask;
-            nkey &= ao->key.mask1;
-            key_claimed = set_key(kw, nkey, o->key.mask1, ao->key.mask1, is_new);
-          }
-          if(!key_claimed) { // reprobe
-            if(++reprobe > reprobe_limit.val())
-              return false;
-            cid = (*id + reprobes[reprobe]) & size_mask;
-
-            if(large)
-              akey = reprobe;
-            else
-              akey = key | ((reprobe + 1) << key_off);
-          }
-        } while(!key_claimed);
-
-        *id = cid;
-        return true;
-      }
-
-      bool add_rec(size_t id, word key, word val, bool large, word *oval) {
-        const offset_t	*ao;
-        word		*w;
-
-        bool is_new = false;
-        if(!claim_key(key, &is_new, &id, large, &ao, &w))
-          return false;
-        if(oval)
-          *oval = !is_new;
-
-        // Increment value
-        word *vw = w + ao->val.woff;
-        word cary = add_val(vw, val, ao->val.boff, ao->val.mask1);
-        cary >>= ao->val.shift;
-        if(cary && ao->val.mask2) { // value split on two words
-          cary = add_val(vw + 1, cary, 0, ao->val.mask2);
-          cary >>= ao->val.cshift;
-        }
-        if(cary) {
-          id = (id + reprobes[0]) & size_mask;
-          if(add_rec(id, key, cary, true, 0))
-            return true;
-
-          // Adding failed, table is full. Need to back-track and
-          // substract val.
-          cary = add_val(vw, ((word)1 << offsets.get_val_len()) - val,
-                         ao->val.boff, ao->val.mask1);
-          cary >>= ao->val.shift;
-          if(cary && ao->val.mask2) {
-            // Can I ignore the cary here? Table is known to be full, so
-            // not much of a choice. But does it leave the table in a
-            // consistent state?
-            add_val(vw + 1, cary, 0, ao->val.mask2);
-          }
-          return false;
-        }
-        return true;
-      }
-
-      // Store val in the hash at position id. Reprobe and recurse if
-      // val does not fit in counter field. A bit is added at the
-      // beginning of the counting field indicating whether there is
-      // another entry for the same key further in the hash.
-      bool map_rec(size_t id, word key, word val, bool large, bool* is_new) {
-        const offset_t* ao;
-        word*           w;
-        bool            is_new_entry = false;
-        if(!claim_key(key, &is_new_entry, &id, large, &ao, &w))
-          return false;
-        if(is_new)
-          *is_new = is_new_entry;
-
-        // Determine if there will be a carry
-        val <<= 1;
-        val |= (val > offsets.get_max_val(large));
-
-        // Set value
-        word *vw         = w + ao->val.woff;
-        word  oval       = 0;
-        word  cary       = set_val(vw, val, ao->val.boff, ao->val.mask1, oval);
-        cary           >>= ao->val.shift;
-        bool  cary_bit   = oval & 0x1;
-        if(ao->val.mask2) { // value split on two words. Write even if
-                            // cary is 0 as there maybe some value in
-                            // there already
-          cary   = set_val(vw + 1, cary, 0, ao->val.mask2, oval);
-          cary >>= ao->val.cshift;
-        }
-        // Done if there is no carry and previous value did not have
-        // the carry_bit set
-        if(!cary && !cary_bit)
-          return true;
-        id = (id + reprobes[0]) & size_mask;
-        return map_rec(id, key, cary, true, 0);
-      }
-
-      inline bool set_key(word *w, word nkey, word free_mask, 
-                          word equal_mask) {
-        word ow = *w, nw, okey;
-
-        okey = ow & free_mask;
-        while(okey == 0) { // large bit not set && key is free
-          nw = atomic.cas(w, ow, ow | nkey);
-          if(nw == ow)
-            return true;
-          ow = nw;
-          okey = ow & free_mask;
-        }
-        return (ow & equal_mask) == nkey;
-      }
-
-      inline bool set_key(word *w, word nkey, word free_mask, 
-                          word equal_mask, bool *is_new) {
-        word ow = *w, nw, okey;
-
-        okey = ow & free_mask;
-        while(okey == 0) { // large bit not set && key is free
-          nw = atomic.cas(w, ow, ow | nkey);
-          if(nw == ow) {
-            *is_new = true;
-            return true;
-          }
-          ow = nw;
-          okey = ow & free_mask;
-        }
-        *is_new = false;
-        return (ow & equal_mask) == nkey;
-      }
-
-
-      inline word add_val(word *w, word val, uint_t shift, word mask) {
-        word now = *w, ow, nw, nval;
-
-        do {
-          ow = now;
-          nval = ((ow & mask) >> shift) + val;
-          nw = (ow & ~mask) | ((nval << shift) & mask);
-          now = atomic.cas(w, ow, nw);
-        } while(now != ow);
-
-        return nval & (~(mask >> shift));
-      }
-
-      inline word set_val(word *w, word val, uint_t shift, word mask,
-                          word& oval) {
-        word now = *w, ow, nw;
-        word sval = (val << shift) & mask;
-
-        do {
-          ow = now;
-          nw = (ow & ~mask) | sval;
-          now = atomic.cas(w, ow, nw);
-        } while(now != ow);
-
-        oval = (ow & mask) >> shift;
-        return val & (~(mask >> shift));
-      }
-    };
-
-    /*****/
-  }
-}
-
-#endif // __REVERSIBLE_HASH__
diff --git a/jellyfish/locking_hash_counters.hpp b/jellyfish/locking_hash_counters.hpp
deleted file mode 100644
index d26ec5e..0000000
--- a/jellyfish/locking_hash_counters.hpp
+++ /dev/null
@@ -1,372 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_LOCKING_HASH_COUNTERS__
-#define __JELLYFISH_LOCKING_HASH_COUNTERS__
-
-#include <new>
-#include <cstring>
-#include <iostream>
-#include <pthread.h>
-#include <stdint.h>
-using namespace std;
-
-struct stats {
-  unsigned int  key_conflicts;
-  unsigned int  val_conflicts;
-  unsigned int  destroyed_key;
-  unsigned int  destroyed_val;
-  unsigned int  maxed_out_val;
-  unsigned int  maxed_reprobe;
-  unsigned int  resized_arys;
-};
-#ifdef LOCKING_HASH_STATS
-#define LOCKING_HASH_STAT_INC(var) __sync_fetch_and_add(&stats->var, 1);
-#else
-#define LOCKING_HASH_STAT_INC(var)
-#endif
-
-template <class Key, class Val, class A>
-class arys_iterator {
-  A                     *ary;
-  unsigned long         pos;
-
-public:
-  Key key;
-  Val val;
-
-  explicit arys_iterator(A *_ary) : ary(_ary), pos(0) {
-  }
-
-  ~arys_iterator() { }
-
-  void rewind() { pos = 0; }
-
-  bool next() {
-    Key *ckey;
-    Val *cval;
-    
-    while(pos < ary->size) {
-      ary->get(pos++, &ckey, &cval);
-      key = *ckey;
-      if(key & 0x1) {
-        val = *cval;
-        key >>= 1;
-        return true;
-      }
-    }
-    return false;
-  }
-};
-
-class bad_size_exception: public exception
-{
-  virtual const char* what() const throw() {
-    return "Size must be a power of 2";
-  }
-};
-
-
-template <class Key, class Val, unsigned int nb, unsigned int shift, unsigned int mask>
-class arys_t {
-public:
-  typedef Key key_t;
-  typedef Val val_t;
-  /* Keys. Lower order bits are used internally.
-   * 0: is key set?
-   * 1: is key destroyed?
-   */
-  /* Values. Lower order bit is used internally.
-   * 0: is value destroyed?
-   */
-  typedef struct elt {
-    Key keys[nb];
-    Val vals[nb];
-  } elt;
-  elt *key_vals;
-
-  unsigned long size;
-  unsigned long esize;
-  unsigned long mod_mask;
-  bool          allocated;
-
-  /* arys are in a linked list. They are freed in reverse order of
-   * creation. The link from previous arys counts as 1 reference, to
-   * ensure proper order of deletion.
-   * The constructor is not thread safe (protect by mutex)
-   */
-  explicit arys_t(unsigned long _size) : 
-    allocated(true) {
-    size = 1;
-    while(_size > size) { size <<= 1; }
-    esize = size >> shift;
-    mod_mask = size - 1;
-    key_vals = new elt[esize];
-    memset(key_vals, '\0', sizeof(elt) * esize);
-  }
-
-  arys_t(unsigned long _size, char *map) :
-    allocated(false) {
-    size = 1;
-    while(_size > size) { size <<= 1; }
-    if(_size != size)
-      throw new bad_size_exception;
-    mod_mask = size - 1;
-    key_vals = (elt *)map;
-  }
-
-  ~arys_t() {
-    if(allocated)
-      delete[] key_vals;
-  }
-
-  inline void get(unsigned long idx, Key **k, Val **v) {
-    elt *e = &key_vals[idx >> shift];
-    *k = &e->keys[idx & mask];
-    *v = &e->vals[idx & mask];
-  }
-
-  typedef arys_iterator<Key,Val,arys_t> iterator;
-  arys_iterator<Key,Val,arys_t> * new_iterator() {
-    return new arys_iterator<Key,Val,arys_t>(this);
-  }
-};
-
-template <class Key, class Val, class arys_t>
-class thread_hash_counter {
-  arys_t                        * volatile *key_val_arys_ptr;
-  arys_t                        *key_val_arys;
-  unsigned int                  max_reprobe;
-  pthread_mutex_t               *hash_lock;
-  struct stats                  *stats;
-
-  void resize(arys_t *cary);
-  void no_lock_add(Key k, Val v);
-
-public:
-  thread_hash_counter(arys_t * volatile * _arys,
-                      unsigned int _max_reprobe,
-                      pthread_mutex_t *_hash_lock, struct stats *_stats) : 
-    key_val_arys_ptr(_arys), max_reprobe(_max_reprobe), 
-    hash_lock(_hash_lock), stats(_stats) {
-    key_val_arys = *key_val_arys_ptr;
-  }
-  
-  ~thread_hash_counter() { }
-  
-  inline void add(Key k, Val v);
-  inline void inc(Key k) { add(k, 1); }
-};
-
-template <class Key, class Val, class arys_t>
-class locking_hash_counter {
-  arys_t                        * volatile key_val_arys;
-  struct stats                  stats;
-  unsigned int                  max_reprobe;
-  pthread_mutex_t               hash_lock;
-
-public:
-  locking_hash_counter(unsigned long _size, unsigned int _max_reprobe);
-  ~locking_hash_counter();
-
-  typedef thread_hash_counter<Key, Val, arys_t> thread;
-
-  thread *new_hash_counter() {
-    return new thread_hash_counter<Key,Val,arys_t>(&key_val_arys, 
-                                                   max_reprobe, &hash_lock,
-                                                   &stats);
-  }
-
-  unsigned long size() { return key_val_arys->size; }
-
-  // Not thread safe
-  void print(ostream &out);
-  void print_debug(ostream &out);
-  void write_keys_vals(ostream &out);
-
-  int has_stats() { 
-#ifdef LOCKING_HASH_STATS
-    return 1;
-#else
-    return 0;
-#endif
-  };
-  void print_stats(ostream &out);
-};
-
-/*
- * Usefull sizes
- */
-typedef arys_t<uint64_t,uint32_t,2,1,0x1> arys_64_32_t;
-typedef locking_hash_counter<uint64_t,uint32_t,arys_64_32_t> chc_64_32_t;
-
-/*
- * locking_hash_counter
- */
-template <class Key, class Val, class arys_t>
-locking_hash_counter<Key,Val,arys_t>::locking_hash_counter(unsigned long _size, 
-                                                          unsigned int _max_reprobe) :
-  max_reprobe(_max_reprobe) {
-  key_val_arys = new arys_t(_size);
-  pthread_mutex_init(&hash_lock, NULL);
-  memset(&stats, 0, sizeof(stats));
-}
-
-template<class Key, class Val, class arys_t>
-locking_hash_counter<Key,Val,arys_t>::~locking_hash_counter() {
-  pthread_mutex_destroy(&hash_lock);
-  delete key_val_arys;
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print_debug(ostream &out) {
-//   unsigned long i;
-//   arys_t *carys = key_val_arys;
-//   Key key;
-
-//   for(i = 0; i < carys->size; i++) {
-//     key = carys->keys[i];
-//     if(key & 0x1)
-//       out << i << " " << (key >> 2) << " " << (key & 0x3) << " " << 
-//         (carys->vals[i] >> 1) << endl;
-//     else
-//       out << i << " Empty" << endl;
-//   }
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print(ostream &out) {
-  unsigned long i;
-  arys_t *carys = key_val_arys;
-  Key *ckey, key;
-  Val *cval;
-
-  for(i = 0; i < carys->size; i++) {
-    carys->get(i, &ckey, &cval);
-    key = *ckey;
-    if(key & 0x1)
-      out << (key >> 2) << " " << (*cval >> 1) << endl;
-  }
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::write_keys_vals(ostream &out) {
-  arys_t *carys = key_val_arys;
-
-  out.write((char *)carys->key_vals, sizeof(typename arys_t::elt) * carys->esize);
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print_stats(ostream &out) {
-#ifdef STATS
-#define PRINT_STAT(var) { out << #var ": " << stats.var << endl; }
-#else
-#define PRINT_STAT(var) { out << #var ": -" << endl; }
-#endif
-
-  PRINT_STAT(key_conflicts);
-  PRINT_STAT(val_conflicts);
-  PRINT_STAT(destroyed_key);
-  PRINT_STAT(destroyed_val);
-  PRINT_STAT(maxed_out_val);
-  PRINT_STAT(maxed_reprobe);
-  PRINT_STAT(resized_arys);
-}
-
-/*
- * thread_hash_counter
- */
-template <class Key, class Val, class arys_t>
-inline void thread_hash_counter<Key,Val,arys_t>::add(Key k, Val v) {
-  pthread_mutex_lock(hash_lock);
-  no_lock_add(k, v);
-  pthread_mutex_unlock(hash_lock);
-}
-
-template <class Key, class Val, class arys_t>
-void thread_hash_counter<Key,Val,arys_t>::no_lock_add(Key k, Val v) {
-  unsigned long idx;
-  Key key, inkey;
-  Val val, sval, cval;
-  arys_t *carys;
-  Key *ckeys;
-  Val *cvals;
-  unsigned int reprobe = 0;
-
-  inkey = (k << 1) | 0x1;
-  carys = *key_val_arys_ptr;
-  idx = k & carys->mod_mask;
-  while(1) {
-    carys->get(idx, &ckeys, &cvals);
-    key = *ckeys;
-    if(!(key & 0x1)) {    // Key is free
-      *ckeys = inkey;
-      break;
-    }
-    if(inkey == key) {    // Key already in
-      break;
-    }
-
-    // Reprobe, or resize and try again.
-    if(++reprobe > max_reprobe) {
-      LOCKING_HASH_STAT_INC(maxed_reprobe);
-      resize(carys);
-      carys = *key_val_arys_ptr;
-      idx = k & carys->mod_mask;
-    } else {
-      idx = (idx + 1) & carys->mod_mask; // reprobe
-    }
-  }
-
-  val = *cvals;
-  cval = ~val;
-  if(cval == (Val)0x0) { // If key at its max, do not increment
-    LOCKING_HASH_STAT_INC(maxed_out_val);
-  } else {
-    if(cval < v) { // Key reaches its max, truncate
-      sval = (Val)~0x0;
-      LOCKING_HASH_STAT_INC(maxed_out_val);
-    } else {
-      sval = val + v;
-    }
-    *cvals = sval;
-  }
-}
-
-template<class Key, class Val, class arys_t>
-void thread_hash_counter<Key,Val,arys_t>::resize(arys_t *carys) {
-  unsigned long i;
-  Key *ckey;
-  Val *cval;
-  arys_t *narys;
-
-  narys = new arys_t(carys->size << 1);
-  *key_val_arys_ptr = narys;  
-
-  // Copy over and free old data
-  Key key;
-  for(i = 0; i < carys->size; i++) {
-    carys->get(i, &ckey, &cval);
-    key = *ckey;
-    if(key & 0x1) { // Copy value
-      no_lock_add(key >> 1, *cval);
-    }
-  }
-  delete carys;
-  LOCKING_HASH_STAT_INC(resized_arys);
-}
-
-#endif /* __LOCKING_HASH_COUNTERS__ */
diff --git a/jellyfish/locks_pthread.hpp b/jellyfish/locks_pthread.hpp
deleted file mode 100644
index 63d2422..0000000
--- a/jellyfish/locks_pthread.hpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_LOCKS_PTHREAD_HPP__
-#define __JELLYFISH_LOCKS_PTHREAD_HPP__
-
-#include <pthread.h>
-
-namespace locks {
-  namespace pthread {
-    class cond
-    {
-      pthread_mutex_t   _mutex;
-      pthread_cond_t	_cond;
-      
-    public:
-      cond() { 
-        pthread_mutex_init(&_mutex, NULL);
-        pthread_cond_init(&_cond, NULL);
-      }
-      
-      ~cond() {
-        pthread_cond_destroy(&_cond);
-        pthread_mutex_destroy(&_mutex);
-      }
-      
-      inline void lock() { pthread_mutex_lock(&_mutex); }
-      inline void unlock() { pthread_mutex_unlock(&_mutex); }
-      inline void wait() { pthread_cond_wait(&_cond, &_mutex); }
-      inline void signal() { pthread_cond_signal(&_cond); }
-      inline void broadcast() { pthread_cond_broadcast(&_cond); }
-    };
-    
-    class mutex
-    {
-      pthread_mutex_t     _mutex;
-    
-    public:
-      mutex() {
-        pthread_mutex_init(&_mutex, NULL);
-      }
-    
-      ~mutex() {
-        pthread_mutex_destroy(&_mutex);
-      }
-    
-      inline void lock() { pthread_mutex_lock(&_mutex); }
-      inline void unlock() { pthread_mutex_unlock(&_mutex); }
-      inline bool try_lock() { return !pthread_mutex_trylock(&_mutex); }
-    };
-    
-    class Semaphore
-    {
-        int _value, _wakeups;
-        cond _cv;
-    public:
-        explicit Semaphore(int value) :
-          _value(value),
-          _wakeups(0)
-        {
-            // nothing to do
-        }
-
-        ~Semaphore() {}
-
-        inline void wait() {
-           _cv.lock();
-           _value--;
-           if (_value < 0) {
-             do {
-               _cv.wait();
-             } while(_wakeups < 1);
-             _wakeups--;
-           }
-           _cv.unlock();
-        }
-
-        inline void signal() {
-           _cv.lock();
-           _value++;
-           if(_value <= 0) {
-             _wakeups++;
-             _cv.signal();
-           }
-           _cv.unlock();
-        }
-    };
-
-#if defined(_POSIX_BARRIERS) && (_POSIX_BARRIERS - 20012L) >= 0
-    class barrier
-    {
-      pthread_barrier_t _barrier;
-      
-    public:
-      explicit barrier(unsigned count) {
-
-	pthread_barrier_init(&_barrier, NULL, count);
-      }
-      
-      ~barrier() {
-	pthread_barrier_destroy(&_barrier);
-      }
-      
-      inline int wait() {
-	return pthread_barrier_wait(&_barrier);
-      }
-    };
-
-#else
-#  ifndef PTHREAD_BARRIER_SERIAL_THREAD
-#    define  PTHREAD_BARRIER_SERIAL_THREAD 1
-#  endif
-
-    class barrier
-    {
-      int count; // required # of threads
-      int current;    // current # of threads that have passed thru
-      mutex barlock;  // protect current
-      Semaphore barrier1; // implement the barrier
-      Semaphore barrier2;
-
-    public:
-      explicit barrier(unsigned cnt) 
-        : count(cnt), current(0), barrier1(0), barrier2(0) {
-      }
-
-      ~barrier() {}
-
-      inline int wait() {
-        int ret = 0;
-        barlock.lock();
-        current += 1;
-        if(current == count) {
-          ret = PTHREAD_BARRIER_SERIAL_THREAD;
-          for(int i=0; i<count;i++) {
-            barrier1.signal();
-          }
-        }
-        barlock.unlock();
-        barrier1.wait(); // wait for n threads to arrive
-
-        barlock.lock();
-        current -= 1;
-        if(current == 0) {
-          for(int i=0;i<count;i++) {
-            barrier2.signal();
-          }
-        }
-        barlock.unlock();
-        barrier2.wait();
-        return ret;
-      }
-    };
-
-#endif
-  }
-}
-#endif
-
diff --git a/jellyfish/mapped_file.cc b/jellyfish/mapped_file.cc
deleted file mode 100644
index e1fbfb5..0000000
--- a/jellyfish/mapped_file.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/mapped_file.hpp>
-
-char mapped_file::load() const {
-  long sz     = sysconf(_SC_PAGESIZE);
-  char unused = 0;
-  for(char *w = _base; w < _base + _length; w += sz)
-    unused ^= *w;
-  return unused;
-}
diff --git a/jellyfish/mapped_file.hpp b/jellyfish/mapped_file.hpp
deleted file mode 100644
index 9c94d6c..0000000
--- a/jellyfish/mapped_file.hpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MAPPED_FILE_HPP__
-#define __JELLYFISH_MAPPED_FILE_HPP__
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <vector>
-#include <errno.h>
-#include <iostream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/dbg.hpp>
-
-class mapped_file {
-protected:
-  std::string  _path;
-  bool         _unmap;
-  char        *_base, *_end;
-  size_t       _length;
-
-  void map(const char *filename) {
-    int fd = open(filename, O_RDONLY);
-    struct stat stat;
-    
-    if(fd < 0)
-      eraise(ErrorMMap) << "Can't open file '" << filename << "'" << err::no;
-    
-    if(fstat(fd, &stat) < 0)
-      eraise(ErrorMMap) << "Can't stat file '" << filename << "'" << err::no;
-
-    _length = stat.st_size;
-    _base = (char *)mmap(NULL, _length, PROT_READ, MAP_PRIVATE, fd, 0);
-    if(_base == MAP_FAILED)
-      eraise(ErrorMMap) << "Can't mmap file '" << filename << "'" << err::no;
-    close(fd);
-    _end = _base + _length;
-  }
-  
-public:
-  define_error_class(ErrorMMap);
-  mapped_file(char *__base, size_t __length) :
-    _unmap(false), _base(__base), _end(__base + __length), _length(__length) {}
-
-  explicit mapped_file(const char *filename) : _path(filename), _unmap(false) {
-    map(filename);
-  }
-  mapped_file(const mapped_file &mf) : 
-    _path(mf.path()), _unmap(false), _base(mf._base), _end(mf._end),
-    _length(mf._length) {}
-
-  ~mapped_file() {
-    if(_unmap)
-      unmap();
-  }
-
-  void unmap() {
-    if(!_base)
-      return;
-    munmap(_base, _length);
-    _base = 0;
-    _length = 0;
-  }
-
-  char *base() const { return _base; }
-  char *end() const { return _end; }
-  size_t length() const { return _length; }
-  std::string path() const { return _path; }
-
-  bool will_unmap(bool value = true) {
-    bool ovalue = _unmap;
-    _unmap = value;
-    return ovalue;
-  }
-  // No error checking here. Should I throw something?
-  const mapped_file & will_need() const {
-    madvise(_base, _length, MADV_WILLNEED);
-    return *this;
-  }
-  const mapped_file & sequential() const {
-    madvise(_base, _length, MADV_SEQUENTIAL);
-    return *this;
-  }
-  const mapped_file & random() const {
-    madvise(_base, _length, MADV_RANDOM);
-    return *this;
-  }
-  const mapped_file & lock() const {
-    if(mlock(_base, _length) < 0)
-      eraise(ErrorMMap) << "Can't lock map in memory" << err::no;
-    return *this;
-  }
-
-  // Do not optimize. Side effect is that every page is accessed and should now be in cache.
-  // The flagg __attribute__((optimize(0))) does not compile, so return a useless char argument
-  char load() const;
-};
-
-class mapped_files_t : public std::vector<mapped_file> {
-public:
-  mapped_files_t(int nb_files, char *argv[]) {
-    for(int j = 0; j < nb_files; j++)
-      push_back(mapped_file(argv[j]));
-  }
-
-  mapped_files_t(int nb_files, char *argv[], bool sequential) {
-    for(int j = 0; j < nb_files; j++) {
-      push_back(mapped_file(argv[j]));
-      if(sequential)
-        end()->sequential();
-    }
-  }
-};
-
-// File mapped on demand.
-class lazy_mapped_file_t : public mapped_file {
-  std::string       _path;
-  volatile bool     done;
-  volatile long     used_counter;
-
-public:
-  explicit lazy_mapped_file_t(const char *path) : 
-    mapped_file((char *)0, (size_t)0),
-    _path(path), done(false), used_counter(0) {}
-  
-  void map() {
-    used_counter = 1;
-    done = false;
-    mapped_file::map(_path.c_str());
-  }
-  void unmap() { 
-    done = true;
-    dec();
-  }
-
-  void inc() {
-    atomic::gcc::fetch_add(&used_counter, (long)1);
-  }
-  void dec() {
-    long val = atomic::gcc::add_fetch(&used_counter, (long)-1);
-    if(done && val == 0)
-      mapped_file::unmap();
-  }
-};
-
-class lazy_mapped_files_t : public std::vector<lazy_mapped_file_t> {
-public:
-  lazy_mapped_files_t(int nb_files, char *argv[]) {
-    for(int j = 0; j < nb_files; j++)
-      push_back(lazy_mapped_file_t(argv[j]));
-  }
-
-  lazy_mapped_files_t(int nb_files, char *argv[], bool sequential) {
-    for(int j = 0; j < nb_files; j++) {
-      push_back(lazy_mapped_file_t(argv[j]));
-      if(sequential)
-        end()->sequential();
-    }
-  }
-};
-
-#endif
diff --git a/jellyfish/mer_counter.cc b/jellyfish/mer_counter.cc
deleted file mode 100644
index 0a4502f..0000000
--- a/jellyfish/mer_counter.cc
+++ /dev/null
@@ -1,379 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <pthread.h>
-#include <fstream>
-#include <exception>
-#include <memory>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/backtrace.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/time.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/count_main_cmdline.hpp>
-#include <jellyfish/noop_dumper.hpp>
-
-// Temporary
-//#include <jellyfish/measure_dumper.hpp>
-
-void die_on_error(std::string& err) {
-  std::cerr << "Error: " << err << std::endl;
-  exit(1);
-}
-
-void warn_on_error(std::string& err) {
-  std::cerr << "Warn: " << err << std::endl;
-}
-
-
-// TODO: This mer_counting_base stuff has become wild. Lots of code
-// duplication and slightly different behavior for each (e.g. setup of
-// the hashing matrix). Refactor!
-class mer_counting_base {
-public:
-  virtual ~mer_counting_base() {}
-  virtual void count() = 0;
-  virtual Time get_writing_time() const = 0;
-  virtual uint64_t get_distinct() const = 0;
-  virtual uint64_t get_total() const = 0;
-};
-
-template <typename parser_t, typename hash_t>
-class mer_counting : public mer_counting_base, public thread_exec {
-protected:
-  count_args                 *args;
-  locks::pthread::barrier     sync_barrier;
-  parser_t                   *parser;
-  typename hash_t::storage_t *ary;
-  hash_t                     *hash;
-  jellyfish::dumper_t        *dumper;
-  uint64_t                    distinct, total;
-
-public:
-  explicit mer_counting(count_args &_args) :
-    args(&_args), sync_barrier(args->threads_arg),
-    distinct(0), total(0) {}
-
-  ~mer_counting() { 
-    if(dumper)
-      delete dumper;
-    if(hash)
-      delete hash;
-    if(ary)
-      delete ary;
-    if(parser)
-      delete parser;
-  }
-  
-  void start(int id) {
-    sync_barrier.wait();
-
-    typename parser_t::thread     mer_stream(parser->new_thread());
-    typename hash_t::thread_ptr_t counter(hash->new_thread());
-
-    if(args->invalid_char_arg != count_args::invalid_char::ignore) {
-      if(args->invalid_char_arg == count_args::invalid_char::warn)
-        mer_stream.set_error_reporter(warn_on_error);
-      else
-        mer_stream.set_error_reporter(die_on_error);
-    }
-
-    mer_stream.parse(counter);
-
-    bool is_serial = sync_barrier.wait() == PTHREAD_BARRIER_SERIAL_THREAD;
-    if(is_serial) {
-      hash->dump();
-    }
-
-    atomic::gcc::fetch_add(&distinct, mer_stream.get_distinct());
-    atomic::gcc::fetch_add(&total, mer_stream.get_total());
-  }
-  
-  void count() {
-    exec_join(args->threads_arg);
-  }
-
-  virtual Time get_writing_time() const { return hash->get_writing_time(); }
-  virtual uint64_t get_distinct() const { return distinct; }
-  virtual uint64_t get_total() const { return total; }
-};
-
-class mer_counting_fasta_hash : public mer_counting<jellyfish::parse_dna, inv_hash_t> {
-public:
-  mer_counting_fasta_hash(const std::vector<const char *> &files,
-                          count_args &_args) :
-    mer_counting<jellyfish::parse_dna, inv_hash_t>(_args)
-  {
-    parser = new jellyfish::parse_dna(files.begin(), files.end(),
-                                      args->mer_len_arg, args->buffers_arg,
-                                      args->buffer_size_arg);
-    ary = new inv_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
-                                    args->counter_len_arg, 
-                                    args->reprobes_arg, 
-                                    jellyfish::quadratic_reprobes);
-    if(args->matrix_given) {
-      std::ifstream fd;
-      fd.exceptions(std::ifstream::eofbit|std::ifstream::failbit|std::ifstream::badbit);
-      fd.open(args->matrix_arg.c_str());
-      SquareBinaryMatrix m(&fd);
-      fd.close();
-      ary->set_matrix(m);
-    }
-    hash = new inv_hash_t(ary);
-
-    if(args->no_write_flag) {
-      dumper = new jellyfish::noop_dumper();
-    } else {
-      // if(args->measure) {
-      //   dumper = new jellyfish::measure_dumper<inv_hash_t::storage_t>(ary);
-      // } else
-      if(args->raw_flag) {
-        dumper = new raw_inv_hash_dumper_t((uint_t)4, args->output_arg.c_str(),
-                                           args->out_buffer_size_arg, ary);
-      } else {
-        inv_hash_dumper_t *_dumper =
-          new inv_hash_dumper_t(args->threads_arg, args->output_arg.c_str(),
-                                args->out_buffer_size_arg, 
-                                8*args->out_counter_len_arg, ary);
-        _dumper->set_one_file(args->O_flag);
-        if(args->lower_count_given)
-          _dumper->set_lower_count(args->lower_count_arg);
-        if(args->upper_count_given)
-          _dumper->set_upper_count(args->upper_count_arg);
-        dumper = _dumper;
-      }
-    }
-    hash->set_dumper(dumper);
-    parser->set_canonical(args->both_strands_flag);
-  }
-};
-
-class mer_counting_qual_fasta_hash : public mer_counting<jellyfish::parse_qual_dna, inv_hash_t> {
-public:
-  mer_counting_qual_fasta_hash(const std::vector<const char *> &files,
-                               count_args &_args) :
-    mer_counting<jellyfish::parse_qual_dna, inv_hash_t>(_args)
-  {
-    parser = new jellyfish::parse_qual_dna(files,
-                                           args->mer_len_arg, args->buffers_arg,
-                                           args->buffer_size_arg, args->quality_start_arg,
-                                           args->min_quality_arg);
-    ary = new inv_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
-                                    args->counter_len_arg, 
-                                    args->reprobes_arg, 
-                                    jellyfish::quadratic_reprobes);
-    if(args->matrix_given) {
-      std::ifstream fd;
-      fd.exceptions(std::ifstream::eofbit|std::ifstream::failbit|std::ifstream::badbit);
-      fd.open(args->matrix_arg.c_str());
-      SquareBinaryMatrix m(&fd);
-      fd.close();
-      ary->set_matrix(m);
-    }
-    hash = new inv_hash_t(ary);
-
-    if(args->no_write_flag) {
-      dumper = new jellyfish::noop_dumper();
-    } else {
-      if(args->raw_flag) {
-        dumper = new raw_inv_hash_dumper_t((uint_t)4, args->output_arg.c_str(),
-                                           args->out_buffer_size_arg, ary);
-      } else {
-        inv_hash_dumper_t *_dumper =
-          new inv_hash_dumper_t(args->threads_arg, args->output_arg.c_str(),
-                                args->out_buffer_size_arg, 
-                                8*args->out_counter_len_arg, ary);
-        _dumper->set_one_file(args->O_flag);
-        if(args->lower_count_given)
-          _dumper->set_lower_count(args->lower_count_arg);
-        if(args->upper_count_given)
-          _dumper->set_upper_count(args->upper_count_arg);
-        dumper = _dumper;
-      }
-    }
-    hash->set_dumper(dumper);
-    parser->set_canonical(args->both_strands_flag);
-  }
-};
-
-
-class mer_counting_fasta_direct : public mer_counting<jellyfish::parse_dna, direct_index_t> {
-public:
-  mer_counting_fasta_direct(const std::vector<const char *> &files,
-                            count_args &_args) :
-    mer_counting<jellyfish::parse_dna, direct_index_t>(_args)
-  {
-    parser = new jellyfish::parse_dna(files.begin(), files.end(),
-                                      args->mer_len_arg, args->buffers_arg,
-                                      args->buffer_size_arg);
-    ary = new direct_index_t::storage_t(2 * args->mer_len_arg);
-    hash = new direct_index_t(ary);
-    if(args->no_write_flag) {
-      dumper = new jellyfish::noop_dumper();
-    } else {
-      if(args->raw_flag)
-        std::cerr << "Switch --raw not (yet) supported with direct indexing. Ignoring." << std::endl;
-      direct_index_dumper_t *_dumper =
-        new direct_index_dumper_t(args->threads_arg, args->output_arg.c_str(),
-                                  args->out_buffer_size_arg,
-                                  8*args->out_counter_len_arg,
-                                  ary);
-      _dumper->set_one_file(args->O_flag);
-      if(args->lower_count_given)
-        _dumper->set_lower_count(args->lower_count_arg);
-      if(args->upper_count_given)
-        _dumper->set_upper_count(args->upper_count_arg);
-      dumper = _dumper;
-    }
-    hash->set_dumper(dumper);
-    parser->set_canonical(args->both_strands_flag);
-  }
-};
-
-class mer_counting_qual_fasta_direct : public mer_counting<jellyfish::parse_qual_dna, direct_index_t> {
-public:
-  mer_counting_qual_fasta_direct(const std::vector<const char *> &files,
-                                 count_args &_args) :
-    mer_counting<jellyfish::parse_qual_dna, direct_index_t>(_args)
-  {
-    parser = new jellyfish::parse_qual_dna(files,
-                                           args->mer_len_arg, args->buffers_arg,
-                                           args->buffer_size_arg, args->quality_start_arg,
-                                           args->min_quality_arg);
-    ary = new direct_index_t::storage_t(2 * args->mer_len_arg);
-    hash = new direct_index_t(ary);
-    if(args->no_write_flag) {
-      dumper = new jellyfish::noop_dumper();
-    } else {
-      if(args->raw_flag)
-        std::cerr << "Switch --raw not (yet) supported with direct indexing. Ignoring." << std::endl;
-      direct_index_dumper_t *_dumper =
-        new direct_index_dumper_t(args->threads_arg, args->output_arg.c_str(),
-                                  args->out_buffer_size_arg,
-                                  8*args->out_counter_len_arg,
-                                  ary);
-      _dumper->set_one_file(args->O_flag);
-      if(args->lower_count_given)
-        _dumper->set_lower_count(args->lower_count_arg);
-      if(args->upper_count_given)
-        _dumper->set_upper_count(args->upper_count_arg);
-      dumper = _dumper;
-    }
-    hash->set_dumper(dumper);
-    parser->set_canonical(args->both_strands_flag);
-  }
-};
-
-class mer_counting_quake : public mer_counting<jellyfish::parse_quake, fastq_hash_t> {
-public:
-  mer_counting_quake(std::vector<const char *>,
-                     count_args &_args) :
-    mer_counting<jellyfish::parse_quake, fastq_hash_t>(_args)
-  {
-    parser = new jellyfish::parse_quake(args->file_arg,
-                                        args->mer_len_arg, args->buffers_arg, 
-                                        args->buffer_size_arg, 
-                                        args->quality_start_arg);
-    ary = new fastq_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
-                                      args->reprobes_arg, 
-                                      jellyfish::quadratic_reprobes);
-    hash = new fastq_hash_t(ary);
-    if(args->no_write_flag) {
-      dumper = new jellyfish::noop_dumper();
-    } else {
-      dumper = new raw_fastq_dumper_t(args->threads_arg, args->output_arg.c_str(),
-                                      args->out_buffer_size_arg,
-                                      ary);
-    }
-    hash->set_dumper(dumper);
-    parser->set_canonical(args->both_strands_flag);
-  }
-};
-
-int count_main(int argc, char *argv[])
-{
-  count_args args(argc, argv);
-
-  if(args.mer_len_arg < 2 || args.mer_len_arg > 31)
-    die << "Invalid mer length '" << args.mer_len_arg
-        << "'. It must be in [2, 31].";
-
-  Time start;
-  mer_counting_base *counter;
-  if(!args.buffers_given)
-    args.buffers_arg = 20 * args.threads_arg;
-
-  if(args.quake_flag) {
-    counter = new mer_counting_quake(args.file_arg, args);
-  } else if(ceilLog2((unsigned long)args.size_arg) > 2 * (unsigned long)args.mer_len_arg) {
-    if(args.min_quality_given)
-      counter = new mer_counting_qual_fasta_direct(args.file_arg, args);
-    else
-      counter = new mer_counting_fasta_direct(args.file_arg, args);
-  } else if(args.min_quality_given) {
-    counter = new mer_counting_qual_fasta_hash(args.file_arg, args);
-  } else {
-    counter = new mer_counting_fasta_hash(args.file_arg, args);
-  }
-  Time after_init;
-  counter->count();
-  Time all_done;
-
-  if(args.timing_given) {
-    std::ofstream timing_fd(args.timing_arg);
-    if(!timing_fd.good()) {
-      std::cerr << "Can't open timing file '" << args.timing_arg << err::no
-                << std::endl;
-    } else {
-      Time writing = counter->get_writing_time();
-      Time counting = (all_done - after_init) - writing;
-      timing_fd << "Init     " << (after_init - start).str() << "\n"
-                << "Counting " << counting.str() << "\n"
-                << "Writing  " << writing.str() << "\n";
-      timing_fd.close();
-    }
-  }
-
-  if(args.stats_given) {
-    std::ofstream stats_fd(args.stats_arg);
-    if(!stats_fd.good()) {
-      std::cerr << "Can't open stats file '" << args.stats_arg << err::no
-                << std::endl;
-    } else {
-      stats_fd << "Distinct: " << counter->get_distinct() << "\n"
-               << "Total:    " << counter->get_total() << std::endl;
-      stats_fd.close();
-    }
-  }
-
-  return 0;
-}
diff --git a/jellyfish/mer_counting.hpp b/jellyfish/mer_counting.hpp
deleted file mode 100644
index 42bc2c2..0000000
--- a/jellyfish/mer_counting.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MER_COUNTING__
-#define __JELLYFISH_MER_COUNTING__
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <vector>
-#include <utility>
-
-#include <jellyfish/misc.hpp>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/hash.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/compacted_dumper.hpp>
-#include <jellyfish/raw_dumper.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/parse_qual_dna.hpp>
-
-// Invertible hash types
-#include <jellyfish/invertible_hash_array.hpp>
-#include <jellyfish/sorted_dumper.hpp>
-typedef jellyfish::invertible_hash::array<uint64_t,atomic::gcc,allocators::mmap> inv_hash_storage_t;
-typedef jellyfish::sorted_dumper< inv_hash_storage_t,atomic::gcc> inv_hash_dumper_t;
-typedef jellyfish::raw_hash::dumper<inv_hash_storage_t> raw_inv_hash_dumper_t;
-typedef jellyfish::raw_hash::query<inv_hash_storage_t> raw_inv_hash_query_t;
-typedef jellyfish::hash< uint64_t,uint64_t,inv_hash_storage_t,atomic::gcc > inv_hash_t;
-
-// Direct indexing types
-#include <jellyfish/direct_indexing_array.hpp>
-#include <jellyfish/direct_sorted_dumper.hpp>
-#include <jellyfish/capped_integer.hpp>
-typedef jellyfish::direct_indexing::array<uint64_t,jellyfish::capped_integer<uint32_t>,atomic::gcc,allocators::mmap> direct_index_storage_t;
-typedef jellyfish::direct_sorted_dumper< direct_index_storage_t, atomic::gcc> direct_index_dumper_t;
-typedef jellyfish::hash< uint64_t,jellyfish::capped_integer<uint32_t>,direct_index_storage_t,atomic::gcc> direct_index_t;
-
-// Quake types
-#include <jellyfish/aligned_values_array.hpp>
-#include <jellyfish/floats.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/parse_quake.hpp>
-typedef jellyfish::aligned_values::array<uint64_t,jellyfish::Float,atomic::gcc,allocators::mmap> fastq_storage_t;
-typedef jellyfish::hash<uint64_t,jellyfish::Float,fastq_storage_t,atomic::gcc> fastq_hash_t;
-typedef jellyfish::fastq_hash::raw_dumper<fastq_storage_t> raw_fastq_dumper_t;
-
-// Compacted hash types
-typedef jellyfish::compacted_hash::reader<uint64_t,uint64_t> hash_reader_t;
-typedef jellyfish::compacted_hash::query<uint64_t,uint64_t> hash_query_t;
-typedef jellyfish::compacted_hash::writer<hash_reader_t> hash_writer_t;
-
-#endif /* __MER_COUNTING__ */
diff --git a/jellyfish/merge_files.cc b/jellyfish/merge_files.cc
new file mode 100644
index 0000000..66fe517
--- /dev/null
+++ b/jellyfish/merge_files.cc
@@ -0,0 +1,151 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <jellyfish/merge_files.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <memory>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace err = jellyfish::err;
+
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using jellyfish::cpp_array;
+typedef std::auto_ptr<binary_reader> binary_reader_ptr;
+typedef std::auto_ptr<text_reader> text_reader_ptr;
+
+struct file_info {
+  std::ifstream is;
+  file_header   header;
+
+  file_info(const char* path) :
+  is(path),
+  header(is)
+  { }
+};
+typedef std::auto_ptr<RectangularBinaryMatrix> matrix_ptr;
+
+template<typename reader_type, typename writer_type>
+void do_merge(cpp_array<file_info>& files, std::ostream& out, writer_type& writer,
+              uint64_t min, uint64_t max) {
+  cpp_array<reader_type> readers(files.size());
+  typedef jellyfish::mer_heap::heap<mer_dna, reader_type> heap_type;
+  typedef typename heap_type::const_item_t heap_item;
+  heap_type heap(files.size());
+
+  for(size_t i = 0; i < files.size(); ++i) {
+    readers.init(i, files[i].is, &files[i].header);
+    if(readers[i].next())
+      heap.push(readers[i]);
+  }
+
+  heap_item head = heap.head();
+  mer_dna   key;
+  while(heap.is_not_empty()) {
+    key = head->key_;
+    uint64_t sum = 0;
+    do {
+      sum += head->val_;
+      heap.pop();
+      if(head->it_->next())
+        heap.push(*head->it_);
+      head = heap.head();
+    } while(head->key_ == key && heap.is_not_empty());
+    if(sum >= min && sum <= max)
+      writer.write(out, key, sum);
+  }
+}
+
+// Merge files. Throws an error if unsuccessful.
+void merge_files(std::vector<const char*> input_files,
+                 const char* out_file,
+                 file_header& out_header,
+                 uint64_t min, uint64_t max) {
+  unsigned int key_len            = 0;
+  size_t       max_reprobe_offset = 0;
+  size_t       size               = 0;
+  unsigned int out_counter_len    = std::numeric_limits<unsigned int>::max();
+  std::string  format;
+  matrix_ptr   matrix;
+
+  cpp_array<file_info> files(input_files.size());
+
+  // create an iterator for each hash file
+  for(size_t i = 0; i < files.size(); i++) {
+    files.init(i, input_files[i]);
+    if(!files[i].is.good())
+      throw MergeError(err::msg() << "Failed to open input file '" << input_files[i] << "'");
+
+    file_header& h = files[i].header;
+    if(i == 0) {
+      key_len            = h.key_len();
+      max_reprobe_offset = h.max_reprobe_offset();
+      size               = h.size();
+      matrix.reset(new RectangularBinaryMatrix(h.matrix()));
+      out_header.size(size);
+      out_header.key_len(key_len);
+      format = h.format();
+      out_header.matrix(*matrix);
+      out_header.max_reprobe(h.max_reprobe());
+      size_t reprobes[h.max_reprobe() + 1];
+      h.get_reprobes(reprobes);
+      out_header.set_reprobes(reprobes);
+      out_counter_len = std::min(out_counter_len, h.counter_len());
+    } else {
+      if(format != h.format())
+        throw MergeError(err::msg() << "Can't merge files with different formats (" << format << ", " << h.format() << ")");
+      if(h.key_len() != key_len)
+        throw MergeError(err::msg() << "Can't merge hashes of different key lengths (" << key_len << ", " << h.key_len() << ")");
+      if(h.max_reprobe_offset() != max_reprobe_offset)
+        throw MergeError("Can't merge hashes with different reprobing strategies");
+      if(h.size() != size)
+        throw MergeError(err::msg() << "Can't merge hash with different size (" << size << ", " << h.size() << ")");
+      if(h.matrix() != *matrix)
+        throw MergeError("Can't merge hash with different hash function");
+    }
+  }
+  mer_dna::k(key_len / 2);
+
+  std::ofstream out(out_file);
+  if(!out.good())
+    throw MergeError(err::msg() << "Can't open out file '" << out_file << "'");
+  out_header.format(format);
+
+  if(!format.compare(binary_dumper::format)) {
+    out_header.counter_len(out_counter_len);
+    out_header.write(out);
+    binary_writer writer(out_counter_len, key_len);
+    do_merge<binary_reader, binary_writer>(files, out, writer, min, max);
+  } else if(!format.compare(text_dumper::format)) {
+    out_header.write(out);
+    text_writer writer;
+    do_merge<text_reader, text_writer>(files, out, writer, min, max);
+  } else {
+    throw MergeError(err::msg() << "Unknown format '" << format << "'");
+  }
+  out.close();
+}
diff --git a/jellyfish/err.cc b/jellyfish/merge_files.hpp
similarity index 63%
copy from jellyfish/err.cc
copy to jellyfish/merge_files.hpp
index 933d488..d717975 100644
--- a/jellyfish/err.cc
+++ b/jellyfish/merge_files.hpp
@@ -14,16 +14,17 @@
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#ifndef __JELLYFISH_MERGE_FILES_HPP__
+#define __JELLYFISH_MERGE_FILES_HPP__
+
+#include <vector>
 #include <jellyfish/err.hpp>
+#include <jellyfish/file_header.hpp>
+
+define_error_class(MergeError);
+
+/// Merge files. Throw a MergeError in case of error.
+void merge_files(std::vector<const char*> input_files, const char* out_file,
+                 jellyfish::file_header& h, uint64_t min, uint64_t max);
 
-namespace err {
-  std::ostream &operator<<(std::ostream &os, const err::substr &ss) {
-    os.write(ss._s, ss._l);
-    return os;
-  }
-
-  std::ostream &operator<<(std::ostream &os, const err::no_t &x) {
-    x.write(os, errno);
-    return os;
-  }
-}
+#endif /* __JELLYFISH_MERGE_FILES_HPP__ */
diff --git a/jellyfish/misc.hpp b/jellyfish/misc.hpp
deleted file mode 100644
index 889adf5..0000000
--- a/jellyfish/misc.hpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MISC_HPP__
-#define __JELLYFISH_MISC_HPP__
-
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <exception>
-#include <stdexcept>
-#include <string>
-#include <new>
-#include <ostream>
-#include <utility>
-
-#define bsizeof(v)      (8 * sizeof(v))
-typedef uint_fast64_t uint_t;
-//#define UINT_C(x)       
-#define PRIUINTu PRIuFAST64
-#define PRIUINTx PRIxFAST64
-
-inline int leading_zeroes(int x) { return __builtin_clz(x); } // CLK
-inline int leading_zeroes(unsigned int x) { return __builtin_clz(x); }
-inline int leading_zeroes(unsigned long x) { return __builtin_clzl(x); }
-inline int leading_zeroes(unsigned long long x) { return __builtin_clzll(x); }
-
-
-template <typename T>
-unsigned int floorLog2(T n) {
-  return sizeof(T) * 8 - 1 - leading_zeroes(n);
-}
-
-template<typename T>
-uint_t ceilLog2(T n) {
-  uint_t r = floorLog2(n);
-  return n > (((T)1) << r) ? r + 1 : r;
-}
-
-template<typename T>
-T div_ceil(T a, T b) {
-  T q = a / b;
-  return a % b == 0 ? q : q + 1;
-}
-
-template<typename T>
-uint_t bitsize(T n) {
-  return floorLog2(n) + 1;
-}
-
-inline uint32_t reverse_bits(uint32_t v) {
-  // swap odd and even bits
-  v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
-  // swap consecutive pairs
-  v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
-  // swap nibbles ... 
-  v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
-  // swap bytes
-  v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
-  // swap 2-byte long pairs
-  v = ( v >> 16             ) | ( v               << 16);
-  return v;
-}
-
-inline uint64_t reverse_bits(uint64_t v) {
-  v = ((v >> 1)  & 0x5555555555555555UL) | ((v & 0x5555555555555555UL) << 1);
-  v = ((v >> 2)  & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
-  v = ((v >> 4)  & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
-  v = ((v >> 8)  & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
-  v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
-  v = ( v >> 32                        ) | ( v                         << 32);
-  return v;
-}
-
-uint64_t bogus_sum(void *data, size_t len);
-
-template <typename T>
-size_t bits_to_bytes(T bits) {
-  return (size_t)((bits / 8) + (bits % 8 != 0));
-}
-
-template <typename T>
-union Tptr {
-  void *v;
-  T    *t;
-};
-template <typename T>
-T *calloc_align(size_t nmemb, size_t alignment) {
-  Tptr<T> ptr;
-  if(posix_memalign(&ptr.v, alignment, sizeof(T) * nmemb) < 0)
-    throw std::bad_alloc();
-  return ptr.t;
-}
-
-/* Be pedantic about memory access. Any misaligned access will
- * generate a BUS error.
- */
-void disabled_misaligned_mem_access();
-
-/* Raison d'etre of this version of mem_copy: It seems we have slow
- * down due to misaligned cache accesses. glibc memcpy does unaligned
- * memory accesses and crashes when they are disabled. This version
- * does only aligned memory access (see above).
- */
-template <typename T>
-void mem_copy(char *dest,  const char *src, const T &len) {
-  // dumb copying char by char
-  for(T i = (T)0; i < len; ++i)
-    *dest++ = *src++;
-}
-
-/* Slice a large number (total) in almost equal parts. return [start,
-   end) corresponding to the ith part (0 <= i < number_of_slices)
- */
-template<typename T>
-std::pair<T,T> slice(T i, T number_of_slices, T total) {
-  if(number_of_slices > 1)
-    --number_of_slices;
-  T slice_size = total / number_of_slices;
-  T slice_remain = total % number_of_slices;
-  T start = std::min(total, i * slice_size + i * slice_remain / number_of_slices);
-  T end = std::min(total, (i + 1) * slice_size + (i + 1) * slice_remain / number_of_slices);
-  return std::make_pair(start, end);
-}
-
-std::streamoff get_file_size(std::istream& is);
-#endif // __MISC_HPP__
diff --git a/jellyfish/noop_dumper.hpp b/jellyfish/noop_dumper.hpp
deleted file mode 100644
index 49ac27a..0000000
--- a/jellyfish/noop_dumper.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_NOOP_DUMPER_HPP
-#define __JELLYFISH_NOOP_DUMPER_HPP
-
-#include <jellyfish/dumper.hpp>
-
-namespace jellyfish {
-  class noop_dumper : public dumper_t {
-  public:
-    noop_dumper() {}
-    virtual void _dump() {}
-  };
-}
-
-#endif /* __JELLYFISH_NOOP_DUMPER_HPP */
diff --git a/jellyfish/offsets_key_value.hpp b/jellyfish/offsets_key_value.hpp
deleted file mode 100644
index fdc16e3..0000000
--- a/jellyfish/offsets_key_value.hpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
-#define __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
-
-#include <jellyfish/misc.hpp>
-#include <jellyfish/divisor.hpp>
-#include <signal.h>
-
-namespace jellyfish {
-  /* A word is whatever aligned type used for atomic operations
-   * (CAS). Typically, a uint64_t. We store pairs of (key, value), in a
-   * bit packed fashion. The key and value can have abritrary size as
-   * long as they each fit in one word. A block is the largest number of
-   * (key, value) pair such that the first key, and only the first,
-   * starts at an aligned word.
-   *
-   * The key 0x0 is not valid. A key which fits completely within one
-   * word is not protected by a "set" bit. A key which straddle the
-   * boundary between two aligned words has a set bit in each parts.
-   *
-   * A value field can have any value and is initialized to 0x0. It has
-   * no "set" bit ever.
-   *
-   * A key is prefixed with a "large" bit. If this bit is 0, the key
-   * field is length key_len (not counting the possible set bits) and
-   * the value field has length val_len. If the large bit has value 1,
-   * the key field is just long enough to encode the number of
-   * reprobing hops to go backward to find the actual key. The
-   * remainder bits is used for the value field. In this scheme, we
-   * assume the length needed to encode the number of reprobes is much
-   * less than the length needed to encode the key.
-   */
-
-  /* Offsets holds all the possible offset for a given combination of
-   * key length, value length and reprobe limit.
-   */
-  template<typename word>
-  class Offsets {
-  public:
-    // woff: offset in words from beginning of block
-    // boff: offset in bits within that word. Past large bit.
-    // shift: shift in second word, if any
-    // mask1: includes the large bit and the set bit if any.
-    // mask2: mask in second word. Idem as mask1. 0 if fits in one word.
-    // sb_mask[12]: mask for set bit in word 1 and 2, if any. set bit is the
-    //              last usable bit of the field.
-    // lb_mask: mask for the large bit. It is the first bit of the key field.
-    typedef struct {
-      struct {
-        uint_t woff, boff, shift, cshift;
-        word   mask1, mask2, sb_mask1, sb_mask2, lb_mask;
-      } key;
-      struct {
-        uint_t woff, boff, shift, cshift;
-        word   mask1, mask2;
-      } val;
-    } offset_t;
-    typedef struct {
-      offset_t    normal;
-      offset_t    large;
-    } offset_pair_t;
-    struct block_info {
-      uint_t len;
-      uint_t word_len;
-    };
-    //    Offsets() {}
-
-    Offsets(uint_t _key_len, uint_t _val_len, uint_t _reprobe_limit) :
-      key_len(_key_len),
-      val_len(_val_len),
-      reprobe_limit(_reprobe_limit),
-      reprobe_len(bitsize(reprobe_limit)),
-      lval_len(key_len + val_len - reprobe_len),
-      block(compute_offsets()),
-      bld(block.len)
-    { }
-
-    ~Offsets() {}
-
-    uint_t get_block_len() const { return block.len; }
-    uint_t get_block_word_len() const { return block.word_len; }
-    uint_t get_reprobe_len() const { return reprobe_len; }
-    uint_t get_key_len() const { return key_len; }
-    uint_t get_val_len() const { return val_len; }
-    uint_t get_lval_len() const { return lval_len; }
-    word   get_max_val(bool large) const { 
-      return (((uint64_t)1) << (large ? lval_len : val_len)) - 1;
-    }
-
-    // Discretize and round down number of entries according to length
-    // of a block. Return in blocks the number of blocks.
-    size_t floor_block(size_t entries, size_t &blocks) const {
-      blocks = entries / bld;
-      return block.len * blocks;
-    }
-
-    word *get_word_offset(size_t id, const offset_t **o, const offset_t **lo,
-			  word * const base) const {
-      uint64_t q, r;
-      bld.division(id, q, r);
-      word *w = base + (block.word_len * q);
-      *o = &offsets[r].normal;
-      *lo = &offsets[r].large;
-      return w;
-    }
-
-  private:
-    const uint_t     key_len, val_len;
-    const uint_t     reprobe_limit, reprobe_len, lval_len;
-    const block_info block;
-    const divisor64  bld;       // Fast divisor by block.len
-    offset_pair_t    offsets[bsizeof(word)];
-
-    block_info compute_offsets();
-    bool update_current_offsets(uint_t &cword, uint_t &cboff, uint_t add);
-    word mask(uint_t length, uint_t shift);
-  };
-
-  template<typename word>
-  bool Offsets<word>::update_current_offsets(uint_t &cword, uint_t &cboff, uint_t add)
-  {
-    cboff += add;
-    if(cboff >= bsizeof(word)) {
-      cword++;
-      cboff %= bsizeof(word);
-      return cboff > 0;
-    }
-    return false; 
-  }
-
-  template<typename word>
-  word Offsets<word>::mask(uint_t length, uint_t shift)
-  {
-    return (((word)1u << length) - 1) << shift;
-  }
-
-  template<typename word>
-  typename Offsets<word>::block_info Offsets<word>::compute_offsets()
-  {
-    offset_pair_t *offset = offsets;
-    uint_t         cword  = 0;    // current word in block
-    uint_t         cboff  = 0;    // current offset in word
-    uint_t         lcword;        // idem for large fields
-    uint_t         lcboff;
-    uint_t         ocboff;
-
-    memset(offsets, '\0', sizeof(offsets));
-    do {
-      offset->normal.key.woff    = offset->large.key.woff = lcword = cword;
-      ocboff                     = lcboff = cboff;
-      offset->normal.key.boff    = cboff + 1;
-      offset->normal.key.lb_mask = mask(1, cboff);
-      if(update_current_offsets(cword, cboff, key_len + 1)) {
-        // key extends over two words -> add extra set bits
-        update_current_offsets(cword, cboff, 2);
-        offset->normal.key.mask1    = mask(bsizeof(word) - ocboff, ocboff);
-        offset->normal.key.mask2    = mask(cboff, 0);
-        offset->normal.key.shift    = key_len + 1 - cboff;
-        offset->normal.key.cshift   = cboff - 1;
-        offset->normal.key.sb_mask1 = mask(1, bsizeof(word) - 1);
-        offset->normal.key.sb_mask2 = mask(1, cboff - 1);
-      } else {
-        offset->normal.key.mask1    = mask(key_len + 1, ocboff);
-        offset->normal.key.mask2    = 0;
-        offset->normal.key.shift    = 0;
-        offset->normal.key.cshift   = 0;
-        offset->normal.key.sb_mask1 = 0;
-        offset->normal.key.sb_mask2 = 0;
-      }
-      offset->normal.val.woff  = cword;
-      offset->normal.val.boff  = cboff;
-      offset->normal.val.mask1 = mask(val_len, cboff);
-      if(update_current_offsets(cword, cboff, val_len)) {
-        offset->normal.val.mask2  = mask(cboff, 0);
-        offset->normal.val.shift  = val_len - cboff;
-        offset->normal.val.cshift = cboff;
-      } else {
-        offset->normal.val.mask2  = 0;
-        offset->normal.val.shift  = val_len;
-        offset->normal.val.cshift = 0;
-      }
-
-      ocboff                    = lcboff;
-      offset->large.key.boff    = lcboff + 1;
-      offset->large.key.lb_mask = mask(1, lcboff);
-      if(update_current_offsets(lcword, lcboff, reprobe_len + 1)) {
-        update_current_offsets(lcword, lcboff, 2);
-        offset->large.key.mask1    = mask(bsizeof(word) - ocboff, ocboff);
-        offset->large.key.mask2    = mask(lcboff, 0);
-        offset->large.key.shift    = reprobe_len + 1 - lcboff;
-        offset->large.key.cshift   = lcboff - 1;
-        offset->large.key.sb_mask1 = mask(1, bsizeof(word) - 1);
-        offset->large.key.sb_mask2 = mask(1, lcboff - 1);
-      } else {
-        offset->large.key.mask1    = mask(reprobe_len + 1, ocboff);
-        offset->large.key.mask2    = 0;
-        offset->large.key.boff     = ocboff + 1;
-        offset->large.key.shift    = 0;
-        offset->large.key.cshift   = 0;
-        offset->large.key.sb_mask1 = 0;
-        offset->large.key.sb_mask2 = 0;
-      }
-      offset->large.val.woff  = lcword;
-      offset->large.val.boff  = lcboff;
-      offset->large.val.mask1 = mask(lval_len, lcboff);
-      if(update_current_offsets(lcword, lcboff, lval_len)) {
-        offset->large.val.mask2  = mask(lcboff, 0);
-        offset->large.val.shift  = lval_len - lcboff;
-        offset->large.val.cshift = lcboff;
-      } else {
-        offset->large.val.mask2  = 0;
-        offset->large.val.shift  = lval_len;
-        offset->large.val.cshift = 0;
-      }
-
-      offset++;
-    } while(cboff != 0 && cboff < bsizeof(word) - 2);
-
-    block_info res = { static_cast<uint_t>(offset - offsets), cword + (cboff == 0 ? 0 : 1) };
-    return res;
-  }
-}
-
-#endif // __OFFSETS_KEY_VALUE_HPP__
diff --git a/jellyfish/parse_dna.cc b/jellyfish/parse_dna.cc
deleted file mode 100644
index 801513d..0000000
--- a/jellyfish/parse_dna.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
-  void parse_dna::fill() {
-    bucket_t *new_seq = 0;
-
-    while(true) {
-      if(!new_seq) {
-        new_seq = write_next();
-        if(!new_seq)
-          break;
-      }
-      new_seq->end = new_seq->start + buffer_size;
-      char *start = new_seq->start;
-      if(have_seam) {
-        have_seam = false;
-        //        mem_copy(start, seam, mer_len - 1);
-        memcpy(start, seam, mer_len - 1);
-        start += mer_len - 1;
-      }
-      
-      bool input_eof = !fparser->parse(start, &new_seq->end);
-
-      if(new_seq->end > new_seq->start + mer_len) {
-        have_seam = true;
-        //        mem_copy(seam, new_seq->end - mer_len + 1, mer_len - 1);
-        memcpy(seam, new_seq->end - mer_len + 1, mer_len - 1);
-        write_release(new_seq);
-        new_seq = 0;
-      }
-      if(input_eof) {
-        delete fparser;
-        have_seam = false;
-        if(++current_file == files.end()) {
-          close();
-          break;
-        }
-        fparser = sequence_parser::new_parser(*current_file);
-      }
-    }
-  }
-}
diff --git a/jellyfish/parse_dna.hpp b/jellyfish/parse_dna.hpp
deleted file mode 100644
index cd1eb83..0000000
--- a/jellyfish/parse_dna.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_DNA_HPP__
-#define __JELLYFISH_PARSE_DNA_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/sequence_parser.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
-  class parse_dna : public double_fifo_input<sequence_parser::sequence_t> {
-    typedef std::vector<const char *> fary_t;
-
-    uint_t                      mer_len;
-    size_t                      buffer_size;
-    const fary_t                files;
-    fary_t::const_iterator      current_file;
-    bool                        have_seam;
-    char                       *seam;
-    allocators::mmap            buffer_data;
-    bool                        canonical;
-    sequence_parser            *fparser;
-
-  public:
-    /* Action to take for a given letter in fasta file:
-     * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
-     * Other nucleic acid code: map to -1. reset kmer
-     * '\n': map to -2. ignore
-     * Other ASCII: map to -3. Report error.
-     */
-    static uint64_t mer_string_to_binary(const char *in, uint_t klen) {
-      uint64_t res = 0;
-      for(uint_t i = 0; i < klen; i++) {
-        const uint_t c = dna_codes[(uint_t)*in++];
-        if(c & CODE_NOT_DNA)
-          return 0;
-        res = (res << 2) | c;
-      }
-      return res;
-    }
-    static void mer_binary_to_string(uint64_t mer, uint_t klen, char *out) {
-      static const char table[4] = { 'A', 'C', 'G', 'T' };
-      
-      for(unsigned int i = 0 ; i < klen; i++) {
-        out[klen-1-i] = table[mer & (uint64_t)0x3];
-        mer >>= 2;
-      }
-      out[klen] = '\0';
-    }
-
-    static uint64_t reverse_complement(uint64_t v, uint_t length) {
-      v = ((v >> 2)  & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
-      v = ((v >> 4)  & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
-      v = ((v >> 8)  & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
-      v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
-      v = ( v >> 32                        ) | ( v                         << 32);
-      return (((uint64_t)-1) - v) >> (bsizeof(v) - (length << 1));
-    }
-
-    template<typename T>
-    parse_dna(T _files_start, T _files_end, uint_t _mer_len, 
-              unsigned int nb_buffers, size_t _buffer_size); 
-
-    ~parse_dna() {
-      delete [] seam;
-    }
-
-    void set_canonical(bool v = true) { canonical = v; }
-    virtual void fill();
-
-    class thread {
-      parse_dna      *parser;
-      bucket_t       *sequence;
-      const uint_t    mer_len, lshift;
-      uint64_t        kmer, rkmer;
-      const uint64_t  masq;
-      uint_t          cmlen;
-      const bool      canonical;
-      uint64_t        distinct, total;
-      typedef         void (*error_reporter)(std::string& err);
-      error_reporter  error_report;
-
-    public:
-      explicit thread(parse_dna *_parser) :
-        parser(_parser), sequence(0),
-        mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
-        kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
-        cmlen(0), canonical(parser->canonical),
-        distinct(0), total(0), error_report(0) {}
-
-      uint64_t get_uniq() const { return 0; }
-      uint64_t get_distinct() const { return distinct; }
-      uint64_t get_total() const { return total; }
-
-      template<typename T>
-      void parse(T &counter) {
-        cmlen = kmer = rkmer = 0;
-        while((sequence = parser->next())) {
-          const char         *start = sequence->start;
-          const char * const  end   = sequence->end;
-          while(start < end) {
-            const uint_t c = dna_codes[(uint_t)*start++];
-            switch(c) {
-            case CODE_IGNORE: break;
-            case CODE_COMMENT:
-              report_bad_input(*(start-1));
-              // Fall through
-            case CODE_RESET:
-              cmlen = kmer = rkmer = 0;
-              break;
-
-            default:
-              kmer = ((kmer << 2) & masq) | c;
-              rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
-              if(++cmlen >= mer_len) {
-                cmlen  = mer_len;
-                typename T::val_type oval;
-                if(canonical)
-                  counter->add(kmer < rkmer ? kmer : rkmer, 1, &oval);
-                else
-                  counter->add(kmer, 1, &oval);
-                distinct += oval == (typename T::val_type)0;
-                ++total;
-              }
-            }
-          }
-
-          // Buffer exhausted. Get a new one
-          cmlen = kmer = rkmer = 0;
-          parser->release(sequence);
-        }
-      }
-
-      void set_error_reporter(error_reporter e) {
-        error_report = e;
-      }
-
-    private:
-      void report_bad_input(char c) {
-        if(!error_report)
-          return;
-        std::string err("Bad character in sequence: ");
-        err += c;
-        error_report(err);
-      }
-    };
-    friend class thread;
-    thread new_thread() { return thread(this); }
-  };
-}
-
-template<typename T>
-jellyfish::parse_dna::parse_dna(T _files_start, T _files_end,
-                     uint_t _mer_len,
-                     unsigned int nb_buffers, size_t _buffer_size) :
-  double_fifo_input<sequence_parser::sequence_t>(nb_buffers), mer_len(_mer_len), 
-  buffer_size(allocators::mmap::round_to_page(_buffer_size)),
-  files(_files_start, _files_end), current_file(files.begin()),
-  have_seam(false), buffer_data(buffer_size * nb_buffers), canonical(false)
-{
-  seam        = new char[mer_len];
-  memset(seam, 'A', mer_len);
-
-  unsigned long i = 0;
-  for(bucket_iterator it = bucket_begin();
-      it != bucket_end(); ++it, ++i) {
-    it->end = it->start = (char *)buffer_data.get_ptr() + i * buffer_size;
-  }
-  assert(i == nb_buffers);
-
-  fparser = sequence_parser::new_parser(*current_file);
-}
-
-
-#endif
diff --git a/jellyfish/parse_quake.cc b/jellyfish/parse_quake.cc
deleted file mode 100644
index ffa53be..0000000
--- a/jellyfish/parse_quake.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_quake.hpp>
-
-namespace jellyfish {
-  parse_quake::parse_quake(const fary_t &_files, uint_t _mer_len,
-                           unsigned int nb_buffers, size_t _buffer_size,
-                           const char _qs) :
-    double_fifo_input<seq_qual_parser::sequence_t>(nb_buffers), mer_len(_mer_len), 
-    buffer_size(allocators::mmap::round_to_page(_buffer_size)),
-    files(_files), current_file(files.begin()),
-    have_seam(false), buffer_data(buffer_size * nb_buffers),
-    quality_start(_qs), canonical(false)
-  {
-    seam        = new char[2*mer_len];
-
-    unsigned long i = 0;
-    for(bucket_iterator it = bucket_begin();
-        it != bucket_end(); ++it, ++i) {
-      it->end = it->start = (char*)buffer_data.get_ptr() + i * buffer_size;
-    }
-
-    fparser = seq_qual_parser::new_parser(*current_file);
-  }
-
-  void parse_quake::fill() {
-    bucket_t *new_seq = 0;
-  
-    while(true) {
-      if(!new_seq) {
-        new_seq = write_next();
-        if(!new_seq)
-          break;
-      }
-      new_seq->end = new_seq->start + buffer_size;
-      char *start = new_seq->start;
-      if(have_seam) {
-        have_seam = false;
-        memcpy(start, seam, 2 * (mer_len - 1));
-        start += 2 * (mer_len - 1);
-      }
-      bool input_eof = !fparser->parse(start, &new_seq->end);
-      if(new_seq->end > new_seq->start + 2 * mer_len) {
-        have_seam = true;
-        memcpy(seam, new_seq->end - 2 * (mer_len - 1), 2 * (mer_len - 1));
-        write_release(new_seq);
-        new_seq = 0;
-      }
-      if(input_eof) {
-        delete fparser;
-        have_seam = false;
-        if(++current_file == files.end()) {
-          close();
-          break;
-        }
-        fparser = seq_qual_parser::new_parser(*current_file);
-      }
-    }
-  }
-
-  const float parse_quake::proba_codes[41] = {
-    1.00000000000000000000f, 0.79432823472428149003f, 0.63095734448019324958f,
-    0.50118723362727224391f, 0.39810717055349720273f, 0.31622776601683794118f,
-    0.25118864315095801309f, 0.19952623149688797355f, 0.15848931924611134314f,
-    0.12589254117941672817f, 0.10000000000000000000f, 0.07943282347242813790f,
-    0.06309573444801933051f, 0.05011872336272722023f, 0.03981071705534973415f,
-    0.03162277660168379134f, 0.02511886431509579437f, 0.01995262314968879874f,
-    0.01584893192461113431f, 0.01258925411794167490f, 0.01000000000000000000f,
-    0.00794328234724281379f, 0.00630957344480193028f, 0.00501187233627272462f,
-    0.00398107170553497342f, 0.00316227766016837939f, 0.00251188643150957944f,
-    0.00199526231496887892f, 0.00158489319246111408f, 0.00125892541179416749f,
-    0.00100000000000000000f, 0.00079432823472428131f, 0.00063095734448019298f,
-    0.00050118723362727253f, 0.00039810717055349735f, 0.00031622776601683794f,
-    0.00025118864315095795f, 0.00019952623149688788f, 0.00015848931924611142f,
-    0.00012589254117941674f, 0.00010000000000000000f,
-  };
-  const float parse_quake::one_minus_proba_codes[41] = {
-    0.00000000000000000000f, 0.20567176527571850997f, 0.36904265551980675042f,
-    0.49881276637272775609f, 0.60189282944650279727f, 0.68377223398316200331f,
-    0.74881135684904198691f, 0.80047376850311202645f, 0.84151068075388868461f,
-    0.87410745882058327183f, 0.90000000000000002220f, 0.92056717652757180659f,
-    0.93690426555198069725f, 0.94988127663727273120f, 0.96018928294465022422f,
-    0.96837722339831622254f, 0.97488113568490419869f, 0.98004737685031118044f,
-    0.98415106807538887956f, 0.98741074588205834939f, 0.98999999999999999112f,
-    0.99205671765275715845f, 0.99369042655519801421f, 0.99498812766372723981f,
-    0.99601892829446503352f, 0.99683772233983158895f, 0.99748811356849043097f,
-    0.99800473768503117356f, 0.99841510680753886575f, 0.99874107458820582384f,
-    0.99899999999999999911f, 0.99920567176527574915f, 0.99936904265551984583f,
-    0.99949881276637275729f, 0.99960189282944644784f, 0.99968377223398319220f,
-    0.99974881135684900979f, 0.99980047376850311736f, 0.99984151068075388658f,
-    0.99987410745882054908f, 0.99990000000000001101f
-  };
-}
diff --git a/jellyfish/parse_quake.hpp b/jellyfish/parse_quake.hpp
deleted file mode 100644
index 1b55b27..0000000
--- a/jellyfish/parse_quake.hpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_QUAKE_HPP__
-#define __JELLYFISH_PARSE_QUAKE_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/seq_qual_parser.hpp>
-#include <jellyfish/circular_buffer.hpp>
-#include <jellyfish/floats.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
-  class parse_quake : public double_fifo_input<seq_qual_parser::sequence_t> {
-    typedef std::vector<const char *> fary_t;
-
-    uint_t                  mer_len;
-    size_t                  buffer_size;
-    const fary_t            files;
-    fary_t::const_iterator  current_file;
-    bool                    have_seam;
-    allocators::mmap        buffer_data;
-    struct seq             *buffers;
-    char                   *seam;
-    const char              quality_start;
-    bool                    canonical;
-    seq_qual_parser        *fparser;
-
-  public:
-    /* Action to take for a given letter in fasta file:
-     * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
-     * Other nucleic acid code: map to -1. reset kmer
-     * '\n': map to -2. ignore
-     * Other ASCII: map to -3. Skip to next line
-     */
-
-    static const float proba_codes[41];
-    static const float one_minus_proba_codes[41];
-
-    parse_quake(const fary_t &_files, uint_t _mer_len, 
-                unsigned int nb_buffers, size_t _buffer_size,
-                const char _qs); 
-
-    ~parse_quake() { }
-
-    void set_canonical(bool v = true) { canonical = v; }
-    virtual void fill();
-    
-    class thread {
-      parse_quake            *parser;
-      bucket_t               *sequence;
-      const uint_t            mer_len, lshift;
-      uint64_t                kmer, rkmer;
-      const uint64_t          masq;
-      uint_t                  cmlen;
-      const bool              canonical;
-      circular_buffer<float>  quals;
-      const char              quality_start;
-      uint64_t                distinct, total;
-      typedef         void (*error_reporter)(std::string& err);
-      error_reporter  error_report;
-
-    public:
-      thread(parse_quake *_parser, const char _qs) :
-        parser(_parser), sequence(0),
-        mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
-        kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
-        cmlen(0), canonical(parser->canonical), quals(mer_len),
-        quality_start(_qs),
-        distinct(0), total(0), error_report(0) { }
-
-      uint64_t get_distinct() const { return distinct; }
-      uint64_t get_total() const { return total; }
-
-      template<typename T>
-      void parse(T &counter) {
-        cmlen = kmer = rkmer = 0;
-        while((sequence = parser->next())) {
-          const char         *start = sequence->start;
-          const char * const  end   = sequence->end;
-          while(start < end) {
-            const uint_t c = dna_codes[(uint_t)*start++];
-            const char   q = *start++;
-            switch(c) {
-            case CODE_IGNORE: break;
-            case CODE_COMMENT:
-              report_bad_input(*(start-2));
-              // Fall through
-            case CODE_RESET:
-              cmlen = kmer = rkmer = 0;
-              break;
-
-            default:
-              kmer = ((kmer << 2) & masq) | c;
-              rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
-              const float one_minus_p = one_minus_proba_codes[(uint_t)(q - quality_start)];
-              quals.append(one_minus_p);
-              if(++cmlen >= mer_len) {
-                cmlen  = mer_len;
-                Float oval;
-
-                if(canonical)
-                  counter->add(kmer < rkmer ? kmer : rkmer, quals.prod(), &oval);
-                else
-                  counter->add(kmer, quals.prod(), &oval);
-                distinct += oval == (Float)0.0f;
-                ++total;
-              }
-            }
-          }
-
-          // Buffer exhausted. Get a new one
-          cmlen = kmer = rkmer = 0;
-          parser->release(sequence);
-        }
-      }
-
-      void set_error_reporter(error_reporter e) {
-        error_report = e;
-      }
-    private:
-      void report_bad_input(char c) {
-        if(!error_report)
-          return;
-        std::string error("Bad character in sequence: ");
-        error += c;
-        error_report(error);
-      }
-    };
-    friend class thread;
-    thread new_thread() { return thread(this, quality_start); }
-  };
-}
-
-#endif
diff --git a/jellyfish/parse_qual_dna.cc b/jellyfish/parse_qual_dna.cc
deleted file mode 100644
index 67fb560..0000000
--- a/jellyfish/parse_qual_dna.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_qual_dna.hpp>
-
-namespace jellyfish {
-  parse_qual_dna::parse_qual_dna(const fary_t &_files, uint_t _mer_len,
-                                 unsigned int nb_buffers, size_t _buffer_size,
-                                 const char _qs, const char _min_q) :
-    double_fifo_input<seq_qual_parser::sequence_t>(nb_buffers), mer_len(_mer_len), 
-    buffer_size(allocators::mmap::round_to_page(_buffer_size)),
-    files(_files), current_file(files.begin()),
-    have_seam(false), buffer_data(buffer_size * nb_buffers),
-    quality_start(_qs), min_q(_min_q), canonical(false)
-  {
-    seam        = new char[2*mer_len];
-
-    unsigned long i = 0;
-    for(bucket_iterator it = bucket_begin();
-        it != bucket_end(); ++it, ++i) {
-      it->end = it->start = (char*)buffer_data.get_ptr() + i * buffer_size;
-    }
-
-    fparser = seq_qual_parser::new_parser(*current_file);
-  }
-
-  void parse_qual_dna::fill() {
-    bucket_t *new_seq = 0;
-  
-    while(true) {
-      if(!new_seq) {
-        new_seq = write_next();
-        if(!new_seq)
-          break;
-      }
-      new_seq->end = new_seq->start + buffer_size;
-      char *start = new_seq->start;
-      if(have_seam) {
-        have_seam = false;
-        memcpy(start, seam, 2 * (mer_len - 1));
-        start += 2 * (mer_len - 1);
-      }
-      bool input_eof = !fparser->parse(start, &new_seq->end);
-      if(new_seq->end > new_seq->start + 2 * mer_len) {
-        have_seam = true;
-        memcpy(seam, new_seq->end - 2 * (mer_len - 1), 2 * (mer_len - 1));
-        write_release(new_seq);
-        new_seq = 0;
-      }
-      if(input_eof) {
-        delete fparser;
-        have_seam = false;
-        if(++current_file == files.end()) {
-          close();
-          break;
-        }
-        fparser = seq_qual_parser::new_parser(*current_file);
-      }
-    }
-  }
-}
diff --git a/jellyfish/parse_qual_dna.hpp b/jellyfish/parse_qual_dna.hpp
deleted file mode 100644
index cdaa2d0..0000000
--- a/jellyfish/parse_qual_dna.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_QUAL_DNA_HPP__
-#define __JELLYFISH_PARSE_QUAL_DNA_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/seq_qual_parser.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
-  class parse_qual_dna : public double_fifo_input<seq_qual_parser::sequence_t> {
-    typedef std::vector<const char *> fary_t;
-
-    uint_t                  mer_len;
-    size_t                  buffer_size;
-    const fary_t            files;
-    fary_t::const_iterator  current_file;
-    bool                    have_seam;
-    allocators::mmap        buffer_data;
-    char                   *seam;
-    const char              quality_start;
-    const char              min_q;
-    bool                    canonical;
-    seq_qual_parser        *fparser;
-
-  public:
-    /* Action to take for a given letter in fasta file:
-     * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
-     * Other nucleic acid code: map to -1. reset kmer
-     * '\n': map to -2. ignore
-     * Other ASCII: map to -3. Skip to next line
-     */
-    parse_qual_dna(const fary_t &_files, uint_t _mer_len, 
-                   unsigned int nb_buffers, size_t _buffer_size,
-                   const char _qs, const char _min_q); 
-
-    ~parse_qual_dna() { }
-
-    void set_canonical(bool v = true) { canonical = v; }
-    virtual void fill();
-
-    class thread {
-      parse_qual_dna *parser;
-      bucket_t       *sequence;
-      const uint_t    mer_len, lshift;
-      uint64_t        kmer, rkmer;
-      const uint64_t  masq;
-      uint_t          cmlen;
-      const bool      canonical;
-      const char      q_thresh;
-      uint64_t        distinct, total;
-      typedef         void (*error_reporter)(std::string& err);
-      error_reporter  error_report;
-
-    public:
-      thread(parse_qual_dna *_parser, const char _qs, const char _min_q) :
-        parser(_parser), sequence(0),
-        mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
-        kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
-        cmlen(0), canonical(parser->canonical),
-        q_thresh(_qs + _min_q),
-        distinct(0), total(0), error_report(0) { }
-
-      uint64_t get_distinct() const { return distinct; }
-      uint64_t get_total() const { return total; }
-
-      template<typename T>
-      void parse(T &counter) {
-        cmlen = kmer = rkmer = 0;
-        while((sequence = parser->next())) {
-          const char         *start = sequence->start;
-          const char * const  end   = sequence->end;
-          while(start < end) {
-            uint_t     c = dna_codes[(uint_t)*start++];
-            const char q = *start++;
-            if(q < q_thresh)
-              c = CODE_RESET;
-
-            switch(c) {
-            case CODE_IGNORE: break;
-            case CODE_COMMENT:
-              report_bad_input(*(start-1));
-              // Fall through
-            case CODE_RESET:
-              cmlen = kmer = rkmer = 0;
-              break;
-
-            default:
-              kmer = ((kmer << 2) & masq) | c;
-              rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
-              if(++cmlen >= mer_len) {
-                cmlen = mer_len;
-                typename T::val_type oval;
-                if(canonical)
-                  counter->add(kmer < rkmer ? kmer : rkmer, 1, &oval);
-                else
-                  counter->add(kmer, 1, &oval);
-                distinct += !oval;
-                ++total;
-              }
-            }
-          }
-
-          // Buffer exhausted. Get a new one
-          cmlen = kmer = rkmer = 0;
-          parser->release(sequence);
-        }
-      }
-
-      void set_error_reporter(error_reporter e) {
-        error_report = e;
-      }
-      
-    private:
-      void report_bad_input(char c) {
-        if(!error_report)
-          return;
-        std::string error("Bad input: ");
-        error += c;
-        error_report(error);
-      }
-    };
-    friend class thread;
-    thread new_thread() { return thread(this, quality_start, min_q); }
-  };
-}
-
-#endif
diff --git a/jellyfish/parse_read.hpp b/jellyfish/parse_read.hpp
deleted file mode 100644
index f87d5ae..0000000
--- a/jellyfish/parse_read.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FASTQ_READ_PARSER_HPP__
-#define __JELLYFISH_FASTQ_READ_PARSER_HPP__
-
-#include <vector>
-#include <limits>
-
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/read_parser.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/dbg.hpp>
-
-namespace jellyfish {
-  class parse_read : public double_fifo_input<read_parser::reads_t> {
-  private:
-    typedef std::vector<const char *> fary_t;
-
-    fary_t                  files;
-    fary_t::const_iterator  current_file;
-    bool                    canonical;
-    read_parser            *fparser;
-
-  public:
-    typedef read_parser::read_t read_t;
-
-    static const uint_t codes[256];
-    static const uint_t CODE_RESET = (uint_t)-1;
-
-    //    parse_read(int nb_files, char *argv[], unsigned int nb_buffers);
-    template<typename T>
-    parse_read(T argv_start, T argv_end, unsigned int nb_buffers);
-    template<typename T>
-    parse_read(int argc, T argv, unsigned int nb_buffers);
-    ~parse_read() { }
-
-    void set_canonical(bool v = true) { canonical = v; }
-    virtual void fill();
-
-    class thread {
-      parse_read *parser;
-      bucket_t   *sequence;
-      int         current_read;
-
-    public:
-      explicit thread(parse_read *_parser) :
-        parser(_parser), sequence(parser->next()),
-        current_read(0) {}
-
-      read_parser::read_t * next_read() {
-        while(sequence) {
-          if(current_read < sequence->nb_reads)
-            return &sequence->reads[current_read++];
-
-          sequence->unlink(); // unmap file if not used anymore
-          parser->release(sequence);
-          sequence     = parser->next();
-          current_read = 0;
-        }
-        return 0;
-      }
-
-    private:
-      bool next_sequence();
-    };
-    friend class thread;
-    thread new_thread() { return thread(this); }
-  };
-}
-
-template<typename T>
-jellyfish::parse_read::parse_read(T argv_start, T argv_end, unsigned int nb_buffers) :
-  double_fifo_input<read_parser::reads_t>(nb_buffers), 
-  files(argv_start, argv_end),
-  current_file(files.begin()),
-  fparser(read_parser::new_parser(*current_file))
-{ 
-  fparser->link();
-}
-
-template<typename T>
-jellyfish::parse_read::parse_read(int argc, T argv, unsigned int nb_buffers) :
-  double_fifo_input<read_parser::reads_t>(nb_buffers), 
-  files(argv, argv + argc),
-  current_file(files.begin()),
-  fparser(read_parser::new_parser(*current_file))
-{ 
-  fparser->link();
-}
-
-#endif
diff --git a/jellyfish/query_cmdline.hpp b/jellyfish/query_cmdline.hpp
deleted file mode 100644
index 6c1a157..0000000
--- a/jellyfish/query_cmdline.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __QUERY_ARGS_HPP__
-#define __QUERY_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class query_args {
-public:
-  bool                           both_strands_flag;
-  bool                           cary_bit_flag;
-  const char *                   input_arg;
-  bool                           input_given;
-  const char *                   output_arg;
-  bool                           output_given;
-  yaggo::string                  db_arg;
-
-  enum {
-    USAGE_OPT = 1000
-  };
-
-  query_args() : 
-    both_strands_flag(false),
-    cary_bit_flag(false),
-    input_arg(""), input_given(false),
-    output_arg(""), output_given(false)
-  { }
-
-  query_args(int argc, char* argv[]) :
-    both_strands_flag(false),
-    cary_bit_flag(false),
-    input_arg(""), input_given(false),
-    output_arg(""), output_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"both-strands", 0, 0, 'C'},
-      {"cary-bit", 0, 0, 'c'},
-      {"input", 1, 0, 'i'},
-      {"output", 1, 0, 'o'},
-      {"help", 0, 0, 'h'},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVCci:o:";
-
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case 'C':
-        both_strands_flag = true;
-        break;
-      case 'c':
-        cary_bit_flag = true;
-        break;
-      case 'i':
-        input_given = true;
-        input_arg = optarg;
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = yaggo::string(argv[optind]);
-    ++optind;
-  }
-
-#define query_args_USAGE "Usage: jellyfish query [options] db:path"
-  const char * usage() const { return query_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define query_args_HELP "Query from a compacted database\n\nQuery a hash. It reads k-mers from the standard input and write the counts on the standard output.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -C, --both-strands                       Both strands (false)\n" \
-  " -c, --cary-bit                           Value field as the cary bit information (false)\n" \
-  " -i, --input=file                         Input file\n" \
-  " -o, --output=file                        Output file\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return query_args_HELP; }
-#define query_args_HIDDEN "Hidden options:"
-
-  const char * hidden() const { return query_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "both_strands_flag:" << both_strands_flag << "\n";
-    os << "cary_bit_flag:" << cary_bit_flag << "\n";
-    os << "input_given:" << input_given << " input_arg:" << input_arg << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __QUERY_ARGS_HPP__"
diff --git a/jellyfish/query_main.cc b/jellyfish/query_main.cc
deleted file mode 100644
index 396599c..0000000
--- a/jellyfish/query_main.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/query_cmdline.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-void print_mer_counts(const hash_t &h, std::istream &in, std::ostream &out) {
-  uint_t mer_len = h.get_mer_len();
-  uint_t width = mer_len + 2;
-  char mer[width + 1];
-
-  while(true) {
-    in >> std::setw(width) >> mer;
-    if(!in.good())
-      break;
-    if(strlen(mer) != mer_len)
-      die << "Invalid mer " << (char*)mer;
-
-    out << mer << " " << h[mer] << "\n";
-  }
-}
-
-int query_main(int argc, char *argv[])
-{
-  query_args args(argc, argv);
-
-  ifstream_default in(args.input_given ? args.input_arg : 0, std::cin);
-  if(!in.good())
-    die << "Can't open input file '" << args.input_arg << "'" << err::no;
-  ofstream_default out(args.input_given ? args.output_arg : 0, std::cout);
-  if(!out.good())
-    die << "Can't open output file '" << args.output_arg << "'" << err::no;
-
-  mapped_file dbf(args.db_arg.c_str());
-  char type[8];
-  memcpy(type, dbf.base(), sizeof(type));
-  if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
-    raw_inv_hash_query_t hash(dbf);
-    hash.set_canonical(args.both_strands_flag);
-    hash.set_cary_bit(args.cary_bit_flag);
-    print_mer_counts(hash, in, out);
-  } else if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
-    hash_query_t hash(dbf);
-    hash.set_canonical(args.both_strands_flag);
-    print_mer_counts(hash, in, out);
-  }
-
-  out.close();
-
-  return 0;
-}
diff --git a/jellyfish/randomc.h b/jellyfish/randomc.h
index dccd64c..39724f4 100644
--- a/jellyfish/randomc.h
+++ b/jellyfish/randomc.h
@@ -165,7 +165,7 @@ class CRandomMersenne {                // Encapsulate random number generator
 #endif
 
 public:
-   explicit CRandomMersenne(int seed) {         // Constructor
+   CRandomMersenne(int seed) {         // Constructor
       RandomInit(seed); LastInterval = 0;}
    void RandomInit(int seed);          // Re-seed
    void RandomInitByArray(int const seeds[], int NumSeeds); // Seed by more than 32 bits
@@ -188,7 +188,7 @@ public:
    int IRandom(int min, int max);      // Get integer random number in desired interval
    double Random();                    // Get floating point random number
    uint32_t BRandom();                 // Output random bits
-   explicit CRandomMother(int seed) {           // Constructor
+   CRandomMother(int seed) {           // Constructor
       RandomInit(seed);}
 protected:
    uint32_t x[5];                      // History buffer
diff --git a/jellyfish/raw_dumper.hpp b/jellyfish/raw_dumper.hpp
deleted file mode 100644
index 3b9c8af..0000000
--- a/jellyfish/raw_dumper.hpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __RAW_DUMPER_HPP__
-#define __RAW_DUMPER_HPP__
-
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-
-namespace jellyfish {
-  namespace raw_hash {
-    static const char *file_type  __attribute__((used)) = "JFRHSHDN";
-    struct header {
-      char     type[8];
-      uint64_t key_len;
-      uint64_t val_len;
-      uint64_t size;
-      uint64_t max_reprobe;
-    };
-    define_error_class(ErrorReading);
-    template<typename storage_t>
-    class dumper : public dumper_t, public thread_exec {
-      typedef token_ring<locks::pthread::cond> token_ring_t;
-      struct thread_info_t {
-        token_ring_t::token *token;
-      };
-      const uint_t         threads;
-      const std::string    file_prefix;
-      storage_t     *const ary;
-      int                  file_index;
-      token_ring_t         tr;
-    
-      struct thread_info_t *thread_info;
-      size_t                nb_records, nb_blocks;
-      std::ofstream        *out;
-
-    public:
-      dumper(uint_t _threads, const char *_file_prefix, size_t chunk_size, storage_t *_ary) :
-        threads(_threads), file_prefix(_file_prefix),
-        ary(_ary), file_index(0), tr()
-      {
-        nb_records = ary->floor_block(chunk_size / ary->get_block_len(), nb_blocks);
-        while(nb_records < ary->get_max_reprobe_offset()) {
-          nb_records = ary->floor_block(2 * nb_records, nb_blocks);
-        }
-        thread_info = new struct thread_info_t[threads];
-        for(uint_t i = 0; i < threads; i++) {
-          thread_info[i].token = tr.new_token();
-        }
-      }
-    
-      ~dumper() {
-        if(thread_info) {
-          delete[] thread_info;
-        }
-      }
-    
-      virtual void start(int i) { dump_to_file(i); }
-      void dump_to_file(int i);
-      void write_header();
-
-      virtual void _dump();
-    };
-
-    template<typename _storage_t>
-    class query {
-    public:
-      typedef _storage_t storage_t;
-      typedef typename storage_t::iterator iterator;
-
-    private:
-      mapped_file         _file;
-      storage_t          *_ary;
-      bool                _canonical;
-      bool                _cary_bit;
-      SquareBinaryMatrix  hash_matrix;
-      SquareBinaryMatrix  hash_inverse_matrix;
-
-    public:
-      explicit query(mapped_file &map) : 
-        _file(map), _ary(0), _canonical(false), _cary_bit(false) { 
-        _ary = init(_file, hash_matrix, hash_inverse_matrix); 
-      }
-      explicit query(std::string filename) : 
-        _file(filename.c_str()), _ary(0), _canonical(false), _cary_bit(false)
-      { 
-        _ary = init(_file, hash_matrix, hash_inverse_matrix); 
-      }
-      explicit query(const char* filename) : 
-        _file(filename), _ary(0), _canonical(false), _cary_bit(false)
-      { 
-        _ary = init(_file, hash_matrix, hash_inverse_matrix); 
-      }
-
-      ~query() {
-        if(_ary)
-          delete _ary;
-      }
-
-      size_t get_size() const { return _ary->get_size(); }
-      size_t get_key_len() const { return _ary->get_key_len(); }
-      uint_t get_mer_len() const { return _ary->get_key_len() / 2; }
-      uint_t get_val_len() const { return _ary->get_val_len(); }
-      uint_t get_max_reprobe() const { return _ary->get_max_reprobe(); }
-      size_t get_max_reprobe_offset() const { return _ary->get_max_reprobe_offset(); }
-      bool   get_canonical() const { return _canonical; }
-      void   set_canonical(bool v) { _canonical = v; }
-      bool   get_cary_bit() const { return _cary_bit; }
-      void   set_cary_bit(bool v) { _cary_bit = v; }
-      SquareBinaryMatrix get_hash_matrix() { return hash_matrix; }
-      SquareBinaryMatrix get_hash_inverse_matrix() { return hash_inverse_matrix; }
-      storage_t *get_ary() const { return _ary; }
-
-      iterator get_iterator() const { return iterator_all(); }
-      iterator iterator_all() const { return _ary->iterator_all(); }
-      iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
-        return _ary->iterator_slice(slice_number, number_of_slice);
-      }
-
-      typename storage_t::val_t operator[](const char *key_s) const {
-        typename storage_t::key_t key = parse_dna::mer_string_to_binary(key_s, get_mer_len());
-        return (*this)[key];
-      }
-      typename storage_t::val_t operator[](const typename storage_t::key_t &key) const { 
-        typename storage_t::val_t res = 0;
-        bool success;
-        if(_canonical) {
-          typename storage_t::key_t key2 = parse_dna::reverse_complement(key, get_mer_len());
-          success = _ary->get_val(key2 < key ? key2 : key, res, true, _cary_bit);
-        } else
-          success = _ary->get_val(key, res, true, _cary_bit);
-        return success ? res : 0;
-      }
-
-      bool has_key(const char *key_s) const {
-        return has_key(parse_dna::mer_string_to_binary(key_s, get_mer_len()));
-      }
-      bool has_key(const typename storage_t::key_t &key) const {
-        typename storage_t::val_t res = 0;
-        if(_canonical) {
-          typename storage_t::key_t key2 = parse_dna::reverse_complement(key, get_mer_len());
-          return _ary->get_val(key2 < key ? key2 : key, res, false);
-        } else {
-          return _ary->get_val(key, res, false);
-        }
-      }
-
-      
-      static storage_t* init(mapped_file& _file, 
-                             SquareBinaryMatrix& hash_matrix,
-                             SquareBinaryMatrix& hash_inverse_matrix) {
-        if(_file.length() < sizeof(struct header))
-          eraise(ErrorReading) << "'" << _file.path() << "': "
-                               << "File truncated";
-        char *map = _file.base();
-        struct header *header = (struct header *)map;
-        map += sizeof(struct header);
-        if(strncmp(header->type, file_type, sizeof(header->type)))
-           eraise(ErrorReading) << "'" << _file.path() << "': "
-                                << "Invalid file format '" 
-                                << err::substr(header->type, sizeof(header->type))
-                                << "'. Expected '" << file_type << "'.";
-        if(header->size != (1UL << floorLog2(header->size)))
-          eraise(ErrorReading) << "'" << _file.path() << "': "
-                               << "Size '" << header->size << "' is not a power of 2";
-        if(header->key_len > 64 || header->key_len == 0)
-          eraise(ErrorReading) << "'" << _file.path() << "': "
-                               << "Invalid key length '" << header->key_len << "'";
-        // TODO: Should that be in the file instead?
-        // reprobes = jellyfish::quadratic_reprobes;
-        map += hash_matrix.read(map);
-        if((uint_t)hash_matrix.get_size() != header->key_len)
-          eraise(ErrorReading) << "'" << _file.path() << "': "
-                               << "Size of hash matrix '" << hash_matrix.get_size() 
-                              << "' not equal to key length '" << header->key_len << "'";
-        map += hash_inverse_matrix.read(map);
-        if((uint_t)hash_inverse_matrix.get_size() != header->key_len)
-          eraise(ErrorReading) << "'" << _file.path() << "': "
-                               << "Size of inverse hash matrix '" << hash_inverse_matrix.get_size()
-                               << "' not equal to key length '" << header->key_len << "'";
-        if((size_t)map & 0x7)
-          map += 0x8 - ((size_t)map & 0x7); // Make sure aligned for 64bits word. TODO: use alignof?
-        return new storage_t(map, header->size, header->key_len, header->val_len,
-                             header->max_reprobe, jellyfish::quadratic_reprobes,
-                             hash_matrix, hash_inverse_matrix);
-      }
-    };
-
-    template<typename storage_t>
-    void dumper<storage_t>::_dump() {
-      std::ofstream _out;
-      open_next_file(file_prefix.c_str(), &file_index, _out);
-      out = &_out;
-      tr.reset();
-      write_header();
-      exec_join(threads);
-      _out.close();
-    }
-
-    template<typename storage_t>
-    void dumper<storage_t>::dump_to_file(int id) {
-      size_t i;
-      struct thread_info_t *my_info = &thread_info[id];
-    
-      for(i = id; i * nb_records < ary->get_size(); i += threads) {
-        my_info->token->wait();
-        ary->write_blocks(out, i * nb_blocks, nb_blocks);
-        my_info->token->pass();
-        ary->zero_blocks(i * nb_blocks, nb_blocks);
-      }
-    }
-
-    template<typename storage_t>
-    void dumper<storage_t>::write_header() {
-      struct header header;
-      memcpy(&header.type, file_type, sizeof(header.type));
-      header.key_len = ary->get_key_len();
-      header.val_len = ary->get_val_len();
-      header.size = ary->get_size();
-      header.max_reprobe = ary->get_max_reprobe();
-      out->write((char *)&header, sizeof(header));
-      ary->write_ary_header(out);
-    }
-
-  }
-}
-
-#endif
diff --git a/jellyfish/read_parser.cc b/jellyfish/read_parser.cc
deleted file mode 100644
index badaf28..0000000
--- a/jellyfish/read_parser.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/read_parser.hpp>
-#include <jellyfish/dbg.hpp>
-
-jellyfish::read_parser *
-jellyfish::read_parser::new_parser(const char *path) {
-  int fd;
-  char peek;
-  fd = file_peek(path, &peek);
-
-  switch(peek) {
-  case '>': return new fasta_read_parser(fd, path, &peek, 1);
-  case '@': return new fastq_read_parser(fd, path, &peek, 1);
-  default:
-    eraise(FileParserError) << "'" << path << "'" 
-                            << "Invalid input file. Expected fasta or fastq format";
-  }
-  return 0;
-}
-
-#define BREAK_AT_END if(eof()) break;
-namespace jellyfish {
-  bool fasta_read_parser::next_reads(read_parser::reads_t *rs) {
-    for(rs->nb_reads = 0; 
-        rs->nb_reads < read_parser::reads_t::max_nb_reads && !eof();
-        ++rs->nb_reads) {
-      read_t *r = &rs->reads[rs->nb_reads];
-      r->qual_s = r->qual_e = 0;
-      while(sbumpc() != '>')
-        BREAK_AT_END;
-      BREAK_AT_END;
-      r->header = ptr();
-      while(sbumpc() != '\n')
-        BREAK_AT_END;
-      BREAK_AT_END;
-      r->hlen  = ptr() - r->header - 1;
-      r->seq_s = ptr();
-      // find end of sequence
-      while(!eof())
-        if(sbumpc() == '\n')
-          if(speekc() == '>')
-            break;
-      r->seq_e = ptr();
-    }
-    return !eof();
-  }
-
-
-  bool fastq_read_parser::next_reads(read_parser::reads_t *rs) {
-    for(rs->nb_reads = 0; 
-        rs->nb_reads < read_parser::reads_t::max_nb_reads && !eof();
-        ++rs->nb_reads) {
-      read_t *r = &rs->reads[rs->nb_reads];
-      while(sbumpc() != '@')
-        BREAK_AT_END;
-      BREAK_AT_END;
-      r->header = ptr();
-      while(sbumpc() != '\n')
-        BREAK_AT_END;
-      BREAK_AT_END;
-      r->hlen  = ptr() - r->header - 1;
-      r->seq_s = ptr();
-      // find end of sequence
-      size_t nb_bases = 0;
-      while(!eof()) {
-        if(sbumpc() == '\n') {
-          if(speekc() == '+')
-            break;
-        } else {
-          ++nb_bases;
-        }
-      }
-      r->seq_e = ptr();
-
-      // Skip qual header
-      while(sbumpc() != '\n')
-        BREAK_AT_END;
-      BREAK_AT_END;
-      r->qual_s = ptr();
-
-      // Skip qual values
-      while(!eof() && nb_bases > 0)
-        if(sbumpc() != '\n')
-          --nb_bases;
-      if(nb_bases == 0)
-        r->qual_e = ptr();
-      else
-        BREAK_AT_END;
-    }
-    return !eof();
-  } 
-}
-
diff --git a/jellyfish/read_parser.hpp b/jellyfish/read_parser.hpp
deleted file mode 100644
index e821624..0000000
--- a/jellyfish/read_parser.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH__READ_PARSER_HPP__
-#define __JELLYFISH__READ_PARSER_HPP__
-
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-
-namespace jellyfish {
-  class read_parser : public file_parser {
-    unsigned long usage;
-  public:
-    struct read_t {
-      const char *seq_s, *seq_e, *header, *qual_s, *qual_e;
-      size_t      hlen;
-    };
-    struct reads_t {
-      static const int max_nb_reads = 100;
-      int              nb_reads;
-      read_t           reads[max_nb_reads];
-      read_parser     *file;
-
-      void unlink() {
-        if(file->unlink() == 0)
-          delete file;
-      }
-      void link() {
-        file->link();
-      }
-    };
-
-    read_parser(int fd, const char *path, const char *str, size_t len) :
-      file_parser(fd, path, str, len), usage(0) {}
-
-    virtual ~read_parser() {}
-
-    static read_parser *new_parser(const char *path);
-    virtual bool next_reads(reads_t *rs) = 0;
-    unsigned long unlink() {
-      return atomic::gcc::add_fetch(&usage, (unsigned long)-1);
-    }
-    unsigned long link() {
-      return atomic::gcc::add_fetch(&usage, (unsigned long)1);
-    }
-  };
-
-  class fasta_read_parser : public read_parser {
-  public:
-    fasta_read_parser(int fd, const char *path, const char *str, size_t len) :
-      read_parser(fd, path, str, len) {}
-
-    virtual ~fasta_read_parser() {}
-    virtual bool next_reads(reads_t *rs);
-  };
-
-  class fastq_read_parser : public read_parser {
-  public:
-    fastq_read_parser(int fd, const char *path, const char *str, size_t len) :
-      read_parser(fd, path, str, len) {}
-    virtual ~fastq_read_parser() {}
-    virtual bool next_reads(reads_t *rs);
-  };
-}
-#endif
diff --git a/jellyfish/seq_qual_parser.cc b/jellyfish/seq_qual_parser.cc
deleted file mode 100644
index 0f22e65..0000000
--- a/jellyfish/seq_qual_parser.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/seq_qual_parser.hpp>
-#include <stddef.h>
-
-jellyfish::seq_qual_parser *
-jellyfish::seq_qual_parser::new_parser(const char *path) {
-  int fd;
-  char peek;
-
-  fd = file_peek(path, &peek);
-
-  switch(peek) {
-  case '@': return new fastq_seq_qual_parser(fd, path, &peek, 1);
-      
-  default:
-    eraise(FileParserError) << "'" << path << "': "
-                            << "Invalid input file. Expected fastq";
-  }
-
-  return 0;
-}
-
-
-bool jellyfish::fastq_seq_qual_parser::parse(char *start, char **end) {
-  char *qual_start = start + 1;
-  // Make sure even length
-  *end -= (*end - start) & 0x1;
-  if(!_read_buf.empty()) {
-    // Copy the saved sequence, then the quality score for this
-    // saved sequence. The stream is left at the first qual value.
-    if((*end - start) / 2 < (ptrdiff_t)_read_buf.size())
-      eraise(FastqSeqQualParserError) << "Buffer is too small to "
-        "contain an entire read and its qual values";
-    qual_start = start + 1;
-    for(const char *b = _read_buf.begin(); b < _read_buf.end(); b++, start += 2)
-      *start = *b;
-    _read_buf.reset();
-    copy_qual_values(qual_start, start);
-  }
-      
-  while(start < *end) {
-    // Read sequence header
-    bool found_seq_header = false;
-    while(!found_seq_header) {
-      switch(sbumpc()) {
-      case EOF:
-        goto done;
-      case '\n':
-        break;
-      case '@':
-        found_seq_header = pbase() == '\n';
-        if(found_seq_header)
-          break;
-        // fall through
-      default:
-        eraise(FastqSeqQualParserError) << "Unexpected character '" << base()
-                                        << "'. Expected '@'";
-      }
-    }
-    // skip seq header
-    while(base() != EOF && base() != '\n') { sbumpc(); }
-    *start = 'N';
-    start += 2;
-    qual_start = start + 1;
-
-    // copy sequence
-    bool found_qual_header = false;
-    //      char *save_start = start;
-    //      std::cerr << "save_start " << save_start << std::endl;
-    while(start < *end && !found_qual_header) {
-      switch(sbumpc()) {
-      case EOF:
-        eraise(FastqSeqQualParserError) << "Truncated input file";
-      case '\n':
-        break;
-      case '+':
-        if((found_qual_header = pbase() == '\n'))
-          break;
-        // fall through regular character
-      default:
-        *start = base();
-        start += 2;
-      }
-    }
-      
-    if(!found_qual_header) { // copy extra sequence to read buffer
-      while(!found_qual_header) {
-        switch(sbumpc()) {
-        case EOF:
-          eraise(FastqSeqQualParserError) << "Truncated input file";
-        case '\n':
-          break;
-        case '+':
-          if((found_qual_header = pbase() == '\n'))
-            break;
-        default:
-          _read_buf.push_back(base());
-        }
-      }
-    }
-    // skip qual header && copy qual values
-    while(base() != EOF && base() != '\n') { sbumpc(); }
-    //      std::cerr << "Copy qual values" << std::endl;
-    copy_qual_values(qual_start, start);
-  }
-
- done:
-  *end = start;
-  return base() != EOF;
-}
-
-void jellyfish::fastq_seq_qual_parser::copy_qual_values(char *&qual_start, const char *start) {
-  while(qual_start < start + 1) {
-    switch(sbumpc()) {
-    case EOF:
-      eraise(FastqSeqQualParserError) << "Truncated input file";
-    case '\n':
-      break;
-    default:
-      *qual_start = base();
-      qual_start += 2;
-    }
-  }
-}
diff --git a/jellyfish/seq_qual_parser.hpp b/jellyfish/seq_qual_parser.hpp
deleted file mode 100644
index c6c38cf..0000000
--- a/jellyfish/seq_qual_parser.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SEQ_QUAL_PARSER_HPP__
-#define __JELLYFISH_SEQ_QUAL_PARSER_HPP__
-
-#include <iostream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/simple_growing_array.hpp>
-
-namespace jellyfish {
-  class seq_qual_parser : public file_parser {
-  public:
-    seq_qual_parser(int fd, const char *path, const char *str, size_t len) :
-      file_parser(fd, path, str, len) {}
-    virtual ~seq_qual_parser() {}
-
-    struct sequence_t {
-      char *start;
-      char *end;
-    };
-    static seq_qual_parser *new_parser(const char *path);
-
-    // parse some input data into the buffer [start, *end). Returns
-    // false if there is no more data in the input. **end is an
-    // input/output parameter. It points past the end of the buffer
-    // when called and should point past the end of the data when
-    // returned. The base and its ASCII qual value are one next to
-    // another.
-    virtual bool parse(char *start, char **end) = 0;
-
-  protected:
-  };
-
-  class fastq_seq_qual_parser : public seq_qual_parser {
-  public:
-    fastq_seq_qual_parser(int fd, const char *path, const char *str, size_t len) :
-      seq_qual_parser(fd, path, str, len) {}
-
-    virtual ~fastq_seq_qual_parser() {}
-    virtual bool parse(char *start, char **end);
-
-    define_error_class(FastqSeqQualParserError);
-
-  private:
-    void copy_qual_values(char *&qual_start, const char *start);
-    simple_growing_array<char> _read_buf;
-  };
-}
-
-#endif
diff --git a/jellyfish/sequence_parser.cc b/jellyfish/sequence_parser.cc
deleted file mode 100644
index b32d542..0000000
--- a/jellyfish/sequence_parser.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/sequence_parser.hpp>
-#include <jellyfish/time.hpp>
-
-jellyfish::sequence_parser *
-jellyfish::sequence_parser::new_parser(const char *path) {
-  int fd;
-  char peek;
-  fd = file_peek(path, &peek);
-  
-  switch(peek) {
-  case '>': return new jellyfish::fasta_sequence_parser(fd, path, &peek, 1);
-  case '@': return new jellyfish::fastq_sequence_parser(fd, path, &peek, 1);
-      
-  default:
-    eraise(FileParserError) << "'" << path << "': "
-                            << "Invalid input file. Expected fasta or fastq" ;
-  }
-
-  return 0;
-}
-
-bool jellyfish::fasta_sequence_parser::parse(char *start, char **end) {
-  while(start < *end && base() != _eof) {
-    char c = 0;
-    switch(c = sbumpc()) {
-    case _eof:
-      break;
-
-    case '>':
-      if(pbase() == '\n') {
-        while(c != _eof && c != '\n') { c = sbumpc(); }
-        *start++ = 'N';
-      } else
-        *start++ = c;
-      break;
-
-    case '\n':
-      break;
-
-    default:
-      *start++ = c;
-    }
-  }
-
-  *end = start;
-  return !eof();
-}
-
-bool jellyfish::fastq_sequence_parser::parse(char *start, char **end) {
-  while(start < *end && base() != _eof) {
-    switch(sbumpc()) {
-    case _eof:
-      break;
-
-    case '@':
-      if(pbase() == '\n') {
-        while(base() != _eof && base() != '\n') { sbumpc(); }
-        *start++ = 'N';
-        seq_len = 0;
-      } else
-        *start++ = base();
-      break;
-
-    case '+':
-      if(pbase() == '\n') { // Skip qual header & values
-        while(base() != _eof && base() != '\n') { sbumpc(); }
-        while(base() != _eof && seq_len > 0) {
-          if(base() != '\n')
-            --seq_len;
-          sbumpc();
-        }
-      } else
-        *start++ = base();
-      break;
-
-    case '\n':
-      break;
-
-    default:
-      *start++ = base();
-      ++seq_len;
-    }
-  }
-    
-  *end = start;
-  return base() != _eof;
-}
diff --git a/jellyfish/sequence_parser.hpp b/jellyfish/sequence_parser.hpp
deleted file mode 100644
index 5df903f..0000000
--- a/jellyfish/sequence_parser.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SEQUENCE_PARSER_HPP__
-#define __JELLYFISH_SEQUENCE_PARSER_HPP__
-
-#include <iostream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
-  class sequence_parser : public file_parser {
-  protected:
-  public:
-    sequence_parser(int fd, const char *path, const char *str, size_t len) :
-      file_parser(fd, path, str, len) { }
-    virtual ~sequence_parser() { }
-
-    struct sequence_t {
-      char *start;
-      char *end;
-    };
-    static sequence_parser *new_parser(const char *path);
-
-    // parse some input data into the buffer [start, *end). Returns
-    // false if there is no more data in the input. **end is an
-    // input/output parameter. It points past the end of the buffer
-    // when called and should point past the end of the data when
-    // returned.
-    virtual bool parse(char *start, char **end) = 0;
-  };
-  
-  class fasta_sequence_parser : public sequence_parser {
-  public:
-    fasta_sequence_parser(int fd, const char *path, const char *str, size_t len) :
-      sequence_parser(fd, path, str, len) {}
-
-    virtual ~fasta_sequence_parser() {}
-
-    virtual bool parse(char *start, char **end);
-  };
-
-  class fastq_sequence_parser : public sequence_parser {
-    unsigned long seq_len;
-  public:
-    fastq_sequence_parser(int fd, const char *path, const char *str, 
-                          size_t len) :
-      sequence_parser(fd, path, str, len), seq_len(0) {}
-
-    virtual ~fastq_sequence_parser() {}
-    virtual bool parse(char *start, char **end);
-
-  };
-}
-
-#endif
diff --git a/jellyfish/simple_growing_array.hpp b/jellyfish/simple_growing_array.hpp
deleted file mode 100644
index 9a7f117..0000000
--- a/jellyfish/simple_growing_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-// Simple growing array. Never shrinks. No construction or destruction
-// of objects in array, only copy with pushback() methods
-namespace jellyfish {
-  template<typename T>
-  class simple_growing_array {
-    size_t  _capacity;
-    size_t  _size;
-    T      *_data;
-  public:
-    explicit simple_growing_array(size_t capacity = 100) : 
-      _capacity(capacity / 2), _size(0), _data(0) { resize(); }
-
-    virtual ~simple_growing_array() {
-      free(_data);
-    }
-
-    void push_back(const T &x) {
-      if(_size >= _capacity)
-        resize();
-      _data[_size++] = x;
-    }
-
-    void reset() { _size = 0; }
-
-    size_t size() const { return _size; }
-    bool empty() const { return _size == 0; }
-    const T * begin() const { return _data; }
-    const T * end() const { return _data + _size; }
-    
-  private:
-    define_error_class(SimpleGrowingArrayError);
-    void resize() {
-      _capacity *= 2;
-      void * ndata = realloc(_data, sizeof(T) * _capacity);
-      if(ndata == 0) {
-        free(ndata);
-        _data = 0;
-        _capacity = _capacity / 2;
-        eraise(SimpleGrowingArrayError) << "Out of memory" << err::no;
-      }
-      _data = (T*)ndata;
-    }
-  };
-}
diff --git a/jellyfish/sorted_dumper.hpp b/jellyfish/sorted_dumper.hpp
deleted file mode 100644
index ef34738..0000000
--- a/jellyfish/sorted_dumper.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/heap.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-
-namespace jellyfish {
-  template<typename storage_t, typename atomic_t>
-  class sorted_dumper : public dumper_t, public thread_exec {
-    typedef typename storage_t::overlap_iterator iterator;
-    typedef compacted_hash::writer<storage_t> writer_t;
-    typedef heap_t<iterator> oheap_t;
-    typedef token_ring<locks::pthread::cond> token_ring_t;
-
-    struct thread_info_t {
-      writer_t             writer;
-      oheap_t              heap;
-      token_ring_t::token *token;
-    };
-
-    uint_t                 threads;
-    std::string            file_prefix;
-    size_t                 buffer_size;
-    uint_t                 klen, vlen;
-    uint_t                 key_len, val_len;
-    size_t                 record_len, nb_records, nb_blocks;
-    storage_t             *ary;
-    int                    file_index;
-    token_ring_t           tr;
-    uint64_t               lower_count, upper_count;
-    struct thread_info_t  *thread_info;
-    uint64_t volatile      unique, distinct, total, max_count;
-    std::ofstream         *out;
-    locks::pthread::mutex  dump_mutex;
-    bool                   one_file;
-
-  public:
-    // klen: key field length in bits in hash (i.e before rounding up to bytes)
-    // vlen: value field length in bits
-    sorted_dumper(uint_t _threads, const char *_file_prefix, size_t _buffer_size, 
-                  uint_t _vlen, storage_t *_ary) :
-      threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
-      klen(_ary->get_key_len()), vlen(_vlen), ary(_ary), file_index(0),
-      tr(), lower_count(0), upper_count(std::numeric_limits<uint64_t>::max()),
-      one_file(false)
-    {
-      key_len    = bits_to_bytes(klen);
-      val_len    = bits_to_bytes(vlen);
-      record_len = key_len + val_len;
-      nb_records = ary->floor_block(_buffer_size / record_len, nb_blocks);
-      while(nb_records < ary->get_max_reprobe_offset()) {
-        nb_records = ary->floor_block(2 * nb_records, nb_blocks);
-      }
-
-      thread_info = new struct thread_info_t[threads];
-      for(uint_t i = 0; i < threads; i++) {
-        //        thread_info[i].token = i == 0;
-        thread_info[i].writer.initialize(nb_records, klen, vlen, ary);
-        thread_info[i].heap.initialize(ary->get_max_reprobe_offset());
-        thread_info[i].token = tr.new_token();
-      }
-      unique = distinct = total = max_count = 0;
-    }
-
-    ~sorted_dumper() {
-      if(thread_info) {
-        delete[] thread_info;
-      }
-    }
-    
-    bool get_one_file() const { return one_file; }
-    void set_one_file(bool nv) { one_file = nv; }
-
-    void set_lower_count(uint64_t l) { lower_count = l; }
-    void set_upper_count(uint64_t u) { upper_count = u; }
-
-    virtual void start(int i) { dump_to_file(i); }
-    void dump_to_file(int i);
-
-    virtual void _dump();
-    void update_stats() {
-      thread_info[0].writer.update_stats_with(out, unique, distinct, total, 
-                                              max_count);
-    }
-  };
-
-  template<typename storage_t, typename atomic_t>
-  void sorted_dumper<storage_t,atomic_t>::_dump() {
-    std::ofstream _out;
-    assert(dump_mutex.try_lock());
-    if(one_file) {
-      _out.open(file_prefix.c_str());
-    } else {
-      open_next_file(file_prefix.c_str(), &file_index, _out);
-    }
-    out = &_out;
-    unique = distinct = total = max_count = 0;
-    tr.reset();
-    thread_info[0].writer.write_header(out);
-    exec_join(threads);
-    ary->zero_blocks(0, nb_blocks); // zero out last group of blocks
-    update_stats();
-    _out.close();
-    dump_mutex.unlock();
-  }
-
-  template<typename storage_t, typename atomic_t>
-  void sorted_dumper<storage_t,atomic_t>::dump_to_file(int id) {
-    size_t                i;
-    struct thread_info_t *my_info = &thread_info[id];
-    atomic_t              atomic;
-
-    my_info->writer.reset_counters();
-
-    for(i = id; i * nb_records < ary->get_size(); i += threads) {
-      // fill up buffer
-      iterator it(ary, i * nb_records, (i + 1) * nb_records);
-      my_info->heap.fill(it);
-
-      while(it.next()) {
-        typename oheap_t::const_item_t item = my_info->heap.head();
-        if(item->val >= lower_count && item->val <= upper_count)
-          my_info->writer.append(item->key, item->val);
-        my_info->heap.pop();
-        my_info->heap.push(it);
-      }
-
-      while(my_info->heap.is_not_empty()) {
-        typename oheap_t::const_item_t item = my_info->heap.head();
-        if(item->val >= lower_count && item->val <= upper_count)
-          my_info->writer.append(item->key, item->val);
-        my_info->heap.pop();
-      }
-
-      my_info->token->wait();
-      my_info->writer.dump(out);
-      my_info->token->pass();
-
-      // zero out memory
-      if(i > 0)
-        ary->zero_blocks(i * nb_blocks, nb_blocks);
-    }
-
-    atomic.add_fetch(&unique, my_info->writer.get_unique());
-    atomic.add_fetch(&distinct, my_info->writer.get_distinct());
-    atomic.add_fetch(&total, my_info->writer.get_total());
-    atomic.set_to_max(&max_count, my_info->writer.get_max_count());
-  }
-}
diff --git a/jellyfish/square_binary_matrix.cc b/jellyfish/square_binary_matrix.cc
deleted file mode 100644
index 5ecab6d..0000000
--- a/jellyfish/square_binary_matrix.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <iostream>
-#include <sstream>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-
-#ifndef random
-// Implement random from the old rand() function. Don't trust low bit
-// to be as random, so call rand twice and reverse one of the result.
-long random() {
-  return rand() ^ reverse_bits((uint32_t)rand());
-}
-#endif
-
-void SquareBinaryMatrix::init_random() {
-  uint64_t _mask = mask();
-  int i, j;
-  int lrm = floorLog2((unsigned long)RAND_MAX);
-  for(i = 0; i < size; i++) {
-    for(j = 0; j < size; j += lrm)
-      columns[i] ^= (uint64_t)random() << j;
-    columns[i] &= _mask;
-  }
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::init_random_inverse() {
-  while(true) {
-    init_random();
-    try {
-      return inverse();
-    } catch(SquareBinaryMatrix::SingularMatrix &e) { }
-  }
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::transpose() const {
-  SquareBinaryMatrix res(size);
-  uint64_t *a = res.columns, *b;
-  int i, j;
-
-  for(i = size - 1; i >= 0; i--, a++) 
-    for(j = size - 1, b = columns; j >= 0; j--, b++)
-      *a |= ((*b >> i) & 0x1) << j;
-
-  return res;
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::operator*(const SquareBinaryMatrix &other) const {
-  int i;
-  SquareBinaryMatrix res(size);
-
-  if(size != other.get_size()) 
-    eraise(MismatchingSize) << "Multiplication operator dimension mismatch:" 
-                            << size << "x" << size << " != " 
-                            << other.get_size() << "x" << other.get_size();
-  
-  for(i = 0; i < size; i++) {
-    res[i] = this->times(other[i]);
-  }
-
-  return res;
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::inverse() const {
-  SquareBinaryMatrix pivot(*this);
-  SquareBinaryMatrix res(size);
-  int i, j;
-
-  res.init_identity();
-
-  // forward elimination
-  for(i = 0; i < size; i++) {
-    if(!((pivot.columns[i] >> (size - i - 1)) & (uint64_t)0x1)) {
-      for(j = i + 1; j < size; j++)
-        if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1)
-          break;
-      if(j >= size)
-	eraise(SingularMatrix) << "Matrix is singular";
-      pivot.columns[i] ^= pivot.columns[j];
-      res.columns[i] ^= res.columns[j];
-    }
-
-    for(j = i+1; j < size; j++) {
-      if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1) {
-	pivot.columns[j] ^= pivot.columns[i];
-	res.columns[j] ^= res.columns[i];
-      }
-    }
-  }
-
-  // backward elimination
-  for(i = size - 1; i > 0; i--) {
-    for(j = i - 1; j >= 0; j--) {
-      if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1) {
-	pivot.columns[j] ^= pivot.columns[i];
-	res.columns[j] ^= res.columns[i];
-      }
-    }
-  }
-  return res;
-}
-
-void SquareBinaryMatrix::print(std::ostream *os) const {
-  int i, j;
-  uint64_t a, *v;
-
-  *os << size << "x" << size << std::endl;
-  for(i = 0, a = msb(); i < size; i++, a >>= 1) {
-    for(j = 0, v = columns; j < size; j++, v++)
-      *os << ((*v & a) ? 1 : 0);
-    *os << std::endl;
-  }
-}
-
-std::string SquareBinaryMatrix::str() const {
-  std::ostringstream os;
-  print(&os);
-  return os.str();
-}
-
-void SquareBinaryMatrix::dump(std::ostream *os) const {
-  os->write((char *)&size, sizeof(size));
-  os->write((char *)columns, sizeof(uint64_t) * size);
-}
-
-void SquareBinaryMatrix::load(std::istream *is) {
-  is->read((char *)&size, sizeof(size));
-  alloc_columns();
-  is->read((char *)columns, sizeof(uint64_t) * size);
-}
-
-size_t SquareBinaryMatrix::read(const char *map) {
-  int nsize = 0;
-  memcpy(&nsize, map, sizeof(nsize));
-  if(nsize <= 0 || nsize > 64)
-    eraise(MismatchingSize) << "Invalid matrix size '" << nsize << "'. Must be between 1 and 64";
-
-  size = nsize;
-  alloc_columns();
-  memcpy(columns, map + sizeof(size), sizeof(uint64_t) * size);
-  return sizeof(size) + sizeof(uint64_t) * size;
-}
-
-void SquareBinaryMatrix::print_vector(std::ostream *os, uint64_t v, bool vertical) const {
-  uint64_t a;
-  for(a = msb(); a; a >>= 1)
-    *os << ((v & a) ? 1 : 0) << (vertical ? "\n" : "");
-}
-
-std::string SquareBinaryMatrix::str_vector(uint64_t v, bool vertical) const {
-  std::ostringstream os;
-  print_vector(&os, v, vertical);
-  return os.str();
-}
-
-#ifdef HAVE_SSE
-uint64_t SquareBinaryMatrix::times_sse(uint64_t v) const {
-#define FFs ((uint64_t)-1)
-  static const uint64_t smear[8] asm("smear") __attribute__ ((aligned(16),used)) =
-    {0, 0, 0, FFs, FFs, 0, FFs, FFs};
-
-  uint64_t *c = columns + (size - 2);
-  uint64_t res;
-  // How do I make sure that gcc does not use the smear register for something else?
-  // Is the & constraint for res enough?
-
-  __asm__ __volatile__ ("pxor %%xmm0, %%xmm0\n"
-                        "times_sse_loop%=:\n\t"
-                        "movq %2, %0\n\t"
-                        "andq $3, %0\n\t"
-                        "shlq $4, %0\n\t"
-                        "movdqa (%5,%0), %%xmm1\n\t"
-                        "pand (%1), %%xmm1\n\t"
-                        "pxor %%xmm1, %%xmm0\n\t"
-                        "subq $0x10, %1\n\t"
-                        "shrq $2, %2\n\t"
-                        "movq %2, %0\n\t"
-                        "andq $3, %0\n\t"
-                        "shlq $4, %0\n\t"
-                        "movdqa (%5,%0), %%xmm1\n\t"
-                        "pand (%1), %%xmm1\n\t"
-                        "pxor %%xmm1, %%xmm0\n\t"
-                        "subq $0x10, %1\n\t"
-                        "shrq $2, %2\n\t"
-                        "jnz times_sse_loop%=\n\t"
-                        "movd %%xmm0, %0\n\t"
-                        "psrldq $8, %%xmm0\n\t"
-                        "movd %%xmm0, %1\n\t"
-                        "xorq %1, %0\n\t"
-                        : "=&r" (res), "=r" (c), "=r" (v)
-                        : "1" (c), "2" (v), "r" (smear)
-                        : "xmm0", "xmm1");
-
-  return res;
-}
-
-#else
-
-uint64_t SquareBinaryMatrix::times_sse(uint64_t v) const { return 0; }
-
-#endif
-
-uint64_t SquareBinaryMatrix::times_unrolled(uint64_t v) const {
-  uint64_t res = 0, *c = columns+(size-1);
-
-  switch(size) {
-  case 64: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 63: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 62: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 61: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 60: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 59: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 58: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 57: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 56: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 55: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 54: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 53: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 52: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 51: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 50: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 49: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 48: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 47: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 46: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 45: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 44: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 43: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 42: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 41: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 40: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 39: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 38: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 37: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 36: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 35: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 34: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 33: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 32: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 31: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 30: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 29: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 28: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 27: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 26: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 25: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 24: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 23: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 22: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 21: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 20: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 19: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 18: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 17: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 16: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 15: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 14: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 13: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 12: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 11: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case 10: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  9: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  8: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  7: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  6: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  5: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  4: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  3: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  2: res ^= (-(v & 1)) & *c--; v >>= 1;
-  case  1: res ^= (-(v & 1)) & *c;
-  }
-  return res;
-}
-
diff --git a/jellyfish/square_binary_matrix.hpp b/jellyfish/square_binary_matrix.hpp
deleted file mode 100644
index 67e3f49..0000000
--- a/jellyfish/square_binary_matrix.hpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SQUARE_BINARY_MATRIX_HPP__
-#define __JELLYFISH_SQUARE_BINARY_MATRIX_HPP__
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <iostream>
-#include <exception>
-#include <algorithm>
-#include <assert.h>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-
-class SquareBinaryMatrix {
-public:
-  define_error_class(ErrorAllocation);
-  define_error_class(SingularMatrix);
-  define_error_class(MismatchingSize);
-
-private:
-  uint64_t *columns;
-  int       size;
-
-  uint64_t mask() const { return (((uint64_t)1) << size) - 1; }
-  uint64_t msb() const { return ((uint64_t)1) << (size - 1); }
-  uint64_t *first_alloc(size_t size) {
-    uint64_t *res = calloc_align<uint64_t>((size_t)size, (size_t)16);
-    if(!res)
-      eraise(ErrorAllocation) << "Can't allocate matrix of size '" << size << "'";
-    return res;
-  }
-  void alloc_columns() {
-    if(columns) {
-      free(columns);
-      columns = 0;
-    }
-    if(size < 0 || size > 64)
-      eraise(MismatchingSize) << "Invalid matrix size '" << size << "'";
-    columns = first_alloc(size);
-  }
-
-public:
-  SquareBinaryMatrix() : columns(0), size(0) { }
-
-  explicit SquareBinaryMatrix(int _size) :columns(first_alloc(_size)), size(_size) {
-    memset(columns, '\0', sizeof(uint64_t) * _size);
-  }
-  SquareBinaryMatrix(const SquareBinaryMatrix &rhs) : columns(first_alloc(rhs.get_size())), size(rhs.get_size()) {
-    int i;
-    
-    uint64_t _mask = mask();
-    for(i = 0; i < size; i++)
-      columns[i] = rhs.columns[i] & _mask;
-  }
-  SquareBinaryMatrix(const uint64_t *_columns, int _size) : columns(first_alloc(_size)), size(_size) {
-    int i;
-    uint64_t _mask = mask();
-
-    for(i = 0; i < size; i++)
-      columns[i] = _columns[i] & _mask;
-  }
-  explicit SquareBinaryMatrix(const char *map) : columns(0), size(0) {
-    read(map);
-  }
-  explicit SquareBinaryMatrix(std::istream *is) : columns(0), size(0) {
-    load(is);
-  }
-
-  ~SquareBinaryMatrix() {
-    if(columns)
-      free(columns);
-  }
-
-  void swap(SquareBinaryMatrix &rhs) {
-    std::swap(columns, rhs.columns);
-    std::swap(size, rhs.size);
-  }
-
-  SquareBinaryMatrix &operator=(SquareBinaryMatrix rhs) {
-    this->swap(rhs);
-    return *this;
-  }
-
-  void init_random();
-
-  SquareBinaryMatrix init_random_inverse();
-
-  void init_identity() {
-    uint64_t v = msb();
-    int i;
-    for(i = 0; v; i++, v >>= 1)
-      columns[i] = v;
-  }
-
-  bool is_identity() const {
-    uint64_t v = msb();
-    int i;
-
-    for(i = 0; i < size; i++, v >>= 1) {
-      if(columns[i] != v)
-        return false;
-    }
-    return true;
-  }
-
-  bool is_zero() const {
-    int i;
-    for(i = 0; i < size; i++)
-      if(columns[i])
-        return false;
-    return true;
-  }
-
-  void resize(int ns) { size = ns; alloc_columns(); }
-  int get_size() const { return size; }
-
-  bool operator==(const SquareBinaryMatrix &other) const {
-    int i;
-    if(size != other.get_size())
-      return false;
-    for(i = 0; i < size; i++)
-      if(columns[i] != other.columns[i])
-        return false;
-
-    return true;
-  }
-
-  bool operator!=(const SquareBinaryMatrix &other) const {
-    return !(*this == other);
-  }
-  
-  uint64_t & operator[](int i) {
-    return columns[i];
-  }
-
-  uint64_t operator[](int i) const {
-    return columns[i];
-  }
-
-  uint64_t times_loop(uint64_t v) const {
-    uint64_t res = 0, *c = columns+(size-1);
-    
-    for ( ; v; v >>= 1)
-      res ^= (-(v & 1)) & *c--;
-    return res;
-  }
-
-  uint64_t times_unrolled(uint64_t v) const;
-  uint64_t times_sse(uint64_t v) const;
-  
-  inline uint64_t times(uint64_t v) const {
-#ifdef HAVE_SSE
-    return times_sse(v);
-#else
-    return times_unrolled(v);
-#endif
-  }
-
-  SquareBinaryMatrix transpose() const;
-  SquareBinaryMatrix operator*(const SquareBinaryMatrix &other) const;
-
-  SquareBinaryMatrix inverse() const;
-  int pop_count() const {
-    int i, res = 0;
-    for(i = 0; i < size; i++)
-      res += __builtin_popcountl(columns[i]);
-    return res;
-  }
-
-  uint64_t xor_sum() const {
-    uint64_t sum = 0;
-    for(int i = 0; i < size; ++i)
-      sum ^= columns[i];
-    return sum;
-  }
-
-  void print(std::ostream *os) const;
-  std::string str() const;
-  void dump(std::ostream *os) const;
-  void load(std::istream *is);
-  size_t read(const char *map);
-  size_t dump_size() { return sizeof(size) + sizeof(uint64_t) * size; }
-  void print_vector(std::ostream *os, uint64_t v, bool vertical = false) const;
-  std::string str_vector(uint64_t v, bool vertical = false) const;
-};
-
-#endif // __SQUARE_BINARY_MATRIX_HPP__
diff --git a/jellyfish/stats_main.cc b/jellyfish/stats_main.cc
deleted file mode 100644
index 33f1dfb..0000000
--- a/jellyfish/stats_main.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/stats_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-void compute_stats(const hash_t &h, uint64_t lower_count, uint64_t upper_count,
-                   uint64_t &unique, uint64_t &distinct, uint64_t &total,
-                   uint64_t &max_count) {
-  typename hash_t::iterator it = h.iterator_all();
-  while(it.next()) {
-    if(it.get_val() < lower_count || it.get_val() > upper_count)
-      continue;
-    unique += it.get_val() == 1;
-    distinct++;
-    total += it.get_val();
-    if(it.get_val() > max_count)
-      max_count = it.get_val();
-  }
-}
-
-int stats_main(int argc, char *argv[])
-{
-  stats_args args(argc, argv);
-
-  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
-  if(!out.good())
-    die << "Error opening output file '" << args.output_arg << "'";
-
-  mapped_file dbf(args.db_arg);
-  dbf.sequential().will_need();
-  char type[8];
-  memcpy(type, dbf.base(), sizeof(type));
-
-  args.recompute_flag |= args.lower_count_given | args.upper_count_given;
-  uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
-  uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
-
-  uint64_t unique = 0, distinct = 0, total = 0, max_count = 0;
-  if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
-    hash_query_t hash(dbf);
-    if(args.verbose_flag)
-      out << "k-mer length (bases): " << hash.get_mer_len() << "\n"
-          << "value length (bytes): " << hash.get_val_len() << "\n"
-          << "max reprobe         : " << hash.get_max_reprobe() << "\n"
-          << "hash size           : " << hash.get_size() << "\n";
-
-    if(args.recompute_flag) {
-      compute_stats(hash, lower_count, upper_count, unique, distinct,
-                    total, max_count);
-    } else {
-      unique    = hash.get_unique();
-      distinct  = hash.get_distinct();
-      total     = hash.get_total();
-      max_count = hash.get_max_count();
-    }
-  } else if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
-    raw_inv_hash_query_t hash(dbf);
-    if(args.verbose_flag)
-      out << "k-mer length (bases): " << hash.get_mer_len() << "\n"
-          << "value length (bits) : " << hash.get_val_len() << "\n";
-    compute_stats(hash, lower_count, upper_count, unique, distinct,
-                  total, max_count);
-  } else {
-    die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
-  }
-  out << "Unique:    " << unique << "\n"
-      << "Distinct:  " << distinct << "\n"
-      << "Total:     " << total << "\n"
-      << "Max_count: " << max_count << "\n";
-  out.close();
-
-  // if(args.fasta_flag) {
-  //   char key[hash.get_mer_len() + 1];
-  //   while(hash.next()) {
-  //     if(hash.val < lower_count || hash.val > upper_count)
-  //       continue;
-  //     hash.get_string(key);
-  //     out << ">" << hash.val << "\n" << key << "\n";
-  //   }
-  // } else if(args.column_flag) {
-  //   char key[hash.get_mer_len() + 1];
-  //   char spacer = args.tab_flag ? '\t' : ' ';
-  //   while(hash.next()) {
-  //     if(hash.val < lower_count || hash.val > upper_count)
-  //       continue;
-  //     hash.get_string(key);
-  //     out << key << spacer << hash.val << "\n";
-  //   }
-  // } else {
-  //   die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
-  // }
-  // out.close();
-
-  return 0;
-}
diff --git a/jellyfish/stats_main_cmdline.hpp b/jellyfish/stats_main_cmdline.hpp
deleted file mode 100644
index 4db8e3a..0000000
--- a/jellyfish/stats_main_cmdline.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __STATS_ARGS_HPP__
-#define __STATS_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class stats_args {
-public:
-  bool                           recompute_flag;
-  uint64_t                       lower_count_arg;
-  bool                           lower_count_given;
-  uint64_t                       upper_count_arg;
-  bool                           upper_count_given;
-  bool                           verbose_flag;
-  const char *                   output_arg;
-  bool                           output_given;
-  const char *                   db_arg;
-
-  enum {
-    USAGE_OPT = 1000,
-    FULL_HELP_OPT
-  };
-
-  stats_args() : 
-    recompute_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    verbose_flag(false),
-    output_arg(""), output_given(false)
-  { }
-
-  stats_args(int argc, char* argv[]) :
-    recompute_flag(false),
-    lower_count_arg(), lower_count_given(false),
-    upper_count_arg(), upper_count_given(false),
-    verbose_flag(false),
-    output_arg(""), output_given(false)
-  { parse(argc, argv); }
-
-  void parse(int argc, char* argv[]) {
-    static struct option long_options[] = {
-      {"recompute", 0, 0, 'r'},
-      {"lower-count", 1, 0, 'L'},
-      {"upper-count", 1, 0, 'U'},
-      {"verbose", 0, 0, 'v'},
-      {"output", 1, 0, 'o'},
-      {"help", 0, 0, 'h'},
-      {"full-help", 0, 0, FULL_HELP_OPT},
-      {"usage", 0, 0, USAGE_OPT},
-      {"version", 0, 0, 'V'},
-      {0, 0, 0, 0}
-    };
-    static const char *short_options = "hVrL:U:vo:";
-
-    std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
-    while(true) { 
-      int index = -1;
-      int c = getopt_long(argc, argv, short_options, long_options, &index);
-      if(c == -1) break;
-      switch(c) {
-      case ':': 
-        std::cerr << "Missing required argument for "
-                  << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
-                  << std::endl;
-        exit(1);
-      case 'h':
-        std::cout << usage() << "\n\n" << help() << std::endl;
-        exit(0);
-      case USAGE_OPT:
-        std::cout << usage() << "\nUse --help for more information." << std::endl;
-        exit(0);
-      case 'V':
-        print_version();
-        exit(0);
-      case '?':
-        std::cerr << "Use --usage or --help for some help\n";
-        exit(1);
-      case FULL_HELP_OPT:
-        std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
-        exit(0);
-      case 'r':
-        recompute_flag = true;
-        break;
-      case 'L':
-        lower_count_given = true;
-        lower_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
-        break;
-      case 'U':
-        upper_count_given = true;
-        upper_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
-        CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
-        break;
-      case 'v':
-        verbose_flag = true;
-        break;
-      case 'o':
-        output_given = true;
-        output_arg = optarg;
-        break;
-      }
-    }
-
-    // Parse arguments
-    if(argc - optind != 1)
-      error("Requires exactly 1 argument.");
-    db_arg = argv[optind];
-    ++optind;
-  }
-
-#define stats_args_USAGE "Usage: jellyfish stats [options] db:path"
-  const char * usage() const { return stats_args_USAGE; }
-  void error(const char *msg) { 
-    std::cerr << "Error: " << msg << "\n" << usage()
-              << "\nUse --help for more information"
-              << std::endl;
-    exit(1);
-  }
-
-#define stats_args_HELP "Statistics\n\nDisplay some statistics about the k-mers in the hash:\n" \
-  "\n" \
-  "Unique:    Number of k-mers which occur only once.\n" \
-  "Distinct:  Number of k-mers, not counting multiplicity.\n" \
-  "Total:     Number of k-mers, including multiplicity.\n" \
-  "Max_count: Maximum number of occurrence of a k-mer.\n\n" \
-  "Options (default value in (), *required):\n" \
-  " -L, --lower-count=uint64                 Don't consider k-mer with count < lower-count\n" \
-  " -U, --upper-count=uint64                 Don't consider k-mer with count > upper-count\n" \
-  " -v, --verbose                            Verbose (false)\n" \
-  " -o, --output=string                      Output file\n" \
-  "     --usage                              Usage\n" \
-  " -h, --help                               This message\n" \
-  "     --full-help                          Detailed help\n" \
-  " -V, --version                            Version"
-
-  const char * help() const { return stats_args_HELP; }
-#define stats_args_HIDDEN "Hidden options:\n" \
-  " -r, --recompute                          Recompute (false)"
-
-  const char * hidden() const { return stats_args_HIDDEN; }
-  void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
-    os << PACKAGE_VERSION << "\n";
-  }
-  void dump(std::ostream &os = std::cout) {
-    os << "recompute_flag:" << recompute_flag << "\n";
-    os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
-    os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
-    os << "verbose_flag:" << verbose_flag << "\n";
-    os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
-    os << "db_arg:" << db_arg << "\n";
-  }
-private:
-};
-
-#endif // __STATS_ARGS_HPP__"
diff --git a/jellyfish/storage.cc b/jellyfish/storage.cc
deleted file mode 100644
index fca7f80..0000000
--- a/jellyfish/storage.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "config.h"
-#include <jellyfish/storage.hpp>
-
-namespace jellyfish {
-  size_t _quadratic_reprobes[257] = {
-    1,
-    1,     3,     6,    10,    15,    21,    28,    36,    45,    55, 
-    66,    78,    91,   105,   120,   136,   153,   171,   190,   210, 
-    231,   253,   276,   300,   325,   351,   378,   406,   435,   465, 
-    496,   528,   561,   595,   630,   666,   703,   741,   780,   820, 
-    861,   903,   946,   990,  1035,  1081,  1128,  1176,  1225,  1275, 
-    1326,  1378,  1431,  1485,  1540,  1596,  1653,  1711,  1770,  1830, 
-    1891,  1953,  2016,  2080,  2145,  2211,  2278,  2346,  2415,  2485, 
-    2556,  2628,  2701,  2775,  2850,  2926,  3003,  3081,  3160,  3240, 
-    3321,  3403,  3486,  3570,  3655,  3741,  3828,  3916,  4005,  4095, 
-    4186,  4278,  4371,  4465,  4560,  4656,  4753,  4851,  4950,  5050, 
-    5151,  5253,  5356,  5460,  5565,  5671,  5778,  5886,  5995,  6105, 
-    6216,  6328,  6441,  6555,  6670,  6786,  6903,  7021,  7140,  7260, 
-    7381,  7503,  7626,  7750,  7875,  8001,  8128,  8256,  8385,  8515, 
-    8646,  8778,  8911,  9045,  9180,  9316,  9453,  9591,  9730,  9870, 
-    10011, 10153, 10296, 10440, 10585, 10731, 10878, 11026, 11175, 11325, 
-    11476, 11628, 11781, 11935, 12090, 12246, 12403, 12561, 12720, 12880, 
-    13041, 13203, 13366, 13530, 13695, 13861, 14028, 14196, 14365, 14535, 
-    14706, 14878, 15051, 15225, 15400, 15576, 15753, 15931, 16110, 16290, 
-    16471, 16653, 16836, 17020, 17205, 17391, 17578, 17766, 17955, 18145, 
-    18336, 18528, 18721, 18915, 19110, 19306, 19503, 19701, 19900, 20100, 
-    20301, 20503, 20706, 20910, 21115, 21321, 21528, 21736, 21945, 22155, 
-    22366, 22578, 22791, 23005, 23220, 23436, 23653, 23871, 24090, 24310, 
-    24531, 24753, 24976, 25200, 25425, 25651, 25878, 26106, 26335, 26565, 
-    26796, 27028, 27261, 27495, 27730, 27966, 28203, 28441, 28680, 28920, 
-    29161, 29403, 29646, 29890, 30135, 30381, 30628, 30876, 31125, 31375, 
-    31626, 31878, 32131, 32385, 32640, 32896
-  };
-  size_t *quadratic_reprobes = _quadratic_reprobes;
-}
diff --git a/jellyfish/test_double_fifo_input.cc b/jellyfish/test_double_fifo_input.cc
deleted file mode 100644
index a703e63..0000000
--- a/jellyfish/test_double_fifo_input.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/backtrace.hpp>
-#include <stdlib.h>
-
-class display_kmer {
-  int           _k;
-  unsigned long count;
-public:
-  typedef unsigned long val_type;
-  explicit display_kmer(int k) : _k(k), count(0) {}
-
-  void add(uint64_t mer, int i, val_type *oval = 0) {
-    ++count;
-  }
-  void inc(uint64_t mer) {
-    // char mer_str[_k+1];
-    // jellyfish::parse_dna::mer_binary_to_string(mer, _k, mer_str);
-    // std::cout << mer_str << std::endl;
-    ++count;
-  }
-  
-  display_kmer *operator->() { return this; }
-  unsigned long get_count() { return count; }
-};
-
-
-class parser : public thread_exec {
-  jellyfish::parse_dna _parser;
-  unsigned long        count;
-
-public:
-  parser(int argc, const char *argv[]) :
-    _parser(argv, argv + argc, 25, 100, 1024*10),
-    count(0)
-  { }
-
-  void start(int id) {
-    jellyfish::parse_dna::thread tparse = _parser.new_thread();
-
-    display_kmer display(25);
-    tparse.parse(display);
-    atomic::gcc::fetch_add(&count, display.get_count());
-  }
-
-  unsigned long get_count() { return count; }
-};
-
-
-int main(int argc, const char *argv[])
-{
-  show_backtrace();
-
-  if(argc != 3)
-    die << "Need the number of threads and file name";
-
-  parser parse(argc - 2, argv + 2);
-  parse.exec_join(atoi(argv[1]));
-  std::cout << "Get count " << parse.get_count() << std::endl;
-  
-  return 0;
-}
diff --git a/jellyfish/test_read_parser.cc b/jellyfish/test_read_parser.cc
deleted file mode 100644
index bf498c3..0000000
--- a/jellyfish/test_read_parser.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*  This file is part of Jellyfish.
-
-    Jellyfish is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Jellyfish is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_read.hpp>
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/backtrace.hpp>
-
-int main(int argc, char *argv[])
-{
-  show_backtrace();
-  jellyfish::parse_read parser(argv + 1, argv + argc, 100);
-  jellyfish::parse_read::thread stream = parser.new_thread();
-
-  jellyfish::read_parser::read_t *read;
-  while((read = stream.next_read())) {
-    unsigned long count = 0;
-    for(const char *base = read->seq_s; base < read->seq_e; ++base) {
-      switch(*base) {
-      case 'a': case 'A':
-      case 'c': case 'C':
-      case 'g': case 'G':
-      case 't': case 'T':
-        ++count;
-
-      default: break; //skip
-      }
-    }
-    std::cout << "'" << std::string(read->header, read->hlen) << "' "
-              << count << "\n";
-  }
-  std::cout << std::flush;
-
-  return 0;
-}
diff --git a/jellyfish/toFloat.h b/jellyfish/toFloat.h
deleted file mode 100644
index 37c9556..0000000
--- a/jellyfish/toFloat.h
+++ /dev/null
@@ -1,16391 +0,0 @@
-//
-// This is an automatically generated file.
-// Do not edit.
-//
-
-{
-    {0x00000000}, {0x33800000}, {0x34000000}, {0x34400000}, 
-    {0x34800000}, {0x34a00000}, {0x34c00000}, {0x34e00000}, 
-    {0x35000000}, {0x35100000}, {0x35200000}, {0x35300000}, 
-    {0x35400000}, {0x35500000}, {0x35600000}, {0x35700000}, 
-    {0x35800000}, {0x35880000}, {0x35900000}, {0x35980000}, 
-    {0x35a00000}, {0x35a80000}, {0x35b00000}, {0x35b80000}, 
-    {0x35c00000}, {0x35c80000}, {0x35d00000}, {0x35d80000}, 
-    {0x35e00000}, {0x35e80000}, {0x35f00000}, {0x35f80000}, 
-    {0x36000000}, {0x36040000}, {0x36080000}, {0x360c0000}, 
-    {0x36100000}, {0x36140000}, {0x36180000}, {0x361c0000}, 
-    {0x36200000}, {0x36240000}, {0x36280000}, {0x362c0000}, 
-    {0x36300000}, {0x36340000}, {0x36380000}, {0x363c0000}, 
-    {0x36400000}, {0x36440000}, {0x36480000}, {0x364c0000}, 
-    {0x36500000}, {0x36540000}, {0x36580000}, {0x365c0000}, 
-    {0x36600000}, {0x36640000}, {0x36680000}, {0x366c0000}, 
-    {0x36700000}, {0x36740000}, {0x36780000}, {0x367c0000}, 
-    {0x36800000}, {0x36820000}, {0x36840000}, {0x36860000}, 
-    {0x36880000}, {0x368a0000}, {0x368c0000}, {0x368e0000}, 
-    {0x36900000}, {0x36920000}, {0x36940000}, {0x36960000}, 
-    {0x36980000}, {0x369a0000}, {0x369c0000}, {0x369e0000}, 
-    {0x36a00000}, {0x36a20000}, {0x36a40000}, {0x36a60000}, 
-    {0x36a80000}, {0x36aa0000}, {0x36ac0000}, {0x36ae0000}, 
-    {0x36b00000}, {0x36b20000}, {0x36b40000}, {0x36b60000}, 
-    {0x36b80000}, {0x36ba0000}, {0x36bc0000}, {0x36be0000}, 
-    {0x36c00000}, {0x36c20000}, {0x36c40000}, {0x36c60000}, 
-    {0x36c80000}, {0x36ca0000}, {0x36cc0000}, {0x36ce0000}, 
-    {0x36d00000}, {0x36d20000}, {0x36d40000}, {0x36d60000}, 
-    {0x36d80000}, {0x36da0000}, {0x36dc0000}, {0x36de0000}, 
-    {0x36e00000}, {0x36e20000}, {0x36e40000}, {0x36e60000}, 
-    {0x36e80000}, {0x36ea0000}, {0x36ec0000}, {0x36ee0000}, 
-    {0x36f00000}, {0x36f20000}, {0x36f40000}, {0x36f60000}, 
-    {0x36f80000}, {0x36fa0000}, {0x36fc0000}, {0x36fe0000}, 
-    {0x37000000}, {0x37010000}, {0x37020000}, {0x37030000}, 
-    {0x37040000}, {0x37050000}, {0x37060000}, {0x37070000}, 
-    {0x37080000}, {0x37090000}, {0x370a0000}, {0x370b0000}, 
-    {0x370c0000}, {0x370d0000}, {0x370e0000}, {0x370f0000}, 
-    {0x37100000}, {0x37110000}, {0x37120000}, {0x37130000}, 
-    {0x37140000}, {0x37150000}, {0x37160000}, {0x37170000}, 
-    {0x37180000}, {0x37190000}, {0x371a0000}, {0x371b0000}, 
-    {0x371c0000}, {0x371d0000}, {0x371e0000}, {0x371f0000}, 
-    {0x37200000}, {0x37210000}, {0x37220000}, {0x37230000}, 
-    {0x37240000}, {0x37250000}, {0x37260000}, {0x37270000}, 
-    {0x37280000}, {0x37290000}, {0x372a0000}, {0x372b0000}, 
-    {0x372c0000}, {0x372d0000}, {0x372e0000}, {0x372f0000}, 
-    {0x37300000}, {0x37310000}, {0x37320000}, {0x37330000}, 
-    {0x37340000}, {0x37350000}, {0x37360000}, {0x37370000}, 
-    {0x37380000}, {0x37390000}, {0x373a0000}, {0x373b0000}, 
-    {0x373c0000}, {0x373d0000}, {0x373e0000}, {0x373f0000}, 
-    {0x37400000}, {0x37410000}, {0x37420000}, {0x37430000}, 
-    {0x37440000}, {0x37450000}, {0x37460000}, {0x37470000}, 
-    {0x37480000}, {0x37490000}, {0x374a0000}, {0x374b0000}, 
-    {0x374c0000}, {0x374d0000}, {0x374e0000}, {0x374f0000}, 
-    {0x37500000}, {0x37510000}, {0x37520000}, {0x37530000}, 
-    {0x37540000}, {0x37550000}, {0x37560000}, {0x37570000}, 
-    {0x37580000}, {0x37590000}, {0x375a0000}, {0x375b0000}, 
-    {0x375c0000}, {0x375d0000}, {0x375e0000}, {0x375f0000}, 
-    {0x37600000}, {0x37610000}, {0x37620000}, {0x37630000}, 
-    {0x37640000}, {0x37650000}, {0x37660000}, {0x37670000}, 
-    {0x37680000}, {0x37690000}, {0x376a0000}, {0x376b0000}, 
-    {0x376c0000}, {0x376d0000}, {0x376e0000}, {0x376f0000}, 
-    {0x37700000}, {0x37710000}, {0x37720000}, {0x37730000}, 
-    {0x37740000}, {0x37750000}, {0x37760000}, {0x37770000}, 
-    {0x37780000}, {0x37790000}, {0x377a0000}, {0x377b0000}, 
-    {0x377c0000}, {0x377d0000}, {0x377e0000}, {0x377f0000}, 
-    {0x37800000}, {0x37808000}, {0x37810000}, {0x37818000}, 
-    {0x37820000}, {0x37828000}, {0x37830000}, {0x37838000}, 
-    {0x37840000}, {0x37848000}, {0x37850000}, {0x37858000}, 
-    {0x37860000}, {0x37868000}, {0x37870000}, {0x37878000}, 
-    {0x37880000}, {0x37888000}, {0x37890000}, {0x37898000}, 
-    {0x378a0000}, {0x378a8000}, {0x378b0000}, {0x378b8000}, 
-    {0x378c0000}, {0x378c8000}, {0x378d0000}, {0x378d8000}, 
-    {0x378e0000}, {0x378e8000}, {0x378f0000}, {0x378f8000}, 
-    {0x37900000}, {0x37908000}, {0x37910000}, {0x37918000}, 
-    {0x37920000}, {0x37928000}, {0x37930000}, {0x37938000}, 
-    {0x37940000}, {0x37948000}, {0x37950000}, {0x37958000}, 
-    {0x37960000}, {0x37968000}, {0x37970000}, {0x37978000}, 
-    {0x37980000}, {0x37988000}, {0x37990000}, {0x37998000}, 
-    {0x379a0000}, {0x379a8000}, {0x379b0000}, {0x379b8000}, 
-    {0x379c0000}, {0x379c8000}, {0x379d0000}, {0x379d8000}, 
-    {0x379e0000}, {0x379e8000}, {0x379f0000}, {0x379f8000}, 
-    {0x37a00000}, {0x37a08000}, {0x37a10000}, {0x37a18000}, 
-    {0x37a20000}, {0x37a28000}, {0x37a30000}, {0x37a38000}, 
-    {0x37a40000}, {0x37a48000}, {0x37a50000}, {0x37a58000}, 
-    {0x37a60000}, {0x37a68000}, {0x37a70000}, {0x37a78000}, 
-    {0x37a80000}, {0x37a88000}, {0x37a90000}, {0x37a98000}, 
-    {0x37aa0000}, {0x37aa8000}, {0x37ab0000}, {0x37ab8000}, 
-    {0x37ac0000}, {0x37ac8000}, {0x37ad0000}, {0x37ad8000}, 
-    {0x37ae0000}, {0x37ae8000}, {0x37af0000}, {0x37af8000}, 
-    {0x37b00000}, {0x37b08000}, {0x37b10000}, {0x37b18000}, 
-    {0x37b20000}, {0x37b28000}, {0x37b30000}, {0x37b38000}, 
-    {0x37b40000}, {0x37b48000}, {0x37b50000}, {0x37b58000}, 
-    {0x37b60000}, {0x37b68000}, {0x37b70000}, {0x37b78000}, 
-    {0x37b80000}, {0x37b88000}, {0x37b90000}, {0x37b98000}, 
-    {0x37ba0000}, {0x37ba8000}, {0x37bb0000}, {0x37bb8000}, 
-    {0x37bc0000}, {0x37bc8000}, {0x37bd0000}, {0x37bd8000}, 
-    {0x37be0000}, {0x37be8000}, {0x37bf0000}, {0x37bf8000}, 
-    {0x37c00000}, {0x37c08000}, {0x37c10000}, {0x37c18000}, 
-    {0x37c20000}, {0x37c28000}, {0x37c30000}, {0x37c38000}, 
-    {0x37c40000}, {0x37c48000}, {0x37c50000}, {0x37c58000}, 
-    {0x37c60000}, {0x37c68000}, {0x37c70000}, {0x37c78000}, 
-    {0x37c80000}, {0x37c88000}, {0x37c90000}, {0x37c98000}, 
-    {0x37ca0000}, {0x37ca8000}, {0x37cb0000}, {0x37cb8000}, 
-    {0x37cc0000}, {0x37cc8000}, {0x37cd0000}, {0x37cd8000}, 
-    {0x37ce0000}, {0x37ce8000}, {0x37cf0000}, {0x37cf8000}, 
-    {0x37d00000}, {0x37d08000}, {0x37d10000}, {0x37d18000}, 
-    {0x37d20000}, {0x37d28000}, {0x37d30000}, {0x37d38000}, 
-    {0x37d40000}, {0x37d48000}, {0x37d50000}, {0x37d58000}, 
-    {0x37d60000}, {0x37d68000}, {0x37d70000}, {0x37d78000}, 
-    {0x37d80000}, {0x37d88000}, {0x37d90000}, {0x37d98000}, 
-    {0x37da0000}, {0x37da8000}, {0x37db0000}, {0x37db8000}, 
-    {0x37dc0000}, {0x37dc8000}, {0x37dd0000}, {0x37dd8000}, 
-    {0x37de0000}, {0x37de8000}, {0x37df0000}, {0x37df8000}, 
-    {0x37e00000}, {0x37e08000}, {0x37e10000}, {0x37e18000}, 
-    {0x37e20000}, {0x37e28000}, {0x37e30000}, {0x37e38000}, 
-    {0x37e40000}, {0x37e48000}, {0x37e50000}, {0x37e58000}, 
-    {0x37e60000}, {0x37e68000}, {0x37e70000}, {0x37e78000}, 
-    {0x37e80000}, {0x37e88000}, {0x37e90000}, {0x37e98000}, 
-    {0x37ea0000}, {0x37ea8000}, {0x37eb0000}, {0x37eb8000}, 
-    {0x37ec0000}, {0x37ec8000}, {0x37ed0000}, {0x37ed8000}, 
-    {0x37ee0000}, {0x37ee8000}, {0x37ef0000}, {0x37ef8000}, 
-    {0x37f00000}, {0x37f08000}, {0x37f10000}, {0x37f18000}, 
-    {0x37f20000}, {0x37f28000}, {0x37f30000}, {0x37f38000}, 
-    {0x37f40000}, {0x37f48000}, {0x37f50000}, {0x37f58000}, 
-    {0x37f60000}, {0x37f68000}, {0x37f70000}, {0x37f78000}, 
-    {0x37f80000}, {0x37f88000}, {0x37f90000}, {0x37f98000}, 
-    {0x37fa0000}, {0x37fa8000}, {0x37fb0000}, {0x37fb8000}, 
-    {0x37fc0000}, {0x37fc8000}, {0x37fd0000}, {0x37fd8000}, 
-    {0x37fe0000}, {0x37fe8000}, {0x37ff0000}, {0x37ff8000}, 
-    {0x38000000}, {0x38004000}, {0x38008000}, {0x3800c000}, 
-    {0x38010000}, {0x38014000}, {0x38018000}, {0x3801c000}, 
-    {0x38020000}, {0x38024000}, {0x38028000}, {0x3802c000}, 
-    {0x38030000}, {0x38034000}, {0x38038000}, {0x3803c000}, 
-    {0x38040000}, {0x38044000}, {0x38048000}, {0x3804c000}, 
-    {0x38050000}, {0x38054000}, {0x38058000}, {0x3805c000}, 
-    {0x38060000}, {0x38064000}, {0x38068000}, {0x3806c000}, 
-    {0x38070000}, {0x38074000}, {0x38078000}, {0x3807c000}, 
-    {0x38080000}, {0x38084000}, {0x38088000}, {0x3808c000}, 
-    {0x38090000}, {0x38094000}, {0x38098000}, {0x3809c000}, 
-    {0x380a0000}, {0x380a4000}, {0x380a8000}, {0x380ac000}, 
-    {0x380b0000}, {0x380b4000}, {0x380b8000}, {0x380bc000}, 
-    {0x380c0000}, {0x380c4000}, {0x380c8000}, {0x380cc000}, 
-    {0x380d0000}, {0x380d4000}, {0x380d8000}, {0x380dc000}, 
-    {0x380e0000}, {0x380e4000}, {0x380e8000}, {0x380ec000}, 
-    {0x380f0000}, {0x380f4000}, {0x380f8000}, {0x380fc000}, 
-    {0x38100000}, {0x38104000}, {0x38108000}, {0x3810c000}, 
-    {0x38110000}, {0x38114000}, {0x38118000}, {0x3811c000}, 
-    {0x38120000}, {0x38124000}, {0x38128000}, {0x3812c000}, 
-    {0x38130000}, {0x38134000}, {0x38138000}, {0x3813c000}, 
-    {0x38140000}, {0x38144000}, {0x38148000}, {0x3814c000}, 
-    {0x38150000}, {0x38154000}, {0x38158000}, {0x3815c000}, 
-    {0x38160000}, {0x38164000}, {0x38168000}, {0x3816c000}, 
-    {0x38170000}, {0x38174000}, {0x38178000}, {0x3817c000}, 
-    {0x38180000}, {0x38184000}, {0x38188000}, {0x3818c000}, 
-    {0x38190000}, {0x38194000}, {0x38198000}, {0x3819c000}, 
-    {0x381a0000}, {0x381a4000}, {0x381a8000}, {0x381ac000}, 
-    {0x381b0000}, {0x381b4000}, {0x381b8000}, {0x381bc000}, 
-    {0x381c0000}, {0x381c4000}, {0x381c8000}, {0x381cc000}, 
-    {0x381d0000}, {0x381d4000}, {0x381d8000}, {0x381dc000}, 
-    {0x381e0000}, {0x381e4000}, {0x381e8000}, {0x381ec000}, 
-    {0x381f0000}, {0x381f4000}, {0x381f8000}, {0x381fc000}, 
-    {0x38200000}, {0x38204000}, {0x38208000}, {0x3820c000}, 
-    {0x38210000}, {0x38214000}, {0x38218000}, {0x3821c000}, 
-    {0x38220000}, {0x38224000}, {0x38228000}, {0x3822c000}, 
-    {0x38230000}, {0x38234000}, {0x38238000}, {0x3823c000}, 
-    {0x38240000}, {0x38244000}, {0x38248000}, {0x3824c000}, 
-    {0x38250000}, {0x38254000}, {0x38258000}, {0x3825c000}, 
-    {0x38260000}, {0x38264000}, {0x38268000}, {0x3826c000}, 
-    {0x38270000}, {0x38274000}, {0x38278000}, {0x3827c000}, 
-    {0x38280000}, {0x38284000}, {0x38288000}, {0x3828c000}, 
-    {0x38290000}, {0x38294000}, {0x38298000}, {0x3829c000}, 
-    {0x382a0000}, {0x382a4000}, {0x382a8000}, {0x382ac000}, 
-    {0x382b0000}, {0x382b4000}, {0x382b8000}, {0x382bc000}, 
-    {0x382c0000}, {0x382c4000}, {0x382c8000}, {0x382cc000}, 
-    {0x382d0000}, {0x382d4000}, {0x382d8000}, {0x382dc000}, 
-    {0x382e0000}, {0x382e4000}, {0x382e8000}, {0x382ec000}, 
-    {0x382f0000}, {0x382f4000}, {0x382f8000}, {0x382fc000}, 
-    {0x38300000}, {0x38304000}, {0x38308000}, {0x3830c000}, 
-    {0x38310000}, {0x38314000}, {0x38318000}, {0x3831c000}, 
-    {0x38320000}, {0x38324000}, {0x38328000}, {0x3832c000}, 
-    {0x38330000}, {0x38334000}, {0x38338000}, {0x3833c000}, 
-    {0x38340000}, {0x38344000}, {0x38348000}, {0x3834c000}, 
-    {0x38350000}, {0x38354000}, {0x38358000}, {0x3835c000}, 
-    {0x38360000}, {0x38364000}, {0x38368000}, {0x3836c000}, 
-    {0x38370000}, {0x38374000}, {0x38378000}, {0x3837c000}, 
-    {0x38380000}, {0x38384000}, {0x38388000}, {0x3838c000}, 
-    {0x38390000}, {0x38394000}, {0x38398000}, {0x3839c000}, 
-    {0x383a0000}, {0x383a4000}, {0x383a8000}, {0x383ac000}, 
-    {0x383b0000}, {0x383b4000}, {0x383b8000}, {0x383bc000}, 
-    {0x383c0000}, {0x383c4000}, {0x383c8000}, {0x383cc000}, 
-    {0x383d0000}, {0x383d4000}, {0x383d8000}, {0x383dc000}, 
-    {0x383e0000}, {0x383e4000}, {0x383e8000}, {0x383ec000}, 
-    {0x383f0000}, {0x383f4000}, {0x383f8000}, {0x383fc000}, 
-    {0x38400000}, {0x38404000}, {0x38408000}, {0x3840c000}, 
-    {0x38410000}, {0x38414000}, {0x38418000}, {0x3841c000}, 
-    {0x38420000}, {0x38424000}, {0x38428000}, {0x3842c000}, 
-    {0x38430000}, {0x38434000}, {0x38438000}, {0x3843c000}, 
-    {0x38440000}, {0x38444000}, {0x38448000}, {0x3844c000}, 
-    {0x38450000}, {0x38454000}, {0x38458000}, {0x3845c000}, 
-    {0x38460000}, {0x38464000}, {0x38468000}, {0x3846c000}, 
-    {0x38470000}, {0x38474000}, {0x38478000}, {0x3847c000}, 
-    {0x38480000}, {0x38484000}, {0x38488000}, {0x3848c000}, 
-    {0x38490000}, {0x38494000}, {0x38498000}, {0x3849c000}, 
-    {0x384a0000}, {0x384a4000}, {0x384a8000}, {0x384ac000}, 
-    {0x384b0000}, {0x384b4000}, {0x384b8000}, {0x384bc000}, 
-    {0x384c0000}, {0x384c4000}, {0x384c8000}, {0x384cc000}, 
-    {0x384d0000}, {0x384d4000}, {0x384d8000}, {0x384dc000}, 
-    {0x384e0000}, {0x384e4000}, {0x384e8000}, {0x384ec000}, 
-    {0x384f0000}, {0x384f4000}, {0x384f8000}, {0x384fc000}, 
-    {0x38500000}, {0x38504000}, {0x38508000}, {0x3850c000}, 
-    {0x38510000}, {0x38514000}, {0x38518000}, {0x3851c000}, 
-    {0x38520000}, {0x38524000}, {0x38528000}, {0x3852c000}, 
-    {0x38530000}, {0x38534000}, {0x38538000}, {0x3853c000}, 
-    {0x38540000}, {0x38544000}, {0x38548000}, {0x3854c000}, 
-    {0x38550000}, {0x38554000}, {0x38558000}, {0x3855c000}, 
-    {0x38560000}, {0x38564000}, {0x38568000}, {0x3856c000}, 
-    {0x38570000}, {0x38574000}, {0x38578000}, {0x3857c000}, 
-    {0x38580000}, {0x38584000}, {0x38588000}, {0x3858c000}, 
-    {0x38590000}, {0x38594000}, {0x38598000}, {0x3859c000}, 
-    {0x385a0000}, {0x385a4000}, {0x385a8000}, {0x385ac000}, 
-    {0x385b0000}, {0x385b4000}, {0x385b8000}, {0x385bc000}, 
-    {0x385c0000}, {0x385c4000}, {0x385c8000}, {0x385cc000}, 
-    {0x385d0000}, {0x385d4000}, {0x385d8000}, {0x385dc000}, 
-    {0x385e0000}, {0x385e4000}, {0x385e8000}, {0x385ec000}, 
-    {0x385f0000}, {0x385f4000}, {0x385f8000}, {0x385fc000}, 
-    {0x38600000}, {0x38604000}, {0x38608000}, {0x3860c000}, 
-    {0x38610000}, {0x38614000}, {0x38618000}, {0x3861c000}, 
-    {0x38620000}, {0x38624000}, {0x38628000}, {0x3862c000}, 
-    {0x38630000}, {0x38634000}, {0x38638000}, {0x3863c000}, 
-    {0x38640000}, {0x38644000}, {0x38648000}, {0x3864c000}, 
-    {0x38650000}, {0x38654000}, {0x38658000}, {0x3865c000}, 
-    {0x38660000}, {0x38664000}, {0x38668000}, {0x3866c000}, 
-    {0x38670000}, {0x38674000}, {0x38678000}, {0x3867c000}, 
-    {0x38680000}, {0x38684000}, {0x38688000}, {0x3868c000}, 
-    {0x38690000}, {0x38694000}, {0x38698000}, {0x3869c000}, 
-    {0x386a0000}, {0x386a4000}, {0x386a8000}, {0x386ac000}, 
-    {0x386b0000}, {0x386b4000}, {0x386b8000}, {0x386bc000}, 
-    {0x386c0000}, {0x386c4000}, {0x386c8000}, {0x386cc000}, 
-    {0x386d0000}, {0x386d4000}, {0x386d8000}, {0x386dc000}, 
-    {0x386e0000}, {0x386e4000}, {0x386e8000}, {0x386ec000}, 
-    {0x386f0000}, {0x386f4000}, {0x386f8000}, {0x386fc000}, 
-    {0x38700000}, {0x38704000}, {0x38708000}, {0x3870c000}, 
-    {0x38710000}, {0x38714000}, {0x38718000}, {0x3871c000}, 
-    {0x38720000}, {0x38724000}, {0x38728000}, {0x3872c000}, 
-    {0x38730000}, {0x38734000}, {0x38738000}, {0x3873c000}, 
-    {0x38740000}, {0x38744000}, {0x38748000}, {0x3874c000}, 
-    {0x38750000}, {0x38754000}, {0x38758000}, {0x3875c000}, 
-    {0x38760000}, {0x38764000}, {0x38768000}, {0x3876c000}, 
-    {0x38770000}, {0x38774000}, {0x38778000}, {0x3877c000}, 
-    {0x38780000}, {0x38784000}, {0x38788000}, {0x3878c000}, 
-    {0x38790000}, {0x38794000}, {0x38798000}, {0x3879c000}, 
-    {0x387a0000}, {0x387a4000}, {0x387a8000}, {0x387ac000}, 
-    {0x387b0000}, {0x387b4000}, {0x387b8000}, {0x387bc000}, 
-    {0x387c0000}, {0x387c4000}, {0x387c8000}, {0x387cc000}, 
-    {0x387d0000}, {0x387d4000}, {0x387d8000}, {0x387dc000}, 
-    {0x387e0000}, {0x387e4000}, {0x387e8000}, {0x387ec000}, 
-    {0x387f0000}, {0x387f4000}, {0x387f8000}, {0x387fc000}, 
-    {0x38800000}, {0x38802000}, {0x38804000}, {0x38806000}, 
-    {0x38808000}, {0x3880a000}, {0x3880c000}, {0x3880e000}, 
-    {0x38810000}, {0x38812000}, {0x38814000}, {0x38816000}, 
-    {0x38818000}, {0x3881a000}, {0x3881c000}, {0x3881e000}, 
-    {0x38820000}, {0x38822000}, {0x38824000}, {0x38826000}, 
-    {0x38828000}, {0x3882a000}, {0x3882c000}, {0x3882e000}, 
-    {0x38830000}, {0x38832000}, {0x38834000}, {0x38836000}, 
-    {0x38838000}, {0x3883a000}, {0x3883c000}, {0x3883e000}, 
-    {0x38840000}, {0x38842000}, {0x38844000}, {0x38846000}, 
-    {0x38848000}, {0x3884a000}, {0x3884c000}, {0x3884e000}, 
-    {0x38850000}, {0x38852000}, {0x38854000}, {0x38856000}, 
-    {0x38858000}, {0x3885a000}, {0x3885c000}, {0x3885e000}, 
-    {0x38860000}, {0x38862000}, {0x38864000}, {0x38866000}, 
-    {0x38868000}, {0x3886a000}, {0x3886c000}, {0x3886e000}, 
-    {0x38870000}, {0x38872000}, {0x38874000}, {0x38876000}, 
-    {0x38878000}, {0x3887a000}, {0x3887c000}, {0x3887e000}, 
-    {0x38880000}, {0x38882000}, {0x38884000}, {0x38886000}, 
-    {0x38888000}, {0x3888a000}, {0x3888c000}, {0x3888e000}, 
-    {0x38890000}, {0x38892000}, {0x38894000}, {0x38896000}, 
-    {0x38898000}, {0x3889a000}, {0x3889c000}, {0x3889e000}, 
-    {0x388a0000}, {0x388a2000}, {0x388a4000}, {0x388a6000}, 
-    {0x388a8000}, {0x388aa000}, {0x388ac000}, {0x388ae000}, 
-    {0x388b0000}, {0x388b2000}, {0x388b4000}, {0x388b6000}, 
-    {0x388b8000}, {0x388ba000}, {0x388bc000}, {0x388be000}, 
-    {0x388c0000}, {0x388c2000}, {0x388c4000}, {0x388c6000}, 
-    {0x388c8000}, {0x388ca000}, {0x388cc000}, {0x388ce000}, 
-    {0x388d0000}, {0x388d2000}, {0x388d4000}, {0x388d6000}, 
-    {0x388d8000}, {0x388da000}, {0x388dc000}, {0x388de000}, 
-    {0x388e0000}, {0x388e2000}, {0x388e4000}, {0x388e6000}, 
-    {0x388e8000}, {0x388ea000}, {0x388ec000}, {0x388ee000}, 
-    {0x388f0000}, {0x388f2000}, {0x388f4000}, {0x388f6000}, 
-    {0x388f8000}, {0x388fa000}, {0x388fc000}, {0x388fe000}, 
-    {0x38900000}, {0x38902000}, {0x38904000}, {0x38906000}, 
-    {0x38908000}, {0x3890a000}, {0x3890c000}, {0x3890e000}, 
-    {0x38910000}, {0x38912000}, {0x38914000}, {0x38916000}, 
-    {0x38918000}, {0x3891a000}, {0x3891c000}, {0x3891e000}, 
-    {0x38920000}, {0x38922000}, {0x38924000}, {0x38926000}, 
-    {0x38928000}, {0x3892a000}, {0x3892c000}, {0x3892e000}, 
-    {0x38930000}, {0x38932000}, {0x38934000}, {0x38936000}, 
-    {0x38938000}, {0x3893a000}, {0x3893c000}, {0x3893e000}, 
-    {0x38940000}, {0x38942000}, {0x38944000}, {0x38946000}, 
-    {0x38948000}, {0x3894a000}, {0x3894c000}, {0x3894e000}, 
-    {0x38950000}, {0x38952000}, {0x38954000}, {0x38956000}, 
-    {0x38958000}, {0x3895a000}, {0x3895c000}, {0x3895e000}, 
-    {0x38960000}, {0x38962000}, {0x38964000}, {0x38966000}, 
-    {0x38968000}, {0x3896a000}, {0x3896c000}, {0x3896e000}, 
-    {0x38970000}, {0x38972000}, {0x38974000}, {0x38976000}, 
-    {0x38978000}, {0x3897a000}, {0x3897c000}, {0x3897e000}, 
-    {0x38980000}, {0x38982000}, {0x38984000}, {0x38986000}, 
-    {0x38988000}, {0x3898a000}, {0x3898c000}, {0x3898e000}, 
-    {0x38990000}, {0x38992000}, {0x38994000}, {0x38996000}, 
-    {0x38998000}, {0x3899a000}, {0x3899c000}, {0x3899e000}, 
-    {0x389a0000}, {0x389a2000}, {0x389a4000}, {0x389a6000}, 
-    {0x389a8000}, {0x389aa000}, {0x389ac000}, {0x389ae000}, 
-    {0x389b0000}, {0x389b2000}, {0x389b4000}, {0x389b6000}, 
-    {0x389b8000}, {0x389ba000}, {0x389bc000}, {0x389be000}, 
-    {0x389c0000}, {0x389c2000}, {0x389c4000}, {0x389c6000}, 
-    {0x389c8000}, {0x389ca000}, {0x389cc000}, {0x389ce000}, 
-    {0x389d0000}, {0x389d2000}, {0x389d4000}, {0x389d6000}, 
-    {0x389d8000}, {0x389da000}, {0x389dc000}, {0x389de000}, 
-    {0x389e0000}, {0x389e2000}, {0x389e4000}, {0x389e6000}, 
-    {0x389e8000}, {0x389ea000}, {0x389ec000}, {0x389ee000}, 
-    {0x389f0000}, {0x389f2000}, {0x389f4000}, {0x389f6000}, 
-    {0x389f8000}, {0x389fa000}, {0x389fc000}, {0x389fe000}, 
-    {0x38a00000}, {0x38a02000}, {0x38a04000}, {0x38a06000}, 
-    {0x38a08000}, {0x38a0a000}, {0x38a0c000}, {0x38a0e000}, 
-    {0x38a10000}, {0x38a12000}, {0x38a14000}, {0x38a16000}, 
-    {0x38a18000}, {0x38a1a000}, {0x38a1c000}, {0x38a1e000}, 
-    {0x38a20000}, {0x38a22000}, {0x38a24000}, {0x38a26000}, 
-    {0x38a28000}, {0x38a2a000}, {0x38a2c000}, {0x38a2e000}, 
-    {0x38a30000}, {0x38a32000}, {0x38a34000}, {0x38a36000}, 
-    {0x38a38000}, {0x38a3a000}, {0x38a3c000}, {0x38a3e000}, 
-    {0x38a40000}, {0x38a42000}, {0x38a44000}, {0x38a46000}, 
-    {0x38a48000}, {0x38a4a000}, {0x38a4c000}, {0x38a4e000}, 
-    {0x38a50000}, {0x38a52000}, {0x38a54000}, {0x38a56000}, 
-    {0x38a58000}, {0x38a5a000}, {0x38a5c000}, {0x38a5e000}, 
-    {0x38a60000}, {0x38a62000}, {0x38a64000}, {0x38a66000}, 
-    {0x38a68000}, {0x38a6a000}, {0x38a6c000}, {0x38a6e000}, 
-    {0x38a70000}, {0x38a72000}, {0x38a74000}, {0x38a76000}, 
-    {0x38a78000}, {0x38a7a000}, {0x38a7c000}, {0x38a7e000}, 
-    {0x38a80000}, {0x38a82000}, {0x38a84000}, {0x38a86000}, 
-    {0x38a88000}, {0x38a8a000}, {0x38a8c000}, {0x38a8e000}, 
-    {0x38a90000}, {0x38a92000}, {0x38a94000}, {0x38a96000}, 
-    {0x38a98000}, {0x38a9a000}, {0x38a9c000}, {0x38a9e000}, 
-    {0x38aa0000}, {0x38aa2000}, {0x38aa4000}, {0x38aa6000}, 
-    {0x38aa8000}, {0x38aaa000}, {0x38aac000}, {0x38aae000}, 
-    {0x38ab0000}, {0x38ab2000}, {0x38ab4000}, {0x38ab6000}, 
-    {0x38ab8000}, {0x38aba000}, {0x38abc000}, {0x38abe000}, 
-    {0x38ac0000}, {0x38ac2000}, {0x38ac4000}, {0x38ac6000}, 
-    {0x38ac8000}, {0x38aca000}, {0x38acc000}, {0x38ace000}, 
-    {0x38ad0000}, {0x38ad2000}, {0x38ad4000}, {0x38ad6000}, 
-    {0x38ad8000}, {0x38ada000}, {0x38adc000}, {0x38ade000}, 
-    {0x38ae0000}, {0x38ae2000}, {0x38ae4000}, {0x38ae6000}, 
-    {0x38ae8000}, {0x38aea000}, {0x38aec000}, {0x38aee000}, 
-    {0x38af0000}, {0x38af2000}, {0x38af4000}, {0x38af6000}, 
-    {0x38af8000}, {0x38afa000}, {0x38afc000}, {0x38afe000}, 
-    {0x38b00000}, {0x38b02000}, {0x38b04000}, {0x38b06000}, 
-    {0x38b08000}, {0x38b0a000}, {0x38b0c000}, {0x38b0e000}, 
-    {0x38b10000}, {0x38b12000}, {0x38b14000}, {0x38b16000}, 
-    {0x38b18000}, {0x38b1a000}, {0x38b1c000}, {0x38b1e000}, 
-    {0x38b20000}, {0x38b22000}, {0x38b24000}, {0x38b26000}, 
-    {0x38b28000}, {0x38b2a000}, {0x38b2c000}, {0x38b2e000}, 
-    {0x38b30000}, {0x38b32000}, {0x38b34000}, {0x38b36000}, 
-    {0x38b38000}, {0x38b3a000}, {0x38b3c000}, {0x38b3e000}, 
-    {0x38b40000}, {0x38b42000}, {0x38b44000}, {0x38b46000}, 
-    {0x38b48000}, {0x38b4a000}, {0x38b4c000}, {0x38b4e000}, 
-    {0x38b50000}, {0x38b52000}, {0x38b54000}, {0x38b56000}, 
-    {0x38b58000}, {0x38b5a000}, {0x38b5c000}, {0x38b5e000}, 
-    {0x38b60000}, {0x38b62000}, {0x38b64000}, {0x38b66000}, 
-    {0x38b68000}, {0x38b6a000}, {0x38b6c000}, {0x38b6e000}, 
-    {0x38b70000}, {0x38b72000}, {0x38b74000}, {0x38b76000}, 
-    {0x38b78000}, {0x38b7a000}, {0x38b7c000}, {0x38b7e000}, 
-    {0x38b80000}, {0x38b82000}, {0x38b84000}, {0x38b86000}, 
-    {0x38b88000}, {0x38b8a000}, {0x38b8c000}, {0x38b8e000}, 
-    {0x38b90000}, {0x38b92000}, {0x38b94000}, {0x38b96000}, 
-    {0x38b98000}, {0x38b9a000}, {0x38b9c000}, {0x38b9e000}, 
-    {0x38ba0000}, {0x38ba2000}, {0x38ba4000}, {0x38ba6000}, 
-    {0x38ba8000}, {0x38baa000}, {0x38bac000}, {0x38bae000}, 
-    {0x38bb0000}, {0x38bb2000}, {0x38bb4000}, {0x38bb6000}, 
-    {0x38bb8000}, {0x38bba000}, {0x38bbc000}, {0x38bbe000}, 
-    {0x38bc0000}, {0x38bc2000}, {0x38bc4000}, {0x38bc6000}, 
-    {0x38bc8000}, {0x38bca000}, {0x38bcc000}, {0x38bce000}, 
-    {0x38bd0000}, {0x38bd2000}, {0x38bd4000}, {0x38bd6000}, 
-    {0x38bd8000}, {0x38bda000}, {0x38bdc000}, {0x38bde000}, 
-    {0x38be0000}, {0x38be2000}, {0x38be4000}, {0x38be6000}, 
-    {0x38be8000}, {0x38bea000}, {0x38bec000}, {0x38bee000}, 
-    {0x38bf0000}, {0x38bf2000}, {0x38bf4000}, {0x38bf6000}, 
-    {0x38bf8000}, {0x38bfa000}, {0x38bfc000}, {0x38bfe000}, 
-    {0x38c00000}, {0x38c02000}, {0x38c04000}, {0x38c06000}, 
-    {0x38c08000}, {0x38c0a000}, {0x38c0c000}, {0x38c0e000}, 
-    {0x38c10000}, {0x38c12000}, {0x38c14000}, {0x38c16000}, 
-    {0x38c18000}, {0x38c1a000}, {0x38c1c000}, {0x38c1e000}, 
-    {0x38c20000}, {0x38c22000}, {0x38c24000}, {0x38c26000}, 
-    {0x38c28000}, {0x38c2a000}, {0x38c2c000}, {0x38c2e000}, 
-    {0x38c30000}, {0x38c32000}, {0x38c34000}, {0x38c36000}, 
-    {0x38c38000}, {0x38c3a000}, {0x38c3c000}, {0x38c3e000}, 
-    {0x38c40000}, {0x38c42000}, {0x38c44000}, {0x38c46000}, 
-    {0x38c48000}, {0x38c4a000}, {0x38c4c000}, {0x38c4e000}, 
-    {0x38c50000}, {0x38c52000}, {0x38c54000}, {0x38c56000}, 
-    {0x38c58000}, {0x38c5a000}, {0x38c5c000}, {0x38c5e000}, 
-    {0x38c60000}, {0x38c62000}, {0x38c64000}, {0x38c66000}, 
-    {0x38c68000}, {0x38c6a000}, {0x38c6c000}, {0x38c6e000}, 
-    {0x38c70000}, {0x38c72000}, {0x38c74000}, {0x38c76000}, 
-    {0x38c78000}, {0x38c7a000}, {0x38c7c000}, {0x38c7e000}, 
-    {0x38c80000}, {0x38c82000}, {0x38c84000}, {0x38c86000}, 
-    {0x38c88000}, {0x38c8a000}, {0x38c8c000}, {0x38c8e000}, 
-    {0x38c90000}, {0x38c92000}, {0x38c94000}, {0x38c96000}, 
-    {0x38c98000}, {0x38c9a000}, {0x38c9c000}, {0x38c9e000}, 
-    {0x38ca0000}, {0x38ca2000}, {0x38ca4000}, {0x38ca6000}, 
-    {0x38ca8000}, {0x38caa000}, {0x38cac000}, {0x38cae000}, 
-    {0x38cb0000}, {0x38cb2000}, {0x38cb4000}, {0x38cb6000}, 
-    {0x38cb8000}, {0x38cba000}, {0x38cbc000}, {0x38cbe000}, 
-    {0x38cc0000}, {0x38cc2000}, {0x38cc4000}, {0x38cc6000}, 
-    {0x38cc8000}, {0x38cca000}, {0x38ccc000}, {0x38cce000}, 
-    {0x38cd0000}, {0x38cd2000}, {0x38cd4000}, {0x38cd6000}, 
-    {0x38cd8000}, {0x38cda000}, {0x38cdc000}, {0x38cde000}, 
-    {0x38ce0000}, {0x38ce2000}, {0x38ce4000}, {0x38ce6000}, 
-    {0x38ce8000}, {0x38cea000}, {0x38cec000}, {0x38cee000}, 
-    {0x38cf0000}, {0x38cf2000}, {0x38cf4000}, {0x38cf6000}, 
-    {0x38cf8000}, {0x38cfa000}, {0x38cfc000}, {0x38cfe000}, 
-    {0x38d00000}, {0x38d02000}, {0x38d04000}, {0x38d06000}, 
-    {0x38d08000}, {0x38d0a000}, {0x38d0c000}, {0x38d0e000}, 
-    {0x38d10000}, {0x38d12000}, {0x38d14000}, {0x38d16000}, 
-    {0x38d18000}, {0x38d1a000}, {0x38d1c000}, {0x38d1e000}, 
-    {0x38d20000}, {0x38d22000}, {0x38d24000}, {0x38d26000}, 
-    {0x38d28000}, {0x38d2a000}, {0x38d2c000}, {0x38d2e000}, 
-    {0x38d30000}, {0x38d32000}, {0x38d34000}, {0x38d36000}, 
-    {0x38d38000}, {0x38d3a000}, {0x38d3c000}, {0x38d3e000}, 
-    {0x38d40000}, {0x38d42000}, {0x38d44000}, {0x38d46000}, 
-    {0x38d48000}, {0x38d4a000}, {0x38d4c000}, {0x38d4e000}, 
-    {0x38d50000}, {0x38d52000}, {0x38d54000}, {0x38d56000}, 
-    {0x38d58000}, {0x38d5a000}, {0x38d5c000}, {0x38d5e000}, 
-    {0x38d60000}, {0x38d62000}, {0x38d64000}, {0x38d66000}, 
-    {0x38d68000}, {0x38d6a000}, {0x38d6c000}, {0x38d6e000}, 
-    {0x38d70000}, {0x38d72000}, {0x38d74000}, {0x38d76000}, 
-    {0x38d78000}, {0x38d7a000}, {0x38d7c000}, {0x38d7e000}, 
-    {0x38d80000}, {0x38d82000}, {0x38d84000}, {0x38d86000}, 
-    {0x38d88000}, {0x38d8a000}, {0x38d8c000}, {0x38d8e000}, 
-    {0x38d90000}, {0x38d92000}, {0x38d94000}, {0x38d96000}, 
-    {0x38d98000}, {0x38d9a000}, {0x38d9c000}, {0x38d9e000}, 
-    {0x38da0000}, {0x38da2000}, {0x38da4000}, {0x38da6000}, 
-    {0x38da8000}, {0x38daa000}, {0x38dac000}, {0x38dae000}, 
-    {0x38db0000}, {0x38db2000}, {0x38db4000}, {0x38db6000}, 
-    {0x38db8000}, {0x38dba000}, {0x38dbc000}, {0x38dbe000}, 
-    {0x38dc0000}, {0x38dc2000}, {0x38dc4000}, {0x38dc6000}, 
-    {0x38dc8000}, {0x38dca000}, {0x38dcc000}, {0x38dce000}, 
-    {0x38dd0000}, {0x38dd2000}, {0x38dd4000}, {0x38dd6000}, 
-    {0x38dd8000}, {0x38dda000}, {0x38ddc000}, {0x38dde000}, 
-    {0x38de0000}, {0x38de2000}, {0x38de4000}, {0x38de6000}, 
-    {0x38de8000}, {0x38dea000}, {0x38dec000}, {0x38dee000}, 
-    {0x38df0000}, {0x38df2000}, {0x38df4000}, {0x38df6000}, 
-    {0x38df8000}, {0x38dfa000}, {0x38dfc000}, {0x38dfe000}, 
-    {0x38e00000}, {0x38e02000}, {0x38e04000}, {0x38e06000}, 
-    {0x38e08000}, {0x38e0a000}, {0x38e0c000}, {0x38e0e000}, 
-    {0x38e10000}, {0x38e12000}, {0x38e14000}, {0x38e16000}, 
-    {0x38e18000}, {0x38e1a000}, {0x38e1c000}, {0x38e1e000}, 
-    {0x38e20000}, {0x38e22000}, {0x38e24000}, {0x38e26000}, 
-    {0x38e28000}, {0x38e2a000}, {0x38e2c000}, {0x38e2e000}, 
-    {0x38e30000}, {0x38e32000}, {0x38e34000}, {0x38e36000}, 
-    {0x38e38000}, {0x38e3a000}, {0x38e3c000}, {0x38e3e000}, 
-    {0x38e40000}, {0x38e42000}, {0x38e44000}, {0x38e46000}, 
-    {0x38e48000}, {0x38e4a000}, {0x38e4c000}, {0x38e4e000}, 
-    {0x38e50000}, {0x38e52000}, {0x38e54000}, {0x38e56000}, 
-    {0x38e58000}, {0x38e5a000}, {0x38e5c000}, {0x38e5e000}, 
-    {0x38e60000}, {0x38e62000}, {0x38e64000}, {0x38e66000}, 
-    {0x38e68000}, {0x38e6a000}, {0x38e6c000}, {0x38e6e000}, 
-    {0x38e70000}, {0x38e72000}, {0x38e74000}, {0x38e76000}, 
-    {0x38e78000}, {0x38e7a000}, {0x38e7c000}, {0x38e7e000}, 
-    {0x38e80000}, {0x38e82000}, {0x38e84000}, {0x38e86000}, 
-    {0x38e88000}, {0x38e8a000}, {0x38e8c000}, {0x38e8e000}, 
-    {0x38e90000}, {0x38e92000}, {0x38e94000}, {0x38e96000}, 
-    {0x38e98000}, {0x38e9a000}, {0x38e9c000}, {0x38e9e000}, 
-    {0x38ea0000}, {0x38ea2000}, {0x38ea4000}, {0x38ea6000}, 
-    {0x38ea8000}, {0x38eaa000}, {0x38eac000}, {0x38eae000}, 
-    {0x38eb0000}, {0x38eb2000}, {0x38eb4000}, {0x38eb6000}, 
-    {0x38eb8000}, {0x38eba000}, {0x38ebc000}, {0x38ebe000}, 
-    {0x38ec0000}, {0x38ec2000}, {0x38ec4000}, {0x38ec6000}, 
-    {0x38ec8000}, {0x38eca000}, {0x38ecc000}, {0x38ece000}, 
-    {0x38ed0000}, {0x38ed2000}, {0x38ed4000}, {0x38ed6000}, 
-    {0x38ed8000}, {0x38eda000}, {0x38edc000}, {0x38ede000}, 
-    {0x38ee0000}, {0x38ee2000}, {0x38ee4000}, {0x38ee6000}, 
-    {0x38ee8000}, {0x38eea000}, {0x38eec000}, {0x38eee000}, 
-    {0x38ef0000}, {0x38ef2000}, {0x38ef4000}, {0x38ef6000}, 
-    {0x38ef8000}, {0x38efa000}, {0x38efc000}, {0x38efe000}, 
-    {0x38f00000}, {0x38f02000}, {0x38f04000}, {0x38f06000}, 
-    {0x38f08000}, {0x38f0a000}, {0x38f0c000}, {0x38f0e000}, 
-    {0x38f10000}, {0x38f12000}, {0x38f14000}, {0x38f16000}, 
-    {0x38f18000}, {0x38f1a000}, {0x38f1c000}, {0x38f1e000}, 
-    {0x38f20000}, {0x38f22000}, {0x38f24000}, {0x38f26000}, 
-    {0x38f28000}, {0x38f2a000}, {0x38f2c000}, {0x38f2e000}, 
-    {0x38f30000}, {0x38f32000}, {0x38f34000}, {0x38f36000}, 
-    {0x38f38000}, {0x38f3a000}, {0x38f3c000}, {0x38f3e000}, 
-    {0x38f40000}, {0x38f42000}, {0x38f44000}, {0x38f46000}, 
-    {0x38f48000}, {0x38f4a000}, {0x38f4c000}, {0x38f4e000}, 
-    {0x38f50000}, {0x38f52000}, {0x38f54000}, {0x38f56000}, 
-    {0x38f58000}, {0x38f5a000}, {0x38f5c000}, {0x38f5e000}, 
-    {0x38f60000}, {0x38f62000}, {0x38f64000}, {0x38f66000}, 
-    {0x38f68000}, {0x38f6a000}, {0x38f6c000}, {0x38f6e000}, 
-    {0x38f70000}, {0x38f72000}, {0x38f74000}, {0x38f76000}, 
-    {0x38f78000}, {0x38f7a000}, {0x38f7c000}, {0x38f7e000}, 
-    {0x38f80000}, {0x38f82000}, {0x38f84000}, {0x38f86000}, 
-    {0x38f88000}, {0x38f8a000}, {0x38f8c000}, {0x38f8e000}, 
-    {0x38f90000}, {0x38f92000}, {0x38f94000}, {0x38f96000}, 
-    {0x38f98000}, {0x38f9a000}, {0x38f9c000}, {0x38f9e000}, 
-    {0x38fa0000}, {0x38fa2000}, {0x38fa4000}, {0x38fa6000}, 
-    {0x38fa8000}, {0x38faa000}, {0x38fac000}, {0x38fae000}, 
-    {0x38fb0000}, {0x38fb2000}, {0x38fb4000}, {0x38fb6000}, 
-    {0x38fb8000}, {0x38fba000}, {0x38fbc000}, {0x38fbe000}, 
-    {0x38fc0000}, {0x38fc2000}, {0x38fc4000}, {0x38fc6000}, 
-    {0x38fc8000}, {0x38fca000}, {0x38fcc000}, {0x38fce000}, 
-    {0x38fd0000}, {0x38fd2000}, {0x38fd4000}, {0x38fd6000}, 
-    {0x38fd8000}, {0x38fda000}, {0x38fdc000}, {0x38fde000}, 
-    {0x38fe0000}, {0x38fe2000}, {0x38fe4000}, {0x38fe6000}, 
-    {0x38fe8000}, {0x38fea000}, {0x38fec000}, {0x38fee000}, 
-    {0x38ff0000}, {0x38ff2000}, {0x38ff4000}, {0x38ff6000}, 
-    {0x38ff8000}, {0x38ffa000}, {0x38ffc000}, {0x38ffe000}, 
-    {0x39000000}, {0x39002000}, {0x39004000}, {0x39006000}, 
-    {0x39008000}, {0x3900a000}, {0x3900c000}, {0x3900e000}, 
-    {0x39010000}, {0x39012000}, {0x39014000}, {0x39016000}, 
-    {0x39018000}, {0x3901a000}, {0x3901c000}, {0x3901e000}, 
-    {0x39020000}, {0x39022000}, {0x39024000}, {0x39026000}, 
-    {0x39028000}, {0x3902a000}, {0x3902c000}, {0x3902e000}, 
-    {0x39030000}, {0x39032000}, {0x39034000}, {0x39036000}, 
-    {0x39038000}, {0x3903a000}, {0x3903c000}, {0x3903e000}, 
-    {0x39040000}, {0x39042000}, {0x39044000}, {0x39046000}, 
-    {0x39048000}, {0x3904a000}, {0x3904c000}, {0x3904e000}, 
-    {0x39050000}, {0x39052000}, {0x39054000}, {0x39056000}, 
-    {0x39058000}, {0x3905a000}, {0x3905c000}, {0x3905e000}, 
-    {0x39060000}, {0x39062000}, {0x39064000}, {0x39066000}, 
-    {0x39068000}, {0x3906a000}, {0x3906c000}, {0x3906e000}, 
-    {0x39070000}, {0x39072000}, {0x39074000}, {0x39076000}, 
-    {0x39078000}, {0x3907a000}, {0x3907c000}, {0x3907e000}, 
-    {0x39080000}, {0x39082000}, {0x39084000}, {0x39086000}, 
-    {0x39088000}, {0x3908a000}, {0x3908c000}, {0x3908e000}, 
-    {0x39090000}, {0x39092000}, {0x39094000}, {0x39096000}, 
-    {0x39098000}, {0x3909a000}, {0x3909c000}, {0x3909e000}, 
-    {0x390a0000}, {0x390a2000}, {0x390a4000}, {0x390a6000}, 
-    {0x390a8000}, {0x390aa000}, {0x390ac000}, {0x390ae000}, 
-    {0x390b0000}, {0x390b2000}, {0x390b4000}, {0x390b6000}, 
-    {0x390b8000}, {0x390ba000}, {0x390bc000}, {0x390be000}, 
-    {0x390c0000}, {0x390c2000}, {0x390c4000}, {0x390c6000}, 
-    {0x390c8000}, {0x390ca000}, {0x390cc000}, {0x390ce000}, 
-    {0x390d0000}, {0x390d2000}, {0x390d4000}, {0x390d6000}, 
-    {0x390d8000}, {0x390da000}, {0x390dc000}, {0x390de000}, 
-    {0x390e0000}, {0x390e2000}, {0x390e4000}, {0x390e6000}, 
-    {0x390e8000}, {0x390ea000}, {0x390ec000}, {0x390ee000}, 
-    {0x390f0000}, {0x390f2000}, {0x390f4000}, {0x390f6000}, 
-    {0x390f8000}, {0x390fa000}, {0x390fc000}, {0x390fe000}, 
-    {0x39100000}, {0x39102000}, {0x39104000}, {0x39106000}, 
-    {0x39108000}, {0x3910a000}, {0x3910c000}, {0x3910e000}, 
-    {0x39110000}, {0x39112000}, {0x39114000}, {0x39116000}, 
-    {0x39118000}, {0x3911a000}, {0x3911c000}, {0x3911e000}, 
-    {0x39120000}, {0x39122000}, {0x39124000}, {0x39126000}, 
-    {0x39128000}, {0x3912a000}, {0x3912c000}, {0x3912e000}, 
-    {0x39130000}, {0x39132000}, {0x39134000}, {0x39136000}, 
-    {0x39138000}, {0x3913a000}, {0x3913c000}, {0x3913e000}, 
-    {0x39140000}, {0x39142000}, {0x39144000}, {0x39146000}, 
-    {0x39148000}, {0x3914a000}, {0x3914c000}, {0x3914e000}, 
-    {0x39150000}, {0x39152000}, {0x39154000}, {0x39156000}, 
-    {0x39158000}, {0x3915a000}, {0x3915c000}, {0x3915e000}, 
-    {0x39160000}, {0x39162000}, {0x39164000}, {0x39166000}, 
-    {0x39168000}, {0x3916a000}, {0x3916c000}, {0x3916e000}, 
-    {0x39170000}, {0x39172000}, {0x39174000}, {0x39176000}, 
-    {0x39178000}, {0x3917a000}, {0x3917c000}, {0x3917e000}, 
-    {0x39180000}, {0x39182000}, {0x39184000}, {0x39186000}, 
-    {0x39188000}, {0x3918a000}, {0x3918c000}, {0x3918e000}, 
-    {0x39190000}, {0x39192000}, {0x39194000}, {0x39196000}, 
-    {0x39198000}, {0x3919a000}, {0x3919c000}, {0x3919e000}, 
-    {0x391a0000}, {0x391a2000}, {0x391a4000}, {0x391a6000}, 
-    {0x391a8000}, {0x391aa000}, {0x391ac000}, {0x391ae000}, 
-    {0x391b0000}, {0x391b2000}, {0x391b4000}, {0x391b6000}, 
-    {0x391b8000}, {0x391ba000}, {0x391bc000}, {0x391be000}, 
-    {0x391c0000}, {0x391c2000}, {0x391c4000}, {0x391c6000}, 
-    {0x391c8000}, {0x391ca000}, {0x391cc000}, {0x391ce000}, 
-    {0x391d0000}, {0x391d2000}, {0x391d4000}, {0x391d6000}, 
-    {0x391d8000}, {0x391da000}, {0x391dc000}, {0x391de000}, 
-    {0x391e0000}, {0x391e2000}, {0x391e4000}, {0x391e6000}, 
-    {0x391e8000}, {0x391ea000}, {0x391ec000}, {0x391ee000}, 
-    {0x391f0000}, {0x391f2000}, {0x391f4000}, {0x391f6000}, 
-    {0x391f8000}, {0x391fa000}, {0x391fc000}, {0x391fe000}, 
-    {0x39200000}, {0x39202000}, {0x39204000}, {0x39206000}, 
-    {0x39208000}, {0x3920a000}, {0x3920c000}, {0x3920e000}, 
-    {0x39210000}, {0x39212000}, {0x39214000}, {0x39216000}, 
-    {0x39218000}, {0x3921a000}, {0x3921c000}, {0x3921e000}, 
-    {0x39220000}, {0x39222000}, {0x39224000}, {0x39226000}, 
-    {0x39228000}, {0x3922a000}, {0x3922c000}, {0x3922e000}, 
-    {0x39230000}, {0x39232000}, {0x39234000}, {0x39236000}, 
-    {0x39238000}, {0x3923a000}, {0x3923c000}, {0x3923e000}, 
-    {0x39240000}, {0x39242000}, {0x39244000}, {0x39246000}, 
-    {0x39248000}, {0x3924a000}, {0x3924c000}, {0x3924e000}, 
-    {0x39250000}, {0x39252000}, {0x39254000}, {0x39256000}, 
-    {0x39258000}, {0x3925a000}, {0x3925c000}, {0x3925e000}, 
-    {0x39260000}, {0x39262000}, {0x39264000}, {0x39266000}, 
-    {0x39268000}, {0x3926a000}, {0x3926c000}, {0x3926e000}, 
-    {0x39270000}, {0x39272000}, {0x39274000}, {0x39276000}, 
-    {0x39278000}, {0x3927a000}, {0x3927c000}, {0x3927e000}, 
-    {0x39280000}, {0x39282000}, {0x39284000}, {0x39286000}, 
-    {0x39288000}, {0x3928a000}, {0x3928c000}, {0x3928e000}, 
-    {0x39290000}, {0x39292000}, {0x39294000}, {0x39296000}, 
-    {0x39298000}, {0x3929a000}, {0x3929c000}, {0x3929e000}, 
-    {0x392a0000}, {0x392a2000}, {0x392a4000}, {0x392a6000}, 
-    {0x392a8000}, {0x392aa000}, {0x392ac000}, {0x392ae000}, 
-    {0x392b0000}, {0x392b2000}, {0x392b4000}, {0x392b6000}, 
-    {0x392b8000}, {0x392ba000}, {0x392bc000}, {0x392be000}, 
-    {0x392c0000}, {0x392c2000}, {0x392c4000}, {0x392c6000}, 
-    {0x392c8000}, {0x392ca000}, {0x392cc000}, {0x392ce000}, 
-    {0x392d0000}, {0x392d2000}, {0x392d4000}, {0x392d6000}, 
-    {0x392d8000}, {0x392da000}, {0x392dc000}, {0x392de000}, 
-    {0x392e0000}, {0x392e2000}, {0x392e4000}, {0x392e6000}, 
-    {0x392e8000}, {0x392ea000}, {0x392ec000}, {0x392ee000}, 
-    {0x392f0000}, {0x392f2000}, {0x392f4000}, {0x392f6000}, 
-    {0x392f8000}, {0x392fa000}, {0x392fc000}, {0x392fe000}, 
-    {0x39300000}, {0x39302000}, {0x39304000}, {0x39306000}, 
-    {0x39308000}, {0x3930a000}, {0x3930c000}, {0x3930e000}, 
-    {0x39310000}, {0x39312000}, {0x39314000}, {0x39316000}, 
-    {0x39318000}, {0x3931a000}, {0x3931c000}, {0x3931e000}, 
-    {0x39320000}, {0x39322000}, {0x39324000}, {0x39326000}, 
-    {0x39328000}, {0x3932a000}, {0x3932c000}, {0x3932e000}, 
-    {0x39330000}, {0x39332000}, {0x39334000}, {0x39336000}, 
-    {0x39338000}, {0x3933a000}, {0x3933c000}, {0x3933e000}, 
-    {0x39340000}, {0x39342000}, {0x39344000}, {0x39346000}, 
-    {0x39348000}, {0x3934a000}, {0x3934c000}, {0x3934e000}, 
-    {0x39350000}, {0x39352000}, {0x39354000}, {0x39356000}, 
-    {0x39358000}, {0x3935a000}, {0x3935c000}, {0x3935e000}, 
-    {0x39360000}, {0x39362000}, {0x39364000}, {0x39366000}, 
-    {0x39368000}, {0x3936a000}, {0x3936c000}, {0x3936e000}, 
-    {0x39370000}, {0x39372000}, {0x39374000}, {0x39376000}, 
-    {0x39378000}, {0x3937a000}, {0x3937c000}, {0x3937e000}, 
-    {0x39380000}, {0x39382000}, {0x39384000}, {0x39386000}, 
-    {0x39388000}, {0x3938a000}, {0x3938c000}, {0x3938e000}, 
-    {0x39390000}, {0x39392000}, {0x39394000}, {0x39396000}, 
-    {0x39398000}, {0x3939a000}, {0x3939c000}, {0x3939e000}, 
-    {0x393a0000}, {0x393a2000}, {0x393a4000}, {0x393a6000}, 
-    {0x393a8000}, {0x393aa000}, {0x393ac000}, {0x393ae000}, 
-    {0x393b0000}, {0x393b2000}, {0x393b4000}, {0x393b6000}, 
-    {0x393b8000}, {0x393ba000}, {0x393bc000}, {0x393be000}, 
-    {0x393c0000}, {0x393c2000}, {0x393c4000}, {0x393c6000}, 
-    {0x393c8000}, {0x393ca000}, {0x393cc000}, {0x393ce000}, 
-    {0x393d0000}, {0x393d2000}, {0x393d4000}, {0x393d6000}, 
-    {0x393d8000}, {0x393da000}, {0x393dc000}, {0x393de000}, 
-    {0x393e0000}, {0x393e2000}, {0x393e4000}, {0x393e6000}, 
-    {0x393e8000}, {0x393ea000}, {0x393ec000}, {0x393ee000}, 
-    {0x393f0000}, {0x393f2000}, {0x393f4000}, {0x393f6000}, 
-    {0x393f8000}, {0x393fa000}, {0x393fc000}, {0x393fe000}, 
-    {0x39400000}, {0x39402000}, {0x39404000}, {0x39406000}, 
-    {0x39408000}, {0x3940a000}, {0x3940c000}, {0x3940e000}, 
-    {0x39410000}, {0x39412000}, {0x39414000}, {0x39416000}, 
-    {0x39418000}, {0x3941a000}, {0x3941c000}, {0x3941e000}, 
-    {0x39420000}, {0x39422000}, {0x39424000}, {0x39426000}, 
-    {0x39428000}, {0x3942a000}, {0x3942c000}, {0x3942e000}, 
-    {0x39430000}, {0x39432000}, {0x39434000}, {0x39436000}, 
-    {0x39438000}, {0x3943a000}, {0x3943c000}, {0x3943e000}, 
-    {0x39440000}, {0x39442000}, {0x39444000}, {0x39446000}, 
-    {0x39448000}, {0x3944a000}, {0x3944c000}, {0x3944e000}, 
-    {0x39450000}, {0x39452000}, {0x39454000}, {0x39456000}, 
-    {0x39458000}, {0x3945a000}, {0x3945c000}, {0x3945e000}, 
-    {0x39460000}, {0x39462000}, {0x39464000}, {0x39466000}, 
-    {0x39468000}, {0x3946a000}, {0x3946c000}, {0x3946e000}, 
-    {0x39470000}, {0x39472000}, {0x39474000}, {0x39476000}, 
-    {0x39478000}, {0x3947a000}, {0x3947c000}, {0x3947e000}, 
-    {0x39480000}, {0x39482000}, {0x39484000}, {0x39486000}, 
-    {0x39488000}, {0x3948a000}, {0x3948c000}, {0x3948e000}, 
-    {0x39490000}, {0x39492000}, {0x39494000}, {0x39496000}, 
-    {0x39498000}, {0x3949a000}, {0x3949c000}, {0x3949e000}, 
-    {0x394a0000}, {0x394a2000}, {0x394a4000}, {0x394a6000}, 
-    {0x394a8000}, {0x394aa000}, {0x394ac000}, {0x394ae000}, 
-    {0x394b0000}, {0x394b2000}, {0x394b4000}, {0x394b6000}, 
-    {0x394b8000}, {0x394ba000}, {0x394bc000}, {0x394be000}, 
-    {0x394c0000}, {0x394c2000}, {0x394c4000}, {0x394c6000}, 
-    {0x394c8000}, {0x394ca000}, {0x394cc000}, {0x394ce000}, 
-    {0x394d0000}, {0x394d2000}, {0x394d4000}, {0x394d6000}, 
-    {0x394d8000}, {0x394da000}, {0x394dc000}, {0x394de000}, 
-    {0x394e0000}, {0x394e2000}, {0x394e4000}, {0x394e6000}, 
-    {0x394e8000}, {0x394ea000}, {0x394ec000}, {0x394ee000}, 
-    {0x394f0000}, {0x394f2000}, {0x394f4000}, {0x394f6000}, 
-    {0x394f8000}, {0x394fa000}, {0x394fc000}, {0x394fe000}, 
-    {0x39500000}, {0x39502000}, {0x39504000}, {0x39506000}, 
-    {0x39508000}, {0x3950a000}, {0x3950c000}, {0x3950e000}, 
-    {0x39510000}, {0x39512000}, {0x39514000}, {0x39516000}, 
-    {0x39518000}, {0x3951a000}, {0x3951c000}, {0x3951e000}, 
-    {0x39520000}, {0x39522000}, {0x39524000}, {0x39526000}, 
-    {0x39528000}, {0x3952a000}, {0x3952c000}, {0x3952e000}, 
-    {0x39530000}, {0x39532000}, {0x39534000}, {0x39536000}, 
-    {0x39538000}, {0x3953a000}, {0x3953c000}, {0x3953e000}, 
-    {0x39540000}, {0x39542000}, {0x39544000}, {0x39546000}, 
-    {0x39548000}, {0x3954a000}, {0x3954c000}, {0x3954e000}, 
-    {0x39550000}, {0x39552000}, {0x39554000}, {0x39556000}, 
-    {0x39558000}, {0x3955a000}, {0x3955c000}, {0x3955e000}, 
-    {0x39560000}, {0x39562000}, {0x39564000}, {0x39566000}, 
-    {0x39568000}, {0x3956a000}, {0x3956c000}, {0x3956e000}, 
-    {0x39570000}, {0x39572000}, {0x39574000}, {0x39576000}, 
-    {0x39578000}, {0x3957a000}, {0x3957c000}, {0x3957e000}, 
-    {0x39580000}, {0x39582000}, {0x39584000}, {0x39586000}, 
-    {0x39588000}, {0x3958a000}, {0x3958c000}, {0x3958e000}, 
-    {0x39590000}, {0x39592000}, {0x39594000}, {0x39596000}, 
-    {0x39598000}, {0x3959a000}, {0x3959c000}, {0x3959e000}, 
-    {0x395a0000}, {0x395a2000}, {0x395a4000}, {0x395a6000}, 
-    {0x395a8000}, {0x395aa000}, {0x395ac000}, {0x395ae000}, 
-    {0x395b0000}, {0x395b2000}, {0x395b4000}, {0x395b6000}, 
-    {0x395b8000}, {0x395ba000}, {0x395bc000}, {0x395be000}, 
-    {0x395c0000}, {0x395c2000}, {0x395c4000}, {0x395c6000}, 
-    {0x395c8000}, {0x395ca000}, {0x395cc000}, {0x395ce000}, 
-    {0x395d0000}, {0x395d2000}, {0x395d4000}, {0x395d6000}, 
-    {0x395d8000}, {0x395da000}, {0x395dc000}, {0x395de000}, 
-    {0x395e0000}, {0x395e2000}, {0x395e4000}, {0x395e6000}, 
-    {0x395e8000}, {0x395ea000}, {0x395ec000}, {0x395ee000}, 
-    {0x395f0000}, {0x395f2000}, {0x395f4000}, {0x395f6000}, 
-    {0x395f8000}, {0x395fa000}, {0x395fc000}, {0x395fe000}, 
-    {0x39600000}, {0x39602000}, {0x39604000}, {0x39606000}, 
-    {0x39608000}, {0x3960a000}, {0x3960c000}, {0x3960e000}, 
-    {0x39610000}, {0x39612000}, {0x39614000}, {0x39616000}, 
-    {0x39618000}, {0x3961a000}, {0x3961c000}, {0x3961e000}, 
-    {0x39620000}, {0x39622000}, {0x39624000}, {0x39626000}, 
-    {0x39628000}, {0x3962a000}, {0x3962c000}, {0x3962e000}, 
-    {0x39630000}, {0x39632000}, {0x39634000}, {0x39636000}, 
-    {0x39638000}, {0x3963a000}, {0x3963c000}, {0x3963e000}, 
-    {0x39640000}, {0x39642000}, {0x39644000}, {0x39646000}, 
-    {0x39648000}, {0x3964a000}, {0x3964c000}, {0x3964e000}, 
-    {0x39650000}, {0x39652000}, {0x39654000}, {0x39656000}, 
-    {0x39658000}, {0x3965a000}, {0x3965c000}, {0x3965e000}, 
-    {0x39660000}, {0x39662000}, {0x39664000}, {0x39666000}, 
-    {0x39668000}, {0x3966a000}, {0x3966c000}, {0x3966e000}, 
-    {0x39670000}, {0x39672000}, {0x39674000}, {0x39676000}, 
-    {0x39678000}, {0x3967a000}, {0x3967c000}, {0x3967e000}, 
-    {0x39680000}, {0x39682000}, {0x39684000}, {0x39686000}, 
-    {0x39688000}, {0x3968a000}, {0x3968c000}, {0x3968e000}, 
-    {0x39690000}, {0x39692000}, {0x39694000}, {0x39696000}, 
-    {0x39698000}, {0x3969a000}, {0x3969c000}, {0x3969e000}, 
-    {0x396a0000}, {0x396a2000}, {0x396a4000}, {0x396a6000}, 
-    {0x396a8000}, {0x396aa000}, {0x396ac000}, {0x396ae000}, 
-    {0x396b0000}, {0x396b2000}, {0x396b4000}, {0x396b6000}, 
-    {0x396b8000}, {0x396ba000}, {0x396bc000}, {0x396be000}, 
-    {0x396c0000}, {0x396c2000}, {0x396c4000}, {0x396c6000}, 
-    {0x396c8000}, {0x396ca000}, {0x396cc000}, {0x396ce000}, 
-    {0x396d0000}, {0x396d2000}, {0x396d4000}, {0x396d6000}, 
-    {0x396d8000}, {0x396da000}, {0x396dc000}, {0x396de000}, 
-    {0x396e0000}, {0x396e2000}, {0x396e4000}, {0x396e6000}, 
-    {0x396e8000}, {0x396ea000}, {0x396ec000}, {0x396ee000}, 
-    {0x396f0000}, {0x396f2000}, {0x396f4000}, {0x396f6000}, 
-    {0x396f8000}, {0x396fa000}, {0x396fc000}, {0x396fe000}, 
-    {0x39700000}, {0x39702000}, {0x39704000}, {0x39706000}, 
-    {0x39708000}, {0x3970a000}, {0x3970c000}, {0x3970e000}, 
-    {0x39710000}, {0x39712000}, {0x39714000}, {0x39716000}, 
-    {0x39718000}, {0x3971a000}, {0x3971c000}, {0x3971e000}, 
-    {0x39720000}, {0x39722000}, {0x39724000}, {0x39726000}, 
-    {0x39728000}, {0x3972a000}, {0x3972c000}, {0x3972e000}, 
-    {0x39730000}, {0x39732000}, {0x39734000}, {0x39736000}, 
-    {0x39738000}, {0x3973a000}, {0x3973c000}, {0x3973e000}, 
-    {0x39740000}, {0x39742000}, {0x39744000}, {0x39746000}, 
-    {0x39748000}, {0x3974a000}, {0x3974c000}, {0x3974e000}, 
-    {0x39750000}, {0x39752000}, {0x39754000}, {0x39756000}, 
-    {0x39758000}, {0x3975a000}, {0x3975c000}, {0x3975e000}, 
-    {0x39760000}, {0x39762000}, {0x39764000}, {0x39766000}, 
-    {0x39768000}, {0x3976a000}, {0x3976c000}, {0x3976e000}, 
-    {0x39770000}, {0x39772000}, {0x39774000}, {0x39776000}, 
-    {0x39778000}, {0x3977a000}, {0x3977c000}, {0x3977e000}, 
-    {0x39780000}, {0x39782000}, {0x39784000}, {0x39786000}, 
-    {0x39788000}, {0x3978a000}, {0x3978c000}, {0x3978e000}, 
-    {0x39790000}, {0x39792000}, {0x39794000}, {0x39796000}, 
-    {0x39798000}, {0x3979a000}, {0x3979c000}, {0x3979e000}, 
-    {0x397a0000}, {0x397a2000}, {0x397a4000}, {0x397a6000}, 
-    {0x397a8000}, {0x397aa000}, {0x397ac000}, {0x397ae000}, 
-    {0x397b0000}, {0x397b2000}, {0x397b4000}, {0x397b6000}, 
-    {0x397b8000}, {0x397ba000}, {0x397bc000}, {0x397be000}, 
-    {0x397c0000}, {0x397c2000}, {0x397c4000}, {0x397c6000}, 
-    {0x397c8000}, {0x397ca000}, {0x397cc000}, {0x397ce000}, 
-    {0x397d0000}, {0x397d2000}, {0x397d4000}, {0x397d6000}, 
-    {0x397d8000}, {0x397da000}, {0x397dc000}, {0x397de000}, 
-    {0x397e0000}, {0x397e2000}, {0x397e4000}, {0x397e6000}, 
-    {0x397e8000}, {0x397ea000}, {0x397ec000}, {0x397ee000}, 
-    {0x397f0000}, {0x397f2000}, {0x397f4000}, {0x397f6000}, 
-    {0x397f8000}, {0x397fa000}, {0x397fc000}, {0x397fe000}, 
-    {0x39800000}, {0x39802000}, {0x39804000}, {0x39806000}, 
-    {0x39808000}, {0x3980a000}, {0x3980c000}, {0x3980e000}, 
-    {0x39810000}, {0x39812000}, {0x39814000}, {0x39816000}, 
-    {0x39818000}, {0x3981a000}, {0x3981c000}, {0x3981e000}, 
-    {0x39820000}, {0x39822000}, {0x39824000}, {0x39826000}, 
-    {0x39828000}, {0x3982a000}, {0x3982c000}, {0x3982e000}, 
-    {0x39830000}, {0x39832000}, {0x39834000}, {0x39836000}, 
-    {0x39838000}, {0x3983a000}, {0x3983c000}, {0x3983e000}, 
-    {0x39840000}, {0x39842000}, {0x39844000}, {0x39846000}, 
-    {0x39848000}, {0x3984a000}, {0x3984c000}, {0x3984e000}, 
-    {0x39850000}, {0x39852000}, {0x39854000}, {0x39856000}, 
-    {0x39858000}, {0x3985a000}, {0x3985c000}, {0x3985e000}, 
-    {0x39860000}, {0x39862000}, {0x39864000}, {0x39866000}, 
-    {0x39868000}, {0x3986a000}, {0x3986c000}, {0x3986e000}, 
-    {0x39870000}, {0x39872000}, {0x39874000}, {0x39876000}, 
-    {0x39878000}, {0x3987a000}, {0x3987c000}, {0x3987e000}, 
-    {0x39880000}, {0x39882000}, {0x39884000}, {0x39886000}, 
-    {0x39888000}, {0x3988a000}, {0x3988c000}, {0x3988e000}, 
-    {0x39890000}, {0x39892000}, {0x39894000}, {0x39896000}, 
-    {0x39898000}, {0x3989a000}, {0x3989c000}, {0x3989e000}, 
-    {0x398a0000}, {0x398a2000}, {0x398a4000}, {0x398a6000}, 
-    {0x398a8000}, {0x398aa000}, {0x398ac000}, {0x398ae000}, 
-    {0x398b0000}, {0x398b2000}, {0x398b4000}, {0x398b6000}, 
-    {0x398b8000}, {0x398ba000}, {0x398bc000}, {0x398be000}, 
-    {0x398c0000}, {0x398c2000}, {0x398c4000}, {0x398c6000}, 
-    {0x398c8000}, {0x398ca000}, {0x398cc000}, {0x398ce000}, 
-    {0x398d0000}, {0x398d2000}, {0x398d4000}, {0x398d6000}, 
-    {0x398d8000}, {0x398da000}, {0x398dc000}, {0x398de000}, 
-    {0x398e0000}, {0x398e2000}, {0x398e4000}, {0x398e6000}, 
-    {0x398e8000}, {0x398ea000}, {0x398ec000}, {0x398ee000}, 
-    {0x398f0000}, {0x398f2000}, {0x398f4000}, {0x398f6000}, 
-    {0x398f8000}, {0x398fa000}, {0x398fc000}, {0x398fe000}, 
-    {0x39900000}, {0x39902000}, {0x39904000}, {0x39906000}, 
-    {0x39908000}, {0x3990a000}, {0x3990c000}, {0x3990e000}, 
-    {0x39910000}, {0x39912000}, {0x39914000}, {0x39916000}, 
-    {0x39918000}, {0x3991a000}, {0x3991c000}, {0x3991e000}, 
-    {0x39920000}, {0x39922000}, {0x39924000}, {0x39926000}, 
-    {0x39928000}, {0x3992a000}, {0x3992c000}, {0x3992e000}, 
-    {0x39930000}, {0x39932000}, {0x39934000}, {0x39936000}, 
-    {0x39938000}, {0x3993a000}, {0x3993c000}, {0x3993e000}, 
-    {0x39940000}, {0x39942000}, {0x39944000}, {0x39946000}, 
-    {0x39948000}, {0x3994a000}, {0x3994c000}, {0x3994e000}, 
-    {0x39950000}, {0x39952000}, {0x39954000}, {0x39956000}, 
-    {0x39958000}, {0x3995a000}, {0x3995c000}, {0x3995e000}, 
-    {0x39960000}, {0x39962000}, {0x39964000}, {0x39966000}, 
-    {0x39968000}, {0x3996a000}, {0x3996c000}, {0x3996e000}, 
-    {0x39970000}, {0x39972000}, {0x39974000}, {0x39976000}, 
-    {0x39978000}, {0x3997a000}, {0x3997c000}, {0x3997e000}, 
-    {0x39980000}, {0x39982000}, {0x39984000}, {0x39986000}, 
-    {0x39988000}, {0x3998a000}, {0x3998c000}, {0x3998e000}, 
-    {0x39990000}, {0x39992000}, {0x39994000}, {0x39996000}, 
-    {0x39998000}, {0x3999a000}, {0x3999c000}, {0x3999e000}, 
-    {0x399a0000}, {0x399a2000}, {0x399a4000}, {0x399a6000}, 
-    {0x399a8000}, {0x399aa000}, {0x399ac000}, {0x399ae000}, 
-    {0x399b0000}, {0x399b2000}, {0x399b4000}, {0x399b6000}, 
-    {0x399b8000}, {0x399ba000}, {0x399bc000}, {0x399be000}, 
-    {0x399c0000}, {0x399c2000}, {0x399c4000}, {0x399c6000}, 
-    {0x399c8000}, {0x399ca000}, {0x399cc000}, {0x399ce000}, 
-    {0x399d0000}, {0x399d2000}, {0x399d4000}, {0x399d6000}, 
-    {0x399d8000}, {0x399da000}, {0x399dc000}, {0x399de000}, 
-    {0x399e0000}, {0x399e2000}, {0x399e4000}, {0x399e6000}, 
-    {0x399e8000}, {0x399ea000}, {0x399ec000}, {0x399ee000}, 
-    {0x399f0000}, {0x399f2000}, {0x399f4000}, {0x399f6000}, 
-    {0x399f8000}, {0x399fa000}, {0x399fc000}, {0x399fe000}, 
-    {0x39a00000}, {0x39a02000}, {0x39a04000}, {0x39a06000}, 
-    {0x39a08000}, {0x39a0a000}, {0x39a0c000}, {0x39a0e000}, 
-    {0x39a10000}, {0x39a12000}, {0x39a14000}, {0x39a16000}, 
-    {0x39a18000}, {0x39a1a000}, {0x39a1c000}, {0x39a1e000}, 
-    {0x39a20000}, {0x39a22000}, {0x39a24000}, {0x39a26000}, 
-    {0x39a28000}, {0x39a2a000}, {0x39a2c000}, {0x39a2e000}, 
-    {0x39a30000}, {0x39a32000}, {0x39a34000}, {0x39a36000}, 
-    {0x39a38000}, {0x39a3a000}, {0x39a3c000}, {0x39a3e000}, 
-    {0x39a40000}, {0x39a42000}, {0x39a44000}, {0x39a46000}, 
-    {0x39a48000}, {0x39a4a000}, {0x39a4c000}, {0x39a4e000}, 
-    {0x39a50000}, {0x39a52000}, {0x39a54000}, {0x39a56000}, 
-    {0x39a58000}, {0x39a5a000}, {0x39a5c000}, {0x39a5e000}, 
-    {0x39a60000}, {0x39a62000}, {0x39a64000}, {0x39a66000}, 
-    {0x39a68000}, {0x39a6a000}, {0x39a6c000}, {0x39a6e000}, 
-    {0x39a70000}, {0x39a72000}, {0x39a74000}, {0x39a76000}, 
-    {0x39a78000}, {0x39a7a000}, {0x39a7c000}, {0x39a7e000}, 
-    {0x39a80000}, {0x39a82000}, {0x39a84000}, {0x39a86000}, 
-    {0x39a88000}, {0x39a8a000}, {0x39a8c000}, {0x39a8e000}, 
-    {0x39a90000}, {0x39a92000}, {0x39a94000}, {0x39a96000}, 
-    {0x39a98000}, {0x39a9a000}, {0x39a9c000}, {0x39a9e000}, 
-    {0x39aa0000}, {0x39aa2000}, {0x39aa4000}, {0x39aa6000}, 
-    {0x39aa8000}, {0x39aaa000}, {0x39aac000}, {0x39aae000}, 
-    {0x39ab0000}, {0x39ab2000}, {0x39ab4000}, {0x39ab6000}, 
-    {0x39ab8000}, {0x39aba000}, {0x39abc000}, {0x39abe000}, 
-    {0x39ac0000}, {0x39ac2000}, {0x39ac4000}, {0x39ac6000}, 
-    {0x39ac8000}, {0x39aca000}, {0x39acc000}, {0x39ace000}, 
-    {0x39ad0000}, {0x39ad2000}, {0x39ad4000}, {0x39ad6000}, 
-    {0x39ad8000}, {0x39ada000}, {0x39adc000}, {0x39ade000}, 
-    {0x39ae0000}, {0x39ae2000}, {0x39ae4000}, {0x39ae6000}, 
-    {0x39ae8000}, {0x39aea000}, {0x39aec000}, {0x39aee000}, 
-    {0x39af0000}, {0x39af2000}, {0x39af4000}, {0x39af6000}, 
-    {0x39af8000}, {0x39afa000}, {0x39afc000}, {0x39afe000}, 
-    {0x39b00000}, {0x39b02000}, {0x39b04000}, {0x39b06000}, 
-    {0x39b08000}, {0x39b0a000}, {0x39b0c000}, {0x39b0e000}, 
-    {0x39b10000}, {0x39b12000}, {0x39b14000}, {0x39b16000}, 
-    {0x39b18000}, {0x39b1a000}, {0x39b1c000}, {0x39b1e000}, 
-    {0x39b20000}, {0x39b22000}, {0x39b24000}, {0x39b26000}, 
-    {0x39b28000}, {0x39b2a000}, {0x39b2c000}, {0x39b2e000}, 
-    {0x39b30000}, {0x39b32000}, {0x39b34000}, {0x39b36000}, 
-    {0x39b38000}, {0x39b3a000}, {0x39b3c000}, {0x39b3e000}, 
-    {0x39b40000}, {0x39b42000}, {0x39b44000}, {0x39b46000}, 
-    {0x39b48000}, {0x39b4a000}, {0x39b4c000}, {0x39b4e000}, 
-    {0x39b50000}, {0x39b52000}, {0x39b54000}, {0x39b56000}, 
-    {0x39b58000}, {0x39b5a000}, {0x39b5c000}, {0x39b5e000}, 
-    {0x39b60000}, {0x39b62000}, {0x39b64000}, {0x39b66000}, 
-    {0x39b68000}, {0x39b6a000}, {0x39b6c000}, {0x39b6e000}, 
-    {0x39b70000}, {0x39b72000}, {0x39b74000}, {0x39b76000}, 
-    {0x39b78000}, {0x39b7a000}, {0x39b7c000}, {0x39b7e000}, 
-    {0x39b80000}, {0x39b82000}, {0x39b84000}, {0x39b86000}, 
-    {0x39b88000}, {0x39b8a000}, {0x39b8c000}, {0x39b8e000}, 
-    {0x39b90000}, {0x39b92000}, {0x39b94000}, {0x39b96000}, 
-    {0x39b98000}, {0x39b9a000}, {0x39b9c000}, {0x39b9e000}, 
-    {0x39ba0000}, {0x39ba2000}, {0x39ba4000}, {0x39ba6000}, 
-    {0x39ba8000}, {0x39baa000}, {0x39bac000}, {0x39bae000}, 
-    {0x39bb0000}, {0x39bb2000}, {0x39bb4000}, {0x39bb6000}, 
-    {0x39bb8000}, {0x39bba000}, {0x39bbc000}, {0x39bbe000}, 
-    {0x39bc0000}, {0x39bc2000}, {0x39bc4000}, {0x39bc6000}, 
-    {0x39bc8000}, {0x39bca000}, {0x39bcc000}, {0x39bce000}, 
-    {0x39bd0000}, {0x39bd2000}, {0x39bd4000}, {0x39bd6000}, 
-    {0x39bd8000}, {0x39bda000}, {0x39bdc000}, {0x39bde000}, 
-    {0x39be0000}, {0x39be2000}, {0x39be4000}, {0x39be6000}, 
-    {0x39be8000}, {0x39bea000}, {0x39bec000}, {0x39bee000}, 
-    {0x39bf0000}, {0x39bf2000}, {0x39bf4000}, {0x39bf6000}, 
-    {0x39bf8000}, {0x39bfa000}, {0x39bfc000}, {0x39bfe000}, 
-    {0x39c00000}, {0x39c02000}, {0x39c04000}, {0x39c06000}, 
-    {0x39c08000}, {0x39c0a000}, {0x39c0c000}, {0x39c0e000}, 
-    {0x39c10000}, {0x39c12000}, {0x39c14000}, {0x39c16000}, 
-    {0x39c18000}, {0x39c1a000}, {0x39c1c000}, {0x39c1e000}, 
-    {0x39c20000}, {0x39c22000}, {0x39c24000}, {0x39c26000}, 
-    {0x39c28000}, {0x39c2a000}, {0x39c2c000}, {0x39c2e000}, 
-    {0x39c30000}, {0x39c32000}, {0x39c34000}, {0x39c36000}, 
-    {0x39c38000}, {0x39c3a000}, {0x39c3c000}, {0x39c3e000}, 
-    {0x39c40000}, {0x39c42000}, {0x39c44000}, {0x39c46000}, 
-    {0x39c48000}, {0x39c4a000}, {0x39c4c000}, {0x39c4e000}, 
-    {0x39c50000}, {0x39c52000}, {0x39c54000}, {0x39c56000}, 
-    {0x39c58000}, {0x39c5a000}, {0x39c5c000}, {0x39c5e000}, 
-    {0x39c60000}, {0x39c62000}, {0x39c64000}, {0x39c66000}, 
-    {0x39c68000}, {0x39c6a000}, {0x39c6c000}, {0x39c6e000}, 
-    {0x39c70000}, {0x39c72000}, {0x39c74000}, {0x39c76000}, 
-    {0x39c78000}, {0x39c7a000}, {0x39c7c000}, {0x39c7e000}, 
-    {0x39c80000}, {0x39c82000}, {0x39c84000}, {0x39c86000}, 
-    {0x39c88000}, {0x39c8a000}, {0x39c8c000}, {0x39c8e000}, 
-    {0x39c90000}, {0x39c92000}, {0x39c94000}, {0x39c96000}, 
-    {0x39c98000}, {0x39c9a000}, {0x39c9c000}, {0x39c9e000}, 
-    {0x39ca0000}, {0x39ca2000}, {0x39ca4000}, {0x39ca6000}, 
-    {0x39ca8000}, {0x39caa000}, {0x39cac000}, {0x39cae000}, 
-    {0x39cb0000}, {0x39cb2000}, {0x39cb4000}, {0x39cb6000}, 
-    {0x39cb8000}, {0x39cba000}, {0x39cbc000}, {0x39cbe000}, 
-    {0x39cc0000}, {0x39cc2000}, {0x39cc4000}, {0x39cc6000}, 
-    {0x39cc8000}, {0x39cca000}, {0x39ccc000}, {0x39cce000}, 
-    {0x39cd0000}, {0x39cd2000}, {0x39cd4000}, {0x39cd6000}, 
-    {0x39cd8000}, {0x39cda000}, {0x39cdc000}, {0x39cde000}, 
-    {0x39ce0000}, {0x39ce2000}, {0x39ce4000}, {0x39ce6000}, 
-    {0x39ce8000}, {0x39cea000}, {0x39cec000}, {0x39cee000}, 
-    {0x39cf0000}, {0x39cf2000}, {0x39cf4000}, {0x39cf6000}, 
-    {0x39cf8000}, {0x39cfa000}, {0x39cfc000}, {0x39cfe000}, 
-    {0x39d00000}, {0x39d02000}, {0x39d04000}, {0x39d06000}, 
-    {0x39d08000}, {0x39d0a000}, {0x39d0c000}, {0x39d0e000}, 
-    {0x39d10000}, {0x39d12000}, {0x39d14000}, {0x39d16000}, 
-    {0x39d18000}, {0x39d1a000}, {0x39d1c000}, {0x39d1e000}, 
-    {0x39d20000}, {0x39d22000}, {0x39d24000}, {0x39d26000}, 
-    {0x39d28000}, {0x39d2a000}, {0x39d2c000}, {0x39d2e000}, 
-    {0x39d30000}, {0x39d32000}, {0x39d34000}, {0x39d36000}, 
-    {0x39d38000}, {0x39d3a000}, {0x39d3c000}, {0x39d3e000}, 
-    {0x39d40000}, {0x39d42000}, {0x39d44000}, {0x39d46000}, 
-    {0x39d48000}, {0x39d4a000}, {0x39d4c000}, {0x39d4e000}, 
-    {0x39d50000}, {0x39d52000}, {0x39d54000}, {0x39d56000}, 
-    {0x39d58000}, {0x39d5a000}, {0x39d5c000}, {0x39d5e000}, 
-    {0x39d60000}, {0x39d62000}, {0x39d64000}, {0x39d66000}, 
-    {0x39d68000}, {0x39d6a000}, {0x39d6c000}, {0x39d6e000}, 
-    {0x39d70000}, {0x39d72000}, {0x39d74000}, {0x39d76000}, 
-    {0x39d78000}, {0x39d7a000}, {0x39d7c000}, {0x39d7e000}, 
-    {0x39d80000}, {0x39d82000}, {0x39d84000}, {0x39d86000}, 
-    {0x39d88000}, {0x39d8a000}, {0x39d8c000}, {0x39d8e000}, 
-    {0x39d90000}, {0x39d92000}, {0x39d94000}, {0x39d96000}, 
-    {0x39d98000}, {0x39d9a000}, {0x39d9c000}, {0x39d9e000}, 
-    {0x39da0000}, {0x39da2000}, {0x39da4000}, {0x39da6000}, 
-    {0x39da8000}, {0x39daa000}, {0x39dac000}, {0x39dae000}, 
-    {0x39db0000}, {0x39db2000}, {0x39db4000}, {0x39db6000}, 
-    {0x39db8000}, {0x39dba000}, {0x39dbc000}, {0x39dbe000}, 
-    {0x39dc0000}, {0x39dc2000}, {0x39dc4000}, {0x39dc6000}, 
-    {0x39dc8000}, {0x39dca000}, {0x39dcc000}, {0x39dce000}, 
-    {0x39dd0000}, {0x39dd2000}, {0x39dd4000}, {0x39dd6000}, 
-    {0x39dd8000}, {0x39dda000}, {0x39ddc000}, {0x39dde000}, 
-    {0x39de0000}, {0x39de2000}, {0x39de4000}, {0x39de6000}, 
-    {0x39de8000}, {0x39dea000}, {0x39dec000}, {0x39dee000}, 
-    {0x39df0000}, {0x39df2000}, {0x39df4000}, {0x39df6000}, 
-    {0x39df8000}, {0x39dfa000}, {0x39dfc000}, {0x39dfe000}, 
-    {0x39e00000}, {0x39e02000}, {0x39e04000}, {0x39e06000}, 
-    {0x39e08000}, {0x39e0a000}, {0x39e0c000}, {0x39e0e000}, 
-    {0x39e10000}, {0x39e12000}, {0x39e14000}, {0x39e16000}, 
-    {0x39e18000}, {0x39e1a000}, {0x39e1c000}, {0x39e1e000}, 
-    {0x39e20000}, {0x39e22000}, {0x39e24000}, {0x39e26000}, 
-    {0x39e28000}, {0x39e2a000}, {0x39e2c000}, {0x39e2e000}, 
-    {0x39e30000}, {0x39e32000}, {0x39e34000}, {0x39e36000}, 
-    {0x39e38000}, {0x39e3a000}, {0x39e3c000}, {0x39e3e000}, 
-    {0x39e40000}, {0x39e42000}, {0x39e44000}, {0x39e46000}, 
-    {0x39e48000}, {0x39e4a000}, {0x39e4c000}, {0x39e4e000}, 
-    {0x39e50000}, {0x39e52000}, {0x39e54000}, {0x39e56000}, 
-    {0x39e58000}, {0x39e5a000}, {0x39e5c000}, {0x39e5e000}, 
-    {0x39e60000}, {0x39e62000}, {0x39e64000}, {0x39e66000}, 
-    {0x39e68000}, {0x39e6a000}, {0x39e6c000}, {0x39e6e000}, 
-    {0x39e70000}, {0x39e72000}, {0x39e74000}, {0x39e76000}, 
-    {0x39e78000}, {0x39e7a000}, {0x39e7c000}, {0x39e7e000}, 
-    {0x39e80000}, {0x39e82000}, {0x39e84000}, {0x39e86000}, 
-    {0x39e88000}, {0x39e8a000}, {0x39e8c000}, {0x39e8e000}, 
-    {0x39e90000}, {0x39e92000}, {0x39e94000}, {0x39e96000}, 
-    {0x39e98000}, {0x39e9a000}, {0x39e9c000}, {0x39e9e000}, 
-    {0x39ea0000}, {0x39ea2000}, {0x39ea4000}, {0x39ea6000}, 
-    {0x39ea8000}, {0x39eaa000}, {0x39eac000}, {0x39eae000}, 
-    {0x39eb0000}, {0x39eb2000}, {0x39eb4000}, {0x39eb6000}, 
-    {0x39eb8000}, {0x39eba000}, {0x39ebc000}, {0x39ebe000}, 
-    {0x39ec0000}, {0x39ec2000}, {0x39ec4000}, {0x39ec6000}, 
-    {0x39ec8000}, {0x39eca000}, {0x39ecc000}, {0x39ece000}, 
-    {0x39ed0000}, {0x39ed2000}, {0x39ed4000}, {0x39ed6000}, 
-    {0x39ed8000}, {0x39eda000}, {0x39edc000}, {0x39ede000}, 
-    {0x39ee0000}, {0x39ee2000}, {0x39ee4000}, {0x39ee6000}, 
-    {0x39ee8000}, {0x39eea000}, {0x39eec000}, {0x39eee000}, 
-    {0x39ef0000}, {0x39ef2000}, {0x39ef4000}, {0x39ef6000}, 
-    {0x39ef8000}, {0x39efa000}, {0x39efc000}, {0x39efe000}, 
-    {0x39f00000}, {0x39f02000}, {0x39f04000}, {0x39f06000}, 
-    {0x39f08000}, {0x39f0a000}, {0x39f0c000}, {0x39f0e000}, 
-    {0x39f10000}, {0x39f12000}, {0x39f14000}, {0x39f16000}, 
-    {0x39f18000}, {0x39f1a000}, {0x39f1c000}, {0x39f1e000}, 
-    {0x39f20000}, {0x39f22000}, {0x39f24000}, {0x39f26000}, 
-    {0x39f28000}, {0x39f2a000}, {0x39f2c000}, {0x39f2e000}, 
-    {0x39f30000}, {0x39f32000}, {0x39f34000}, {0x39f36000}, 
-    {0x39f38000}, {0x39f3a000}, {0x39f3c000}, {0x39f3e000}, 
-    {0x39f40000}, {0x39f42000}, {0x39f44000}, {0x39f46000}, 
-    {0x39f48000}, {0x39f4a000}, {0x39f4c000}, {0x39f4e000}, 
-    {0x39f50000}, {0x39f52000}, {0x39f54000}, {0x39f56000}, 
-    {0x39f58000}, {0x39f5a000}, {0x39f5c000}, {0x39f5e000}, 
-    {0x39f60000}, {0x39f62000}, {0x39f64000}, {0x39f66000}, 
-    {0x39f68000}, {0x39f6a000}, {0x39f6c000}, {0x39f6e000}, 
-    {0x39f70000}, {0x39f72000}, {0x39f74000}, {0x39f76000}, 
-    {0x39f78000}, {0x39f7a000}, {0x39f7c000}, {0x39f7e000}, 
-    {0x39f80000}, {0x39f82000}, {0x39f84000}, {0x39f86000}, 
-    {0x39f88000}, {0x39f8a000}, {0x39f8c000}, {0x39f8e000}, 
-    {0x39f90000}, {0x39f92000}, {0x39f94000}, {0x39f96000}, 
-    {0x39f98000}, {0x39f9a000}, {0x39f9c000}, {0x39f9e000}, 
-    {0x39fa0000}, {0x39fa2000}, {0x39fa4000}, {0x39fa6000}, 
-    {0x39fa8000}, {0x39faa000}, {0x39fac000}, {0x39fae000}, 
-    {0x39fb0000}, {0x39fb2000}, {0x39fb4000}, {0x39fb6000}, 
-    {0x39fb8000}, {0x39fba000}, {0x39fbc000}, {0x39fbe000}, 
-    {0x39fc0000}, {0x39fc2000}, {0x39fc4000}, {0x39fc6000}, 
-    {0x39fc8000}, {0x39fca000}, {0x39fcc000}, {0x39fce000}, 
-    {0x39fd0000}, {0x39fd2000}, {0x39fd4000}, {0x39fd6000}, 
-    {0x39fd8000}, {0x39fda000}, {0x39fdc000}, {0x39fde000}, 
-    {0x39fe0000}, {0x39fe2000}, {0x39fe4000}, {0x39fe6000}, 
-    {0x39fe8000}, {0x39fea000}, {0x39fec000}, {0x39fee000}, 
-    {0x39ff0000}, {0x39ff2000}, {0x39ff4000}, {0x39ff6000}, 
-    {0x39ff8000}, {0x39ffa000}, {0x39ffc000}, {0x39ffe000}, 
-    {0x3a000000}, {0x3a002000}, {0x3a004000}, {0x3a006000}, 
-    {0x3a008000}, {0x3a00a000}, {0x3a00c000}, {0x3a00e000}, 
-    {0x3a010000}, {0x3a012000}, {0x3a014000}, {0x3a016000}, 
-    {0x3a018000}, {0x3a01a000}, {0x3a01c000}, {0x3a01e000}, 
-    {0x3a020000}, {0x3a022000}, {0x3a024000}, {0x3a026000}, 
-    {0x3a028000}, {0x3a02a000}, {0x3a02c000}, {0x3a02e000}, 
-    {0x3a030000}, {0x3a032000}, {0x3a034000}, {0x3a036000}, 
-    {0x3a038000}, {0x3a03a000}, {0x3a03c000}, {0x3a03e000}, 
-    {0x3a040000}, {0x3a042000}, {0x3a044000}, {0x3a046000}, 
-    {0x3a048000}, {0x3a04a000}, {0x3a04c000}, {0x3a04e000}, 
-    {0x3a050000}, {0x3a052000}, {0x3a054000}, {0x3a056000}, 
-    {0x3a058000}, {0x3a05a000}, {0x3a05c000}, {0x3a05e000}, 
-    {0x3a060000}, {0x3a062000}, {0x3a064000}, {0x3a066000}, 
-    {0x3a068000}, {0x3a06a000}, {0x3a06c000}, {0x3a06e000}, 
-    {0x3a070000}, {0x3a072000}, {0x3a074000}, {0x3a076000}, 
-    {0x3a078000}, {0x3a07a000}, {0x3a07c000}, {0x3a07e000}, 
-    {0x3a080000}, {0x3a082000}, {0x3a084000}, {0x3a086000}, 
-    {0x3a088000}, {0x3a08a000}, {0x3a08c000}, {0x3a08e000}, 
-    {0x3a090000}, {0x3a092000}, {0x3a094000}, {0x3a096000}, 
-    {0x3a098000}, {0x3a09a000}, {0x3a09c000}, {0x3a09e000}, 
-    {0x3a0a0000}, {0x3a0a2000}, {0x3a0a4000}, {0x3a0a6000}, 
-    {0x3a0a8000}, {0x3a0aa000}, {0x3a0ac000}, {0x3a0ae000}, 
-    {0x3a0b0000}, {0x3a0b2000}, {0x3a0b4000}, {0x3a0b6000}, 
-    {0x3a0b8000}, {0x3a0ba000}, {0x3a0bc000}, {0x3a0be000}, 
-    {0x3a0c0000}, {0x3a0c2000}, {0x3a0c4000}, {0x3a0c6000}, 
-    {0x3a0c8000}, {0x3a0ca000}, {0x3a0cc000}, {0x3a0ce000}, 
-    {0x3a0d0000}, {0x3a0d2000}, {0x3a0d4000}, {0x3a0d6000}, 
-    {0x3a0d8000}, {0x3a0da000}, {0x3a0dc000}, {0x3a0de000}, 
-    {0x3a0e0000}, {0x3a0e2000}, {0x3a0e4000}, {0x3a0e6000}, 
-    {0x3a0e8000}, {0x3a0ea000}, {0x3a0ec000}, {0x3a0ee000}, 
-    {0x3a0f0000}, {0x3a0f2000}, {0x3a0f4000}, {0x3a0f6000}, 
-    {0x3a0f8000}, {0x3a0fa000}, {0x3a0fc000}, {0x3a0fe000}, 
-    {0x3a100000}, {0x3a102000}, {0x3a104000}, {0x3a106000}, 
-    {0x3a108000}, {0x3a10a000}, {0x3a10c000}, {0x3a10e000}, 
-    {0x3a110000}, {0x3a112000}, {0x3a114000}, {0x3a116000}, 
-    {0x3a118000}, {0x3a11a000}, {0x3a11c000}, {0x3a11e000}, 
-    {0x3a120000}, {0x3a122000}, {0x3a124000}, {0x3a126000}, 
-    {0x3a128000}, {0x3a12a000}, {0x3a12c000}, {0x3a12e000}, 
-    {0x3a130000}, {0x3a132000}, {0x3a134000}, {0x3a136000}, 
-    {0x3a138000}, {0x3a13a000}, {0x3a13c000}, {0x3a13e000}, 
-    {0x3a140000}, {0x3a142000}, {0x3a144000}, {0x3a146000}, 
-    {0x3a148000}, {0x3a14a000}, {0x3a14c000}, {0x3a14e000}, 
-    {0x3a150000}, {0x3a152000}, {0x3a154000}, {0x3a156000}, 
-    {0x3a158000}, {0x3a15a000}, {0x3a15c000}, {0x3a15e000}, 
-    {0x3a160000}, {0x3a162000}, {0x3a164000}, {0x3a166000}, 
-    {0x3a168000}, {0x3a16a000}, {0x3a16c000}, {0x3a16e000}, 
-    {0x3a170000}, {0x3a172000}, {0x3a174000}, {0x3a176000}, 
-    {0x3a178000}, {0x3a17a000}, {0x3a17c000}, {0x3a17e000}, 
-    {0x3a180000}, {0x3a182000}, {0x3a184000}, {0x3a186000}, 
-    {0x3a188000}, {0x3a18a000}, {0x3a18c000}, {0x3a18e000}, 
-    {0x3a190000}, {0x3a192000}, {0x3a194000}, {0x3a196000}, 
-    {0x3a198000}, {0x3a19a000}, {0x3a19c000}, {0x3a19e000}, 
-    {0x3a1a0000}, {0x3a1a2000}, {0x3a1a4000}, {0x3a1a6000}, 
-    {0x3a1a8000}, {0x3a1aa000}, {0x3a1ac000}, {0x3a1ae000}, 
-    {0x3a1b0000}, {0x3a1b2000}, {0x3a1b4000}, {0x3a1b6000}, 
-    {0x3a1b8000}, {0x3a1ba000}, {0x3a1bc000}, {0x3a1be000}, 
-    {0x3a1c0000}, {0x3a1c2000}, {0x3a1c4000}, {0x3a1c6000}, 
-    {0x3a1c8000}, {0x3a1ca000}, {0x3a1cc000}, {0x3a1ce000}, 
-    {0x3a1d0000}, {0x3a1d2000}, {0x3a1d4000}, {0x3a1d6000}, 
-    {0x3a1d8000}, {0x3a1da000}, {0x3a1dc000}, {0x3a1de000}, 
-    {0x3a1e0000}, {0x3a1e2000}, {0x3a1e4000}, {0x3a1e6000}, 
-    {0x3a1e8000}, {0x3a1ea000}, {0x3a1ec000}, {0x3a1ee000}, 
-    {0x3a1f0000}, {0x3a1f2000}, {0x3a1f4000}, {0x3a1f6000}, 
-    {0x3a1f8000}, {0x3a1fa000}, {0x3a1fc000}, {0x3a1fe000}, 
-    {0x3a200000}, {0x3a202000}, {0x3a204000}, {0x3a206000}, 
-    {0x3a208000}, {0x3a20a000}, {0x3a20c000}, {0x3a20e000}, 
-    {0x3a210000}, {0x3a212000}, {0x3a214000}, {0x3a216000}, 
-    {0x3a218000}, {0x3a21a000}, {0x3a21c000}, {0x3a21e000}, 
-    {0x3a220000}, {0x3a222000}, {0x3a224000}, {0x3a226000}, 
-    {0x3a228000}, {0x3a22a000}, {0x3a22c000}, {0x3a22e000}, 
-    {0x3a230000}, {0x3a232000}, {0x3a234000}, {0x3a236000}, 
-    {0x3a238000}, {0x3a23a000}, {0x3a23c000}, {0x3a23e000}, 
-    {0x3a240000}, {0x3a242000}, {0x3a244000}, {0x3a246000}, 
-    {0x3a248000}, {0x3a24a000}, {0x3a24c000}, {0x3a24e000}, 
-    {0x3a250000}, {0x3a252000}, {0x3a254000}, {0x3a256000}, 
-    {0x3a258000}, {0x3a25a000}, {0x3a25c000}, {0x3a25e000}, 
-    {0x3a260000}, {0x3a262000}, {0x3a264000}, {0x3a266000}, 
-    {0x3a268000}, {0x3a26a000}, {0x3a26c000}, {0x3a26e000}, 
-    {0x3a270000}, {0x3a272000}, {0x3a274000}, {0x3a276000}, 
-    {0x3a278000}, {0x3a27a000}, {0x3a27c000}, {0x3a27e000}, 
-    {0x3a280000}, {0x3a282000}, {0x3a284000}, {0x3a286000}, 
-    {0x3a288000}, {0x3a28a000}, {0x3a28c000}, {0x3a28e000}, 
-    {0x3a290000}, {0x3a292000}, {0x3a294000}, {0x3a296000}, 
-    {0x3a298000}, {0x3a29a000}, {0x3a29c000}, {0x3a29e000}, 
-    {0x3a2a0000}, {0x3a2a2000}, {0x3a2a4000}, {0x3a2a6000}, 
-    {0x3a2a8000}, {0x3a2aa000}, {0x3a2ac000}, {0x3a2ae000}, 
-    {0x3a2b0000}, {0x3a2b2000}, {0x3a2b4000}, {0x3a2b6000}, 
-    {0x3a2b8000}, {0x3a2ba000}, {0x3a2bc000}, {0x3a2be000}, 
-    {0x3a2c0000}, {0x3a2c2000}, {0x3a2c4000}, {0x3a2c6000}, 
-    {0x3a2c8000}, {0x3a2ca000}, {0x3a2cc000}, {0x3a2ce000}, 
-    {0x3a2d0000}, {0x3a2d2000}, {0x3a2d4000}, {0x3a2d6000}, 
-    {0x3a2d8000}, {0x3a2da000}, {0x3a2dc000}, {0x3a2de000}, 
-    {0x3a2e0000}, {0x3a2e2000}, {0x3a2e4000}, {0x3a2e6000}, 
-    {0x3a2e8000}, {0x3a2ea000}, {0x3a2ec000}, {0x3a2ee000}, 
-    {0x3a2f0000}, {0x3a2f2000}, {0x3a2f4000}, {0x3a2f6000}, 
-    {0x3a2f8000}, {0x3a2fa000}, {0x3a2fc000}, {0x3a2fe000}, 
-    {0x3a300000}, {0x3a302000}, {0x3a304000}, {0x3a306000}, 
-    {0x3a308000}, {0x3a30a000}, {0x3a30c000}, {0x3a30e000}, 
-    {0x3a310000}, {0x3a312000}, {0x3a314000}, {0x3a316000}, 
-    {0x3a318000}, {0x3a31a000}, {0x3a31c000}, {0x3a31e000}, 
-    {0x3a320000}, {0x3a322000}, {0x3a324000}, {0x3a326000}, 
-    {0x3a328000}, {0x3a32a000}, {0x3a32c000}, {0x3a32e000}, 
-    {0x3a330000}, {0x3a332000}, {0x3a334000}, {0x3a336000}, 
-    {0x3a338000}, {0x3a33a000}, {0x3a33c000}, {0x3a33e000}, 
-    {0x3a340000}, {0x3a342000}, {0x3a344000}, {0x3a346000}, 
-    {0x3a348000}, {0x3a34a000}, {0x3a34c000}, {0x3a34e000}, 
-    {0x3a350000}, {0x3a352000}, {0x3a354000}, {0x3a356000}, 
-    {0x3a358000}, {0x3a35a000}, {0x3a35c000}, {0x3a35e000}, 
-    {0x3a360000}, {0x3a362000}, {0x3a364000}, {0x3a366000}, 
-    {0x3a368000}, {0x3a36a000}, {0x3a36c000}, {0x3a36e000}, 
-    {0x3a370000}, {0x3a372000}, {0x3a374000}, {0x3a376000}, 
-    {0x3a378000}, {0x3a37a000}, {0x3a37c000}, {0x3a37e000}, 
-    {0x3a380000}, {0x3a382000}, {0x3a384000}, {0x3a386000}, 
-    {0x3a388000}, {0x3a38a000}, {0x3a38c000}, {0x3a38e000}, 
-    {0x3a390000}, {0x3a392000}, {0x3a394000}, {0x3a396000}, 
-    {0x3a398000}, {0x3a39a000}, {0x3a39c000}, {0x3a39e000}, 
-    {0x3a3a0000}, {0x3a3a2000}, {0x3a3a4000}, {0x3a3a6000}, 
-    {0x3a3a8000}, {0x3a3aa000}, {0x3a3ac000}, {0x3a3ae000}, 
-    {0x3a3b0000}, {0x3a3b2000}, {0x3a3b4000}, {0x3a3b6000}, 
-    {0x3a3b8000}, {0x3a3ba000}, {0x3a3bc000}, {0x3a3be000}, 
-    {0x3a3c0000}, {0x3a3c2000}, {0x3a3c4000}, {0x3a3c6000}, 
-    {0x3a3c8000}, {0x3a3ca000}, {0x3a3cc000}, {0x3a3ce000}, 
-    {0x3a3d0000}, {0x3a3d2000}, {0x3a3d4000}, {0x3a3d6000}, 
-    {0x3a3d8000}, {0x3a3da000}, {0x3a3dc000}, {0x3a3de000}, 
-    {0x3a3e0000}, {0x3a3e2000}, {0x3a3e4000}, {0x3a3e6000}, 
-    {0x3a3e8000}, {0x3a3ea000}, {0x3a3ec000}, {0x3a3ee000}, 
-    {0x3a3f0000}, {0x3a3f2000}, {0x3a3f4000}, {0x3a3f6000}, 
-    {0x3a3f8000}, {0x3a3fa000}, {0x3a3fc000}, {0x3a3fe000}, 
-    {0x3a400000}, {0x3a402000}, {0x3a404000}, {0x3a406000}, 
-    {0x3a408000}, {0x3a40a000}, {0x3a40c000}, {0x3a40e000}, 
-    {0x3a410000}, {0x3a412000}, {0x3a414000}, {0x3a416000}, 
-    {0x3a418000}, {0x3a41a000}, {0x3a41c000}, {0x3a41e000}, 
-    {0x3a420000}, {0x3a422000}, {0x3a424000}, {0x3a426000}, 
-    {0x3a428000}, {0x3a42a000}, {0x3a42c000}, {0x3a42e000}, 
-    {0x3a430000}, {0x3a432000}, {0x3a434000}, {0x3a436000}, 
-    {0x3a438000}, {0x3a43a000}, {0x3a43c000}, {0x3a43e000}, 
-    {0x3a440000}, {0x3a442000}, {0x3a444000}, {0x3a446000}, 
-    {0x3a448000}, {0x3a44a000}, {0x3a44c000}, {0x3a44e000}, 
-    {0x3a450000}, {0x3a452000}, {0x3a454000}, {0x3a456000}, 
-    {0x3a458000}, {0x3a45a000}, {0x3a45c000}, {0x3a45e000}, 
-    {0x3a460000}, {0x3a462000}, {0x3a464000}, {0x3a466000}, 
-    {0x3a468000}, {0x3a46a000}, {0x3a46c000}, {0x3a46e000}, 
-    {0x3a470000}, {0x3a472000}, {0x3a474000}, {0x3a476000}, 
-    {0x3a478000}, {0x3a47a000}, {0x3a47c000}, {0x3a47e000}, 
-    {0x3a480000}, {0x3a482000}, {0x3a484000}, {0x3a486000}, 
-    {0x3a488000}, {0x3a48a000}, {0x3a48c000}, {0x3a48e000}, 
-    {0x3a490000}, {0x3a492000}, {0x3a494000}, {0x3a496000}, 
-    {0x3a498000}, {0x3a49a000}, {0x3a49c000}, {0x3a49e000}, 
-    {0x3a4a0000}, {0x3a4a2000}, {0x3a4a4000}, {0x3a4a6000}, 
-    {0x3a4a8000}, {0x3a4aa000}, {0x3a4ac000}, {0x3a4ae000}, 
-    {0x3a4b0000}, {0x3a4b2000}, {0x3a4b4000}, {0x3a4b6000}, 
-    {0x3a4b8000}, {0x3a4ba000}, {0x3a4bc000}, {0x3a4be000}, 
-    {0x3a4c0000}, {0x3a4c2000}, {0x3a4c4000}, {0x3a4c6000}, 
-    {0x3a4c8000}, {0x3a4ca000}, {0x3a4cc000}, {0x3a4ce000}, 
-    {0x3a4d0000}, {0x3a4d2000}, {0x3a4d4000}, {0x3a4d6000}, 
-    {0x3a4d8000}, {0x3a4da000}, {0x3a4dc000}, {0x3a4de000}, 
-    {0x3a4e0000}, {0x3a4e2000}, {0x3a4e4000}, {0x3a4e6000}, 
-    {0x3a4e8000}, {0x3a4ea000}, {0x3a4ec000}, {0x3a4ee000}, 
-    {0x3a4f0000}, {0x3a4f2000}, {0x3a4f4000}, {0x3a4f6000}, 
-    {0x3a4f8000}, {0x3a4fa000}, {0x3a4fc000}, {0x3a4fe000}, 
-    {0x3a500000}, {0x3a502000}, {0x3a504000}, {0x3a506000}, 
-    {0x3a508000}, {0x3a50a000}, {0x3a50c000}, {0x3a50e000}, 
-    {0x3a510000}, {0x3a512000}, {0x3a514000}, {0x3a516000}, 
-    {0x3a518000}, {0x3a51a000}, {0x3a51c000}, {0x3a51e000}, 
-    {0x3a520000}, {0x3a522000}, {0x3a524000}, {0x3a526000}, 
-    {0x3a528000}, {0x3a52a000}, {0x3a52c000}, {0x3a52e000}, 
-    {0x3a530000}, {0x3a532000}, {0x3a534000}, {0x3a536000}, 
-    {0x3a538000}, {0x3a53a000}, {0x3a53c000}, {0x3a53e000}, 
-    {0x3a540000}, {0x3a542000}, {0x3a544000}, {0x3a546000}, 
-    {0x3a548000}, {0x3a54a000}, {0x3a54c000}, {0x3a54e000}, 
-    {0x3a550000}, {0x3a552000}, {0x3a554000}, {0x3a556000}, 
-    {0x3a558000}, {0x3a55a000}, {0x3a55c000}, {0x3a55e000}, 
-    {0x3a560000}, {0x3a562000}, {0x3a564000}, {0x3a566000}, 
-    {0x3a568000}, {0x3a56a000}, {0x3a56c000}, {0x3a56e000}, 
-    {0x3a570000}, {0x3a572000}, {0x3a574000}, {0x3a576000}, 
-    {0x3a578000}, {0x3a57a000}, {0x3a57c000}, {0x3a57e000}, 
-    {0x3a580000}, {0x3a582000}, {0x3a584000}, {0x3a586000}, 
-    {0x3a588000}, {0x3a58a000}, {0x3a58c000}, {0x3a58e000}, 
-    {0x3a590000}, {0x3a592000}, {0x3a594000}, {0x3a596000}, 
-    {0x3a598000}, {0x3a59a000}, {0x3a59c000}, {0x3a59e000}, 
-    {0x3a5a0000}, {0x3a5a2000}, {0x3a5a4000}, {0x3a5a6000}, 
-    {0x3a5a8000}, {0x3a5aa000}, {0x3a5ac000}, {0x3a5ae000}, 
-    {0x3a5b0000}, {0x3a5b2000}, {0x3a5b4000}, {0x3a5b6000}, 
-    {0x3a5b8000}, {0x3a5ba000}, {0x3a5bc000}, {0x3a5be000}, 
-    {0x3a5c0000}, {0x3a5c2000}, {0x3a5c4000}, {0x3a5c6000}, 
-    {0x3a5c8000}, {0x3a5ca000}, {0x3a5cc000}, {0x3a5ce000}, 
-    {0x3a5d0000}, {0x3a5d2000}, {0x3a5d4000}, {0x3a5d6000}, 
-    {0x3a5d8000}, {0x3a5da000}, {0x3a5dc000}, {0x3a5de000}, 
-    {0x3a5e0000}, {0x3a5e2000}, {0x3a5e4000}, {0x3a5e6000}, 
-    {0x3a5e8000}, {0x3a5ea000}, {0x3a5ec000}, {0x3a5ee000}, 
-    {0x3a5f0000}, {0x3a5f2000}, {0x3a5f4000}, {0x3a5f6000}, 
-    {0x3a5f8000}, {0x3a5fa000}, {0x3a5fc000}, {0x3a5fe000}, 
-    {0x3a600000}, {0x3a602000}, {0x3a604000}, {0x3a606000}, 
-    {0x3a608000}, {0x3a60a000}, {0x3a60c000}, {0x3a60e000}, 
-    {0x3a610000}, {0x3a612000}, {0x3a614000}, {0x3a616000}, 
-    {0x3a618000}, {0x3a61a000}, {0x3a61c000}, {0x3a61e000}, 
-    {0x3a620000}, {0x3a622000}, {0x3a624000}, {0x3a626000}, 
-    {0x3a628000}, {0x3a62a000}, {0x3a62c000}, {0x3a62e000}, 
-    {0x3a630000}, {0x3a632000}, {0x3a634000}, {0x3a636000}, 
-    {0x3a638000}, {0x3a63a000}, {0x3a63c000}, {0x3a63e000}, 
-    {0x3a640000}, {0x3a642000}, {0x3a644000}, {0x3a646000}, 
-    {0x3a648000}, {0x3a64a000}, {0x3a64c000}, {0x3a64e000}, 
-    {0x3a650000}, {0x3a652000}, {0x3a654000}, {0x3a656000}, 
-    {0x3a658000}, {0x3a65a000}, {0x3a65c000}, {0x3a65e000}, 
-    {0x3a660000}, {0x3a662000}, {0x3a664000}, {0x3a666000}, 
-    {0x3a668000}, {0x3a66a000}, {0x3a66c000}, {0x3a66e000}, 
-    {0x3a670000}, {0x3a672000}, {0x3a674000}, {0x3a676000}, 
-    {0x3a678000}, {0x3a67a000}, {0x3a67c000}, {0x3a67e000}, 
-    {0x3a680000}, {0x3a682000}, {0x3a684000}, {0x3a686000}, 
-    {0x3a688000}, {0x3a68a000}, {0x3a68c000}, {0x3a68e000}, 
-    {0x3a690000}, {0x3a692000}, {0x3a694000}, {0x3a696000}, 
-    {0x3a698000}, {0x3a69a000}, {0x3a69c000}, {0x3a69e000}, 
-    {0x3a6a0000}, {0x3a6a2000}, {0x3a6a4000}, {0x3a6a6000}, 
-    {0x3a6a8000}, {0x3a6aa000}, {0x3a6ac000}, {0x3a6ae000}, 
-    {0x3a6b0000}, {0x3a6b2000}, {0x3a6b4000}, {0x3a6b6000}, 
-    {0x3a6b8000}, {0x3a6ba000}, {0x3a6bc000}, {0x3a6be000}, 
-    {0x3a6c0000}, {0x3a6c2000}, {0x3a6c4000}, {0x3a6c6000}, 
-    {0x3a6c8000}, {0x3a6ca000}, {0x3a6cc000}, {0x3a6ce000}, 
-    {0x3a6d0000}, {0x3a6d2000}, {0x3a6d4000}, {0x3a6d6000}, 
-    {0x3a6d8000}, {0x3a6da000}, {0x3a6dc000}, {0x3a6de000}, 
-    {0x3a6e0000}, {0x3a6e2000}, {0x3a6e4000}, {0x3a6e6000}, 
-    {0x3a6e8000}, {0x3a6ea000}, {0x3a6ec000}, {0x3a6ee000}, 
-    {0x3a6f0000}, {0x3a6f2000}, {0x3a6f4000}, {0x3a6f6000}, 
-    {0x3a6f8000}, {0x3a6fa000}, {0x3a6fc000}, {0x3a6fe000}, 
-    {0x3a700000}, {0x3a702000}, {0x3a704000}, {0x3a706000}, 
-    {0x3a708000}, {0x3a70a000}, {0x3a70c000}, {0x3a70e000}, 
-    {0x3a710000}, {0x3a712000}, {0x3a714000}, {0x3a716000}, 
-    {0x3a718000}, {0x3a71a000}, {0x3a71c000}, {0x3a71e000}, 
-    {0x3a720000}, {0x3a722000}, {0x3a724000}, {0x3a726000}, 
-    {0x3a728000}, {0x3a72a000}, {0x3a72c000}, {0x3a72e000}, 
-    {0x3a730000}, {0x3a732000}, {0x3a734000}, {0x3a736000}, 
-    {0x3a738000}, {0x3a73a000}, {0x3a73c000}, {0x3a73e000}, 
-    {0x3a740000}, {0x3a742000}, {0x3a744000}, {0x3a746000}, 
-    {0x3a748000}, {0x3a74a000}, {0x3a74c000}, {0x3a74e000}, 
-    {0x3a750000}, {0x3a752000}, {0x3a754000}, {0x3a756000}, 
-    {0x3a758000}, {0x3a75a000}, {0x3a75c000}, {0x3a75e000}, 
-    {0x3a760000}, {0x3a762000}, {0x3a764000}, {0x3a766000}, 
-    {0x3a768000}, {0x3a76a000}, {0x3a76c000}, {0x3a76e000}, 
-    {0x3a770000}, {0x3a772000}, {0x3a774000}, {0x3a776000}, 
-    {0x3a778000}, {0x3a77a000}, {0x3a77c000}, {0x3a77e000}, 
-    {0x3a780000}, {0x3a782000}, {0x3a784000}, {0x3a786000}, 
-    {0x3a788000}, {0x3a78a000}, {0x3a78c000}, {0x3a78e000}, 
-    {0x3a790000}, {0x3a792000}, {0x3a794000}, {0x3a796000}, 
-    {0x3a798000}, {0x3a79a000}, {0x3a79c000}, {0x3a79e000}, 
-    {0x3a7a0000}, {0x3a7a2000}, {0x3a7a4000}, {0x3a7a6000}, 
-    {0x3a7a8000}, {0x3a7aa000}, {0x3a7ac000}, {0x3a7ae000}, 
-    {0x3a7b0000}, {0x3a7b2000}, {0x3a7b4000}, {0x3a7b6000}, 
-    {0x3a7b8000}, {0x3a7ba000}, {0x3a7bc000}, {0x3a7be000}, 
-    {0x3a7c0000}, {0x3a7c2000}, {0x3a7c4000}, {0x3a7c6000}, 
-    {0x3a7c8000}, {0x3a7ca000}, {0x3a7cc000}, {0x3a7ce000}, 
-    {0x3a7d0000}, {0x3a7d2000}, {0x3a7d4000}, {0x3a7d6000}, 
-    {0x3a7d8000}, {0x3a7da000}, {0x3a7dc000}, {0x3a7de000}, 
-    {0x3a7e0000}, {0x3a7e2000}, {0x3a7e4000}, {0x3a7e6000}, 
-    {0x3a7e8000}, {0x3a7ea000}, {0x3a7ec000}, {0x3a7ee000}, 
-    {0x3a7f0000}, {0x3a7f2000}, {0x3a7f4000}, {0x3a7f6000}, 
-    {0x3a7f8000}, {0x3a7fa000}, {0x3a7fc000}, {0x3a7fe000}, 
-    {0x3a800000}, {0x3a802000}, {0x3a804000}, {0x3a806000}, 
-    {0x3a808000}, {0x3a80a000}, {0x3a80c000}, {0x3a80e000}, 
-    {0x3a810000}, {0x3a812000}, {0x3a814000}, {0x3a816000}, 
-    {0x3a818000}, {0x3a81a000}, {0x3a81c000}, {0x3a81e000}, 
-    {0x3a820000}, {0x3a822000}, {0x3a824000}, {0x3a826000}, 
-    {0x3a828000}, {0x3a82a000}, {0x3a82c000}, {0x3a82e000}, 
-    {0x3a830000}, {0x3a832000}, {0x3a834000}, {0x3a836000}, 
-    {0x3a838000}, {0x3a83a000}, {0x3a83c000}, {0x3a83e000}, 
-    {0x3a840000}, {0x3a842000}, {0x3a844000}, {0x3a846000}, 
-    {0x3a848000}, {0x3a84a000}, {0x3a84c000}, {0x3a84e000}, 
-    {0x3a850000}, {0x3a852000}, {0x3a854000}, {0x3a856000}, 
-    {0x3a858000}, {0x3a85a000}, {0x3a85c000}, {0x3a85e000}, 
-    {0x3a860000}, {0x3a862000}, {0x3a864000}, {0x3a866000}, 
-    {0x3a868000}, {0x3a86a000}, {0x3a86c000}, {0x3a86e000}, 
-    {0x3a870000}, {0x3a872000}, {0x3a874000}, {0x3a876000}, 
-    {0x3a878000}, {0x3a87a000}, {0x3a87c000}, {0x3a87e000}, 
-    {0x3a880000}, {0x3a882000}, {0x3a884000}, {0x3a886000}, 
-    {0x3a888000}, {0x3a88a000}, {0x3a88c000}, {0x3a88e000}, 
-    {0x3a890000}, {0x3a892000}, {0x3a894000}, {0x3a896000}, 
-    {0x3a898000}, {0x3a89a000}, {0x3a89c000}, {0x3a89e000}, 
-    {0x3a8a0000}, {0x3a8a2000}, {0x3a8a4000}, {0x3a8a6000}, 
-    {0x3a8a8000}, {0x3a8aa000}, {0x3a8ac000}, {0x3a8ae000}, 
-    {0x3a8b0000}, {0x3a8b2000}, {0x3a8b4000}, {0x3a8b6000}, 
-    {0x3a8b8000}, {0x3a8ba000}, {0x3a8bc000}, {0x3a8be000}, 
-    {0x3a8c0000}, {0x3a8c2000}, {0x3a8c4000}, {0x3a8c6000}, 
-    {0x3a8c8000}, {0x3a8ca000}, {0x3a8cc000}, {0x3a8ce000}, 
-    {0x3a8d0000}, {0x3a8d2000}, {0x3a8d4000}, {0x3a8d6000}, 
-    {0x3a8d8000}, {0x3a8da000}, {0x3a8dc000}, {0x3a8de000}, 
-    {0x3a8e0000}, {0x3a8e2000}, {0x3a8e4000}, {0x3a8e6000}, 
-    {0x3a8e8000}, {0x3a8ea000}, {0x3a8ec000}, {0x3a8ee000}, 
-    {0x3a8f0000}, {0x3a8f2000}, {0x3a8f4000}, {0x3a8f6000}, 
-    {0x3a8f8000}, {0x3a8fa000}, {0x3a8fc000}, {0x3a8fe000}, 
-    {0x3a900000}, {0x3a902000}, {0x3a904000}, {0x3a906000}, 
-    {0x3a908000}, {0x3a90a000}, {0x3a90c000}, {0x3a90e000}, 
-    {0x3a910000}, {0x3a912000}, {0x3a914000}, {0x3a916000}, 
-    {0x3a918000}, {0x3a91a000}, {0x3a91c000}, {0x3a91e000}, 
-    {0x3a920000}, {0x3a922000}, {0x3a924000}, {0x3a926000}, 
-    {0x3a928000}, {0x3a92a000}, {0x3a92c000}, {0x3a92e000}, 
-    {0x3a930000}, {0x3a932000}, {0x3a934000}, {0x3a936000}, 
-    {0x3a938000}, {0x3a93a000}, {0x3a93c000}, {0x3a93e000}, 
-    {0x3a940000}, {0x3a942000}, {0x3a944000}, {0x3a946000}, 
-    {0x3a948000}, {0x3a94a000}, {0x3a94c000}, {0x3a94e000}, 
-    {0x3a950000}, {0x3a952000}, {0x3a954000}, {0x3a956000}, 
-    {0x3a958000}, {0x3a95a000}, {0x3a95c000}, {0x3a95e000}, 
-    {0x3a960000}, {0x3a962000}, {0x3a964000}, {0x3a966000}, 
-    {0x3a968000}, {0x3a96a000}, {0x3a96c000}, {0x3a96e000}, 
-    {0x3a970000}, {0x3a972000}, {0x3a974000}, {0x3a976000}, 
-    {0x3a978000}, {0x3a97a000}, {0x3a97c000}, {0x3a97e000}, 
-    {0x3a980000}, {0x3a982000}, {0x3a984000}, {0x3a986000}, 
-    {0x3a988000}, {0x3a98a000}, {0x3a98c000}, {0x3a98e000}, 
-    {0x3a990000}, {0x3a992000}, {0x3a994000}, {0x3a996000}, 
-    {0x3a998000}, {0x3a99a000}, {0x3a99c000}, {0x3a99e000}, 
-    {0x3a9a0000}, {0x3a9a2000}, {0x3a9a4000}, {0x3a9a6000}, 
-    {0x3a9a8000}, {0x3a9aa000}, {0x3a9ac000}, {0x3a9ae000}, 
-    {0x3a9b0000}, {0x3a9b2000}, {0x3a9b4000}, {0x3a9b6000}, 
-    {0x3a9b8000}, {0x3a9ba000}, {0x3a9bc000}, {0x3a9be000}, 
-    {0x3a9c0000}, {0x3a9c2000}, {0x3a9c4000}, {0x3a9c6000}, 
-    {0x3a9c8000}, {0x3a9ca000}, {0x3a9cc000}, {0x3a9ce000}, 
-    {0x3a9d0000}, {0x3a9d2000}, {0x3a9d4000}, {0x3a9d6000}, 
-    {0x3a9d8000}, {0x3a9da000}, {0x3a9dc000}, {0x3a9de000}, 
-    {0x3a9e0000}, {0x3a9e2000}, {0x3a9e4000}, {0x3a9e6000}, 
-    {0x3a9e8000}, {0x3a9ea000}, {0x3a9ec000}, {0x3a9ee000}, 
-    {0x3a9f0000}, {0x3a9f2000}, {0x3a9f4000}, {0x3a9f6000}, 
-    {0x3a9f8000}, {0x3a9fa000}, {0x3a9fc000}, {0x3a9fe000}, 
-    {0x3aa00000}, {0x3aa02000}, {0x3aa04000}, {0x3aa06000}, 
-    {0x3aa08000}, {0x3aa0a000}, {0x3aa0c000}, {0x3aa0e000}, 
-    {0x3aa10000}, {0x3aa12000}, {0x3aa14000}, {0x3aa16000}, 
-    {0x3aa18000}, {0x3aa1a000}, {0x3aa1c000}, {0x3aa1e000}, 
-    {0x3aa20000}, {0x3aa22000}, {0x3aa24000}, {0x3aa26000}, 
-    {0x3aa28000}, {0x3aa2a000}, {0x3aa2c000}, {0x3aa2e000}, 
-    {0x3aa30000}, {0x3aa32000}, {0x3aa34000}, {0x3aa36000}, 
-    {0x3aa38000}, {0x3aa3a000}, {0x3aa3c000}, {0x3aa3e000}, 
-    {0x3aa40000}, {0x3aa42000}, {0x3aa44000}, {0x3aa46000}, 
-    {0x3aa48000}, {0x3aa4a000}, {0x3aa4c000}, {0x3aa4e000}, 
-    {0x3aa50000}, {0x3aa52000}, {0x3aa54000}, {0x3aa56000}, 
-    {0x3aa58000}, {0x3aa5a000}, {0x3aa5c000}, {0x3aa5e000}, 
-    {0x3aa60000}, {0x3aa62000}, {0x3aa64000}, {0x3aa66000}, 
-    {0x3aa68000}, {0x3aa6a000}, {0x3aa6c000}, {0x3aa6e000}, 
-    {0x3aa70000}, {0x3aa72000}, {0x3aa74000}, {0x3aa76000}, 
-    {0x3aa78000}, {0x3aa7a000}, {0x3aa7c000}, {0x3aa7e000}, 
-    {0x3aa80000}, {0x3aa82000}, {0x3aa84000}, {0x3aa86000}, 
-    {0x3aa88000}, {0x3aa8a000}, {0x3aa8c000}, {0x3aa8e000}, 
-    {0x3aa90000}, {0x3aa92000}, {0x3aa94000}, {0x3aa96000}, 
-    {0x3aa98000}, {0x3aa9a000}, {0x3aa9c000}, {0x3aa9e000}, 
-    {0x3aaa0000}, {0x3aaa2000}, {0x3aaa4000}, {0x3aaa6000}, 
-    {0x3aaa8000}, {0x3aaaa000}, {0x3aaac000}, {0x3aaae000}, 
-    {0x3aab0000}, {0x3aab2000}, {0x3aab4000}, {0x3aab6000}, 
-    {0x3aab8000}, {0x3aaba000}, {0x3aabc000}, {0x3aabe000}, 
-    {0x3aac0000}, {0x3aac2000}, {0x3aac4000}, {0x3aac6000}, 
-    {0x3aac8000}, {0x3aaca000}, {0x3aacc000}, {0x3aace000}, 
-    {0x3aad0000}, {0x3aad2000}, {0x3aad4000}, {0x3aad6000}, 
-    {0x3aad8000}, {0x3aada000}, {0x3aadc000}, {0x3aade000}, 
-    {0x3aae0000}, {0x3aae2000}, {0x3aae4000}, {0x3aae6000}, 
-    {0x3aae8000}, {0x3aaea000}, {0x3aaec000}, {0x3aaee000}, 
-    {0x3aaf0000}, {0x3aaf2000}, {0x3aaf4000}, {0x3aaf6000}, 
-    {0x3aaf8000}, {0x3aafa000}, {0x3aafc000}, {0x3aafe000}, 
-    {0x3ab00000}, {0x3ab02000}, {0x3ab04000}, {0x3ab06000}, 
-    {0x3ab08000}, {0x3ab0a000}, {0x3ab0c000}, {0x3ab0e000}, 
-    {0x3ab10000}, {0x3ab12000}, {0x3ab14000}, {0x3ab16000}, 
-    {0x3ab18000}, {0x3ab1a000}, {0x3ab1c000}, {0x3ab1e000}, 
-    {0x3ab20000}, {0x3ab22000}, {0x3ab24000}, {0x3ab26000}, 
-    {0x3ab28000}, {0x3ab2a000}, {0x3ab2c000}, {0x3ab2e000}, 
-    {0x3ab30000}, {0x3ab32000}, {0x3ab34000}, {0x3ab36000}, 
-    {0x3ab38000}, {0x3ab3a000}, {0x3ab3c000}, {0x3ab3e000}, 
-    {0x3ab40000}, {0x3ab42000}, {0x3ab44000}, {0x3ab46000}, 
-    {0x3ab48000}, {0x3ab4a000}, {0x3ab4c000}, {0x3ab4e000}, 
-    {0x3ab50000}, {0x3ab52000}, {0x3ab54000}, {0x3ab56000}, 
-    {0x3ab58000}, {0x3ab5a000}, {0x3ab5c000}, {0x3ab5e000}, 
-    {0x3ab60000}, {0x3ab62000}, {0x3ab64000}, {0x3ab66000}, 
-    {0x3ab68000}, {0x3ab6a000}, {0x3ab6c000}, {0x3ab6e000}, 
-    {0x3ab70000}, {0x3ab72000}, {0x3ab74000}, {0x3ab76000}, 
-    {0x3ab78000}, {0x3ab7a000}, {0x3ab7c000}, {0x3ab7e000}, 
-    {0x3ab80000}, {0x3ab82000}, {0x3ab84000}, {0x3ab86000}, 
-    {0x3ab88000}, {0x3ab8a000}, {0x3ab8c000}, {0x3ab8e000}, 
-    {0x3ab90000}, {0x3ab92000}, {0x3ab94000}, {0x3ab96000}, 
-    {0x3ab98000}, {0x3ab9a000}, {0x3ab9c000}, {0x3ab9e000}, 
-    {0x3aba0000}, {0x3aba2000}, {0x3aba4000}, {0x3aba6000}, 
-    {0x3aba8000}, {0x3abaa000}, {0x3abac000}, {0x3abae000}, 
-    {0x3abb0000}, {0x3abb2000}, {0x3abb4000}, {0x3abb6000}, 
-    {0x3abb8000}, {0x3abba000}, {0x3abbc000}, {0x3abbe000}, 
-    {0x3abc0000}, {0x3abc2000}, {0x3abc4000}, {0x3abc6000}, 
-    {0x3abc8000}, {0x3abca000}, {0x3abcc000}, {0x3abce000}, 
-    {0x3abd0000}, {0x3abd2000}, {0x3abd4000}, {0x3abd6000}, 
-    {0x3abd8000}, {0x3abda000}, {0x3abdc000}, {0x3abde000}, 
-    {0x3abe0000}, {0x3abe2000}, {0x3abe4000}, {0x3abe6000}, 
-    {0x3abe8000}, {0x3abea000}, {0x3abec000}, {0x3abee000}, 
-    {0x3abf0000}, {0x3abf2000}, {0x3abf4000}, {0x3abf6000}, 
-    {0x3abf8000}, {0x3abfa000}, {0x3abfc000}, {0x3abfe000}, 
-    {0x3ac00000}, {0x3ac02000}, {0x3ac04000}, {0x3ac06000}, 
-    {0x3ac08000}, {0x3ac0a000}, {0x3ac0c000}, {0x3ac0e000}, 
-    {0x3ac10000}, {0x3ac12000}, {0x3ac14000}, {0x3ac16000}, 
-    {0x3ac18000}, {0x3ac1a000}, {0x3ac1c000}, {0x3ac1e000}, 
-    {0x3ac20000}, {0x3ac22000}, {0x3ac24000}, {0x3ac26000}, 
-    {0x3ac28000}, {0x3ac2a000}, {0x3ac2c000}, {0x3ac2e000}, 
-    {0x3ac30000}, {0x3ac32000}, {0x3ac34000}, {0x3ac36000}, 
-    {0x3ac38000}, {0x3ac3a000}, {0x3ac3c000}, {0x3ac3e000}, 
-    {0x3ac40000}, {0x3ac42000}, {0x3ac44000}, {0x3ac46000}, 
-    {0x3ac48000}, {0x3ac4a000}, {0x3ac4c000}, {0x3ac4e000}, 
-    {0x3ac50000}, {0x3ac52000}, {0x3ac54000}, {0x3ac56000}, 
-    {0x3ac58000}, {0x3ac5a000}, {0x3ac5c000}, {0x3ac5e000}, 
-    {0x3ac60000}, {0x3ac62000}, {0x3ac64000}, {0x3ac66000}, 
-    {0x3ac68000}, {0x3ac6a000}, {0x3ac6c000}, {0x3ac6e000}, 
-    {0x3ac70000}, {0x3ac72000}, {0x3ac74000}, {0x3ac76000}, 
-    {0x3ac78000}, {0x3ac7a000}, {0x3ac7c000}, {0x3ac7e000}, 
-    {0x3ac80000}, {0x3ac82000}, {0x3ac84000}, {0x3ac86000}, 
-    {0x3ac88000}, {0x3ac8a000}, {0x3ac8c000}, {0x3ac8e000}, 
-    {0x3ac90000}, {0x3ac92000}, {0x3ac94000}, {0x3ac96000}, 
-    {0x3ac98000}, {0x3ac9a000}, {0x3ac9c000}, {0x3ac9e000}, 
-    {0x3aca0000}, {0x3aca2000}, {0x3aca4000}, {0x3aca6000}, 
-    {0x3aca8000}, {0x3acaa000}, {0x3acac000}, {0x3acae000}, 
-    {0x3acb0000}, {0x3acb2000}, {0x3acb4000}, {0x3acb6000}, 
-    {0x3acb8000}, {0x3acba000}, {0x3acbc000}, {0x3acbe000}, 
-    {0x3acc0000}, {0x3acc2000}, {0x3acc4000}, {0x3acc6000}, 
-    {0x3acc8000}, {0x3acca000}, {0x3accc000}, {0x3acce000}, 
-    {0x3acd0000}, {0x3acd2000}, {0x3acd4000}, {0x3acd6000}, 
-    {0x3acd8000}, {0x3acda000}, {0x3acdc000}, {0x3acde000}, 
-    {0x3ace0000}, {0x3ace2000}, {0x3ace4000}, {0x3ace6000}, 
-    {0x3ace8000}, {0x3acea000}, {0x3acec000}, {0x3acee000}, 
-    {0x3acf0000}, {0x3acf2000}, {0x3acf4000}, {0x3acf6000}, 
-    {0x3acf8000}, {0x3acfa000}, {0x3acfc000}, {0x3acfe000}, 
-    {0x3ad00000}, {0x3ad02000}, {0x3ad04000}, {0x3ad06000}, 
-    {0x3ad08000}, {0x3ad0a000}, {0x3ad0c000}, {0x3ad0e000}, 
-    {0x3ad10000}, {0x3ad12000}, {0x3ad14000}, {0x3ad16000}, 
-    {0x3ad18000}, {0x3ad1a000}, {0x3ad1c000}, {0x3ad1e000}, 
-    {0x3ad20000}, {0x3ad22000}, {0x3ad24000}, {0x3ad26000}, 
-    {0x3ad28000}, {0x3ad2a000}, {0x3ad2c000}, {0x3ad2e000}, 
-    {0x3ad30000}, {0x3ad32000}, {0x3ad34000}, {0x3ad36000}, 
-    {0x3ad38000}, {0x3ad3a000}, {0x3ad3c000}, {0x3ad3e000}, 
-    {0x3ad40000}, {0x3ad42000}, {0x3ad44000}, {0x3ad46000}, 
-    {0x3ad48000}, {0x3ad4a000}, {0x3ad4c000}, {0x3ad4e000}, 
-    {0x3ad50000}, {0x3ad52000}, {0x3ad54000}, {0x3ad56000}, 
-    {0x3ad58000}, {0x3ad5a000}, {0x3ad5c000}, {0x3ad5e000}, 
-    {0x3ad60000}, {0x3ad62000}, {0x3ad64000}, {0x3ad66000}, 
-    {0x3ad68000}, {0x3ad6a000}, {0x3ad6c000}, {0x3ad6e000}, 
-    {0x3ad70000}, {0x3ad72000}, {0x3ad74000}, {0x3ad76000}, 
-    {0x3ad78000}, {0x3ad7a000}, {0x3ad7c000}, {0x3ad7e000}, 
-    {0x3ad80000}, {0x3ad82000}, {0x3ad84000}, {0x3ad86000}, 
-    {0x3ad88000}, {0x3ad8a000}, {0x3ad8c000}, {0x3ad8e000}, 
-    {0x3ad90000}, {0x3ad92000}, {0x3ad94000}, {0x3ad96000}, 
-    {0x3ad98000}, {0x3ad9a000}, {0x3ad9c000}, {0x3ad9e000}, 
-    {0x3ada0000}, {0x3ada2000}, {0x3ada4000}, {0x3ada6000}, 
-    {0x3ada8000}, {0x3adaa000}, {0x3adac000}, {0x3adae000}, 
-    {0x3adb0000}, {0x3adb2000}, {0x3adb4000}, {0x3adb6000}, 
-    {0x3adb8000}, {0x3adba000}, {0x3adbc000}, {0x3adbe000}, 
-    {0x3adc0000}, {0x3adc2000}, {0x3adc4000}, {0x3adc6000}, 
-    {0x3adc8000}, {0x3adca000}, {0x3adcc000}, {0x3adce000}, 
-    {0x3add0000}, {0x3add2000}, {0x3add4000}, {0x3add6000}, 
-    {0x3add8000}, {0x3adda000}, {0x3addc000}, {0x3adde000}, 
-    {0x3ade0000}, {0x3ade2000}, {0x3ade4000}, {0x3ade6000}, 
-    {0x3ade8000}, {0x3adea000}, {0x3adec000}, {0x3adee000}, 
-    {0x3adf0000}, {0x3adf2000}, {0x3adf4000}, {0x3adf6000}, 
-    {0x3adf8000}, {0x3adfa000}, {0x3adfc000}, {0x3adfe000}, 
-    {0x3ae00000}, {0x3ae02000}, {0x3ae04000}, {0x3ae06000}, 
-    {0x3ae08000}, {0x3ae0a000}, {0x3ae0c000}, {0x3ae0e000}, 
-    {0x3ae10000}, {0x3ae12000}, {0x3ae14000}, {0x3ae16000}, 
-    {0x3ae18000}, {0x3ae1a000}, {0x3ae1c000}, {0x3ae1e000}, 
-    {0x3ae20000}, {0x3ae22000}, {0x3ae24000}, {0x3ae26000}, 
-    {0x3ae28000}, {0x3ae2a000}, {0x3ae2c000}, {0x3ae2e000}, 
-    {0x3ae30000}, {0x3ae32000}, {0x3ae34000}, {0x3ae36000}, 
-    {0x3ae38000}, {0x3ae3a000}, {0x3ae3c000}, {0x3ae3e000}, 
-    {0x3ae40000}, {0x3ae42000}, {0x3ae44000}, {0x3ae46000}, 
-    {0x3ae48000}, {0x3ae4a000}, {0x3ae4c000}, {0x3ae4e000}, 
-    {0x3ae50000}, {0x3ae52000}, {0x3ae54000}, {0x3ae56000}, 
-    {0x3ae58000}, {0x3ae5a000}, {0x3ae5c000}, {0x3ae5e000}, 
-    {0x3ae60000}, {0x3ae62000}, {0x3ae64000}, {0x3ae66000}, 
-    {0x3ae68000}, {0x3ae6a000}, {0x3ae6c000}, {0x3ae6e000}, 
-    {0x3ae70000}, {0x3ae72000}, {0x3ae74000}, {0x3ae76000}, 
-    {0x3ae78000}, {0x3ae7a000}, {0x3ae7c000}, {0x3ae7e000}, 
-    {0x3ae80000}, {0x3ae82000}, {0x3ae84000}, {0x3ae86000}, 
-    {0x3ae88000}, {0x3ae8a000}, {0x3ae8c000}, {0x3ae8e000}, 
-    {0x3ae90000}, {0x3ae92000}, {0x3ae94000}, {0x3ae96000}, 
-    {0x3ae98000}, {0x3ae9a000}, {0x3ae9c000}, {0x3ae9e000}, 
-    {0x3aea0000}, {0x3aea2000}, {0x3aea4000}, {0x3aea6000}, 
-    {0x3aea8000}, {0x3aeaa000}, {0x3aeac000}, {0x3aeae000}, 
-    {0x3aeb0000}, {0x3aeb2000}, {0x3aeb4000}, {0x3aeb6000}, 
-    {0x3aeb8000}, {0x3aeba000}, {0x3aebc000}, {0x3aebe000}, 
-    {0x3aec0000}, {0x3aec2000}, {0x3aec4000}, {0x3aec6000}, 
-    {0x3aec8000}, {0x3aeca000}, {0x3aecc000}, {0x3aece000}, 
-    {0x3aed0000}, {0x3aed2000}, {0x3aed4000}, {0x3aed6000}, 
-    {0x3aed8000}, {0x3aeda000}, {0x3aedc000}, {0x3aede000}, 
-    {0x3aee0000}, {0x3aee2000}, {0x3aee4000}, {0x3aee6000}, 
-    {0x3aee8000}, {0x3aeea000}, {0x3aeec000}, {0x3aeee000}, 
-    {0x3aef0000}, {0x3aef2000}, {0x3aef4000}, {0x3aef6000}, 
-    {0x3aef8000}, {0x3aefa000}, {0x3aefc000}, {0x3aefe000}, 
-    {0x3af00000}, {0x3af02000}, {0x3af04000}, {0x3af06000}, 
-    {0x3af08000}, {0x3af0a000}, {0x3af0c000}, {0x3af0e000}, 
-    {0x3af10000}, {0x3af12000}, {0x3af14000}, {0x3af16000}, 
-    {0x3af18000}, {0x3af1a000}, {0x3af1c000}, {0x3af1e000}, 
-    {0x3af20000}, {0x3af22000}, {0x3af24000}, {0x3af26000}, 
-    {0x3af28000}, {0x3af2a000}, {0x3af2c000}, {0x3af2e000}, 
-    {0x3af30000}, {0x3af32000}, {0x3af34000}, {0x3af36000}, 
-    {0x3af38000}, {0x3af3a000}, {0x3af3c000}, {0x3af3e000}, 
-    {0x3af40000}, {0x3af42000}, {0x3af44000}, {0x3af46000}, 
-    {0x3af48000}, {0x3af4a000}, {0x3af4c000}, {0x3af4e000}, 
-    {0x3af50000}, {0x3af52000}, {0x3af54000}, {0x3af56000}, 
-    {0x3af58000}, {0x3af5a000}, {0x3af5c000}, {0x3af5e000}, 
-    {0x3af60000}, {0x3af62000}, {0x3af64000}, {0x3af66000}, 
-    {0x3af68000}, {0x3af6a000}, {0x3af6c000}, {0x3af6e000}, 
-    {0x3af70000}, {0x3af72000}, {0x3af74000}, {0x3af76000}, 
-    {0x3af78000}, {0x3af7a000}, {0x3af7c000}, {0x3af7e000}, 
-    {0x3af80000}, {0x3af82000}, {0x3af84000}, {0x3af86000}, 
-    {0x3af88000}, {0x3af8a000}, {0x3af8c000}, {0x3af8e000}, 
-    {0x3af90000}, {0x3af92000}, {0x3af94000}, {0x3af96000}, 
-    {0x3af98000}, {0x3af9a000}, {0x3af9c000}, {0x3af9e000}, 
-    {0x3afa0000}, {0x3afa2000}, {0x3afa4000}, {0x3afa6000}, 
-    {0x3afa8000}, {0x3afaa000}, {0x3afac000}, {0x3afae000}, 
-    {0x3afb0000}, {0x3afb2000}, {0x3afb4000}, {0x3afb6000}, 
-    {0x3afb8000}, {0x3afba000}, {0x3afbc000}, {0x3afbe000}, 
-    {0x3afc0000}, {0x3afc2000}, {0x3afc4000}, {0x3afc6000}, 
-    {0x3afc8000}, {0x3afca000}, {0x3afcc000}, {0x3afce000}, 
-    {0x3afd0000}, {0x3afd2000}, {0x3afd4000}, {0x3afd6000}, 
-    {0x3afd8000}, {0x3afda000}, {0x3afdc000}, {0x3afde000}, 
-    {0x3afe0000}, {0x3afe2000}, {0x3afe4000}, {0x3afe6000}, 
-    {0x3afe8000}, {0x3afea000}, {0x3afec000}, {0x3afee000}, 
-    {0x3aff0000}, {0x3aff2000}, {0x3aff4000}, {0x3aff6000}, 
-    {0x3aff8000}, {0x3affa000}, {0x3affc000}, {0x3affe000}, 
-    {0x3b000000}, {0x3b002000}, {0x3b004000}, {0x3b006000}, 
-    {0x3b008000}, {0x3b00a000}, {0x3b00c000}, {0x3b00e000}, 
-    {0x3b010000}, {0x3b012000}, {0x3b014000}, {0x3b016000}, 
-    {0x3b018000}, {0x3b01a000}, {0x3b01c000}, {0x3b01e000}, 
-    {0x3b020000}, {0x3b022000}, {0x3b024000}, {0x3b026000}, 
-    {0x3b028000}, {0x3b02a000}, {0x3b02c000}, {0x3b02e000}, 
-    {0x3b030000}, {0x3b032000}, {0x3b034000}, {0x3b036000}, 
-    {0x3b038000}, {0x3b03a000}, {0x3b03c000}, {0x3b03e000}, 
-    {0x3b040000}, {0x3b042000}, {0x3b044000}, {0x3b046000}, 
-    {0x3b048000}, {0x3b04a000}, {0x3b04c000}, {0x3b04e000}, 
-    {0x3b050000}, {0x3b052000}, {0x3b054000}, {0x3b056000}, 
-    {0x3b058000}, {0x3b05a000}, {0x3b05c000}, {0x3b05e000}, 
-    {0x3b060000}, {0x3b062000}, {0x3b064000}, {0x3b066000}, 
-    {0x3b068000}, {0x3b06a000}, {0x3b06c000}, {0x3b06e000}, 
-    {0x3b070000}, {0x3b072000}, {0x3b074000}, {0x3b076000}, 
-    {0x3b078000}, {0x3b07a000}, {0x3b07c000}, {0x3b07e000}, 
-    {0x3b080000}, {0x3b082000}, {0x3b084000}, {0x3b086000}, 
-    {0x3b088000}, {0x3b08a000}, {0x3b08c000}, {0x3b08e000}, 
-    {0x3b090000}, {0x3b092000}, {0x3b094000}, {0x3b096000}, 
-    {0x3b098000}, {0x3b09a000}, {0x3b09c000}, {0x3b09e000}, 
-    {0x3b0a0000}, {0x3b0a2000}, {0x3b0a4000}, {0x3b0a6000}, 
-    {0x3b0a8000}, {0x3b0aa000}, {0x3b0ac000}, {0x3b0ae000}, 
-    {0x3b0b0000}, {0x3b0b2000}, {0x3b0b4000}, {0x3b0b6000}, 
-    {0x3b0b8000}, {0x3b0ba000}, {0x3b0bc000}, {0x3b0be000}, 
-    {0x3b0c0000}, {0x3b0c2000}, {0x3b0c4000}, {0x3b0c6000}, 
-    {0x3b0c8000}, {0x3b0ca000}, {0x3b0cc000}, {0x3b0ce000}, 
-    {0x3b0d0000}, {0x3b0d2000}, {0x3b0d4000}, {0x3b0d6000}, 
-    {0x3b0d8000}, {0x3b0da000}, {0x3b0dc000}, {0x3b0de000}, 
-    {0x3b0e0000}, {0x3b0e2000}, {0x3b0e4000}, {0x3b0e6000}, 
-    {0x3b0e8000}, {0x3b0ea000}, {0x3b0ec000}, {0x3b0ee000}, 
-    {0x3b0f0000}, {0x3b0f2000}, {0x3b0f4000}, {0x3b0f6000}, 
-    {0x3b0f8000}, {0x3b0fa000}, {0x3b0fc000}, {0x3b0fe000}, 
-    {0x3b100000}, {0x3b102000}, {0x3b104000}, {0x3b106000}, 
-    {0x3b108000}, {0x3b10a000}, {0x3b10c000}, {0x3b10e000}, 
-    {0x3b110000}, {0x3b112000}, {0x3b114000}, {0x3b116000}, 
-    {0x3b118000}, {0x3b11a000}, {0x3b11c000}, {0x3b11e000}, 
-    {0x3b120000}, {0x3b122000}, {0x3b124000}, {0x3b126000}, 
-    {0x3b128000}, {0x3b12a000}, {0x3b12c000}, {0x3b12e000}, 
-    {0x3b130000}, {0x3b132000}, {0x3b134000}, {0x3b136000}, 
-    {0x3b138000}, {0x3b13a000}, {0x3b13c000}, {0x3b13e000}, 
-    {0x3b140000}, {0x3b142000}, {0x3b144000}, {0x3b146000}, 
-    {0x3b148000}, {0x3b14a000}, {0x3b14c000}, {0x3b14e000}, 
-    {0x3b150000}, {0x3b152000}, {0x3b154000}, {0x3b156000}, 
-    {0x3b158000}, {0x3b15a000}, {0x3b15c000}, {0x3b15e000}, 
-    {0x3b160000}, {0x3b162000}, {0x3b164000}, {0x3b166000}, 
-    {0x3b168000}, {0x3b16a000}, {0x3b16c000}, {0x3b16e000}, 
-    {0x3b170000}, {0x3b172000}, {0x3b174000}, {0x3b176000}, 
-    {0x3b178000}, {0x3b17a000}, {0x3b17c000}, {0x3b17e000}, 
-    {0x3b180000}, {0x3b182000}, {0x3b184000}, {0x3b186000}, 
-    {0x3b188000}, {0x3b18a000}, {0x3b18c000}, {0x3b18e000}, 
-    {0x3b190000}, {0x3b192000}, {0x3b194000}, {0x3b196000}, 
-    {0x3b198000}, {0x3b19a000}, {0x3b19c000}, {0x3b19e000}, 
-    {0x3b1a0000}, {0x3b1a2000}, {0x3b1a4000}, {0x3b1a6000}, 
-    {0x3b1a8000}, {0x3b1aa000}, {0x3b1ac000}, {0x3b1ae000}, 
-    {0x3b1b0000}, {0x3b1b2000}, {0x3b1b4000}, {0x3b1b6000}, 
-    {0x3b1b8000}, {0x3b1ba000}, {0x3b1bc000}, {0x3b1be000}, 
-    {0x3b1c0000}, {0x3b1c2000}, {0x3b1c4000}, {0x3b1c6000}, 
-    {0x3b1c8000}, {0x3b1ca000}, {0x3b1cc000}, {0x3b1ce000}, 
-    {0x3b1d0000}, {0x3b1d2000}, {0x3b1d4000}, {0x3b1d6000}, 
-    {0x3b1d8000}, {0x3b1da000}, {0x3b1dc000}, {0x3b1de000}, 
-    {0x3b1e0000}, {0x3b1e2000}, {0x3b1e4000}, {0x3b1e6000}, 
-    {0x3b1e8000}, {0x3b1ea000}, {0x3b1ec000}, {0x3b1ee000}, 
-    {0x3b1f0000}, {0x3b1f2000}, {0x3b1f4000}, {0x3b1f6000}, 
-    {0x3b1f8000}, {0x3b1fa000}, {0x3b1fc000}, {0x3b1fe000}, 
-    {0x3b200000}, {0x3b202000}, {0x3b204000}, {0x3b206000}, 
-    {0x3b208000}, {0x3b20a000}, {0x3b20c000}, {0x3b20e000}, 
-    {0x3b210000}, {0x3b212000}, {0x3b214000}, {0x3b216000}, 
-    {0x3b218000}, {0x3b21a000}, {0x3b21c000}, {0x3b21e000}, 
-    {0x3b220000}, {0x3b222000}, {0x3b224000}, {0x3b226000}, 
-    {0x3b228000}, {0x3b22a000}, {0x3b22c000}, {0x3b22e000}, 
-    {0x3b230000}, {0x3b232000}, {0x3b234000}, {0x3b236000}, 
-    {0x3b238000}, {0x3b23a000}, {0x3b23c000}, {0x3b23e000}, 
-    {0x3b240000}, {0x3b242000}, {0x3b244000}, {0x3b246000}, 
-    {0x3b248000}, {0x3b24a000}, {0x3b24c000}, {0x3b24e000}, 
-    {0x3b250000}, {0x3b252000}, {0x3b254000}, {0x3b256000}, 
-    {0x3b258000}, {0x3b25a000}, {0x3b25c000}, {0x3b25e000}, 
-    {0x3b260000}, {0x3b262000}, {0x3b264000}, {0x3b266000}, 
-    {0x3b268000}, {0x3b26a000}, {0x3b26c000}, {0x3b26e000}, 
-    {0x3b270000}, {0x3b272000}, {0x3b274000}, {0x3b276000}, 
-    {0x3b278000}, {0x3b27a000}, {0x3b27c000}, {0x3b27e000}, 
-    {0x3b280000}, {0x3b282000}, {0x3b284000}, {0x3b286000}, 
-    {0x3b288000}, {0x3b28a000}, {0x3b28c000}, {0x3b28e000}, 
-    {0x3b290000}, {0x3b292000}, {0x3b294000}, {0x3b296000}, 
-    {0x3b298000}, {0x3b29a000}, {0x3b29c000}, {0x3b29e000}, 
-    {0x3b2a0000}, {0x3b2a2000}, {0x3b2a4000}, {0x3b2a6000}, 
-    {0x3b2a8000}, {0x3b2aa000}, {0x3b2ac000}, {0x3b2ae000}, 
-    {0x3b2b0000}, {0x3b2b2000}, {0x3b2b4000}, {0x3b2b6000}, 
-    {0x3b2b8000}, {0x3b2ba000}, {0x3b2bc000}, {0x3b2be000}, 
-    {0x3b2c0000}, {0x3b2c2000}, {0x3b2c4000}, {0x3b2c6000}, 
-    {0x3b2c8000}, {0x3b2ca000}, {0x3b2cc000}, {0x3b2ce000}, 
-    {0x3b2d0000}, {0x3b2d2000}, {0x3b2d4000}, {0x3b2d6000}, 
-    {0x3b2d8000}, {0x3b2da000}, {0x3b2dc000}, {0x3b2de000}, 
-    {0x3b2e0000}, {0x3b2e2000}, {0x3b2e4000}, {0x3b2e6000}, 
-    {0x3b2e8000}, {0x3b2ea000}, {0x3b2ec000}, {0x3b2ee000}, 
-    {0x3b2f0000}, {0x3b2f2000}, {0x3b2f4000}, {0x3b2f6000}, 
-    {0x3b2f8000}, {0x3b2fa000}, {0x3b2fc000}, {0x3b2fe000}, 
-    {0x3b300000}, {0x3b302000}, {0x3b304000}, {0x3b306000}, 
-    {0x3b308000}, {0x3b30a000}, {0x3b30c000}, {0x3b30e000}, 
-    {0x3b310000}, {0x3b312000}, {0x3b314000}, {0x3b316000}, 
-    {0x3b318000}, {0x3b31a000}, {0x3b31c000}, {0x3b31e000}, 
-    {0x3b320000}, {0x3b322000}, {0x3b324000}, {0x3b326000}, 
-    {0x3b328000}, {0x3b32a000}, {0x3b32c000}, {0x3b32e000}, 
-    {0x3b330000}, {0x3b332000}, {0x3b334000}, {0x3b336000}, 
-    {0x3b338000}, {0x3b33a000}, {0x3b33c000}, {0x3b33e000}, 
-    {0x3b340000}, {0x3b342000}, {0x3b344000}, {0x3b346000}, 
-    {0x3b348000}, {0x3b34a000}, {0x3b34c000}, {0x3b34e000}, 
-    {0x3b350000}, {0x3b352000}, {0x3b354000}, {0x3b356000}, 
-    {0x3b358000}, {0x3b35a000}, {0x3b35c000}, {0x3b35e000}, 
-    {0x3b360000}, {0x3b362000}, {0x3b364000}, {0x3b366000}, 
-    {0x3b368000}, {0x3b36a000}, {0x3b36c000}, {0x3b36e000}, 
-    {0x3b370000}, {0x3b372000}, {0x3b374000}, {0x3b376000}, 
-    {0x3b378000}, {0x3b37a000}, {0x3b37c000}, {0x3b37e000}, 
-    {0x3b380000}, {0x3b382000}, {0x3b384000}, {0x3b386000}, 
-    {0x3b388000}, {0x3b38a000}, {0x3b38c000}, {0x3b38e000}, 
-    {0x3b390000}, {0x3b392000}, {0x3b394000}, {0x3b396000}, 
-    {0x3b398000}, {0x3b39a000}, {0x3b39c000}, {0x3b39e000}, 
-    {0x3b3a0000}, {0x3b3a2000}, {0x3b3a4000}, {0x3b3a6000}, 
-    {0x3b3a8000}, {0x3b3aa000}, {0x3b3ac000}, {0x3b3ae000}, 
-    {0x3b3b0000}, {0x3b3b2000}, {0x3b3b4000}, {0x3b3b6000}, 
-    {0x3b3b8000}, {0x3b3ba000}, {0x3b3bc000}, {0x3b3be000}, 
-    {0x3b3c0000}, {0x3b3c2000}, {0x3b3c4000}, {0x3b3c6000}, 
-    {0x3b3c8000}, {0x3b3ca000}, {0x3b3cc000}, {0x3b3ce000}, 
-    {0x3b3d0000}, {0x3b3d2000}, {0x3b3d4000}, {0x3b3d6000}, 
-    {0x3b3d8000}, {0x3b3da000}, {0x3b3dc000}, {0x3b3de000}, 
-    {0x3b3e0000}, {0x3b3e2000}, {0x3b3e4000}, {0x3b3e6000}, 
-    {0x3b3e8000}, {0x3b3ea000}, {0x3b3ec000}, {0x3b3ee000}, 
-    {0x3b3f0000}, {0x3b3f2000}, {0x3b3f4000}, {0x3b3f6000}, 
-    {0x3b3f8000}, {0x3b3fa000}, {0x3b3fc000}, {0x3b3fe000}, 
-    {0x3b400000}, {0x3b402000}, {0x3b404000}, {0x3b406000}, 
-    {0x3b408000}, {0x3b40a000}, {0x3b40c000}, {0x3b40e000}, 
-    {0x3b410000}, {0x3b412000}, {0x3b414000}, {0x3b416000}, 
-    {0x3b418000}, {0x3b41a000}, {0x3b41c000}, {0x3b41e000}, 
-    {0x3b420000}, {0x3b422000}, {0x3b424000}, {0x3b426000}, 
-    {0x3b428000}, {0x3b42a000}, {0x3b42c000}, {0x3b42e000}, 
-    {0x3b430000}, {0x3b432000}, {0x3b434000}, {0x3b436000}, 
-    {0x3b438000}, {0x3b43a000}, {0x3b43c000}, {0x3b43e000}, 
-    {0x3b440000}, {0x3b442000}, {0x3b444000}, {0x3b446000}, 
-    {0x3b448000}, {0x3b44a000}, {0x3b44c000}, {0x3b44e000}, 
-    {0x3b450000}, {0x3b452000}, {0x3b454000}, {0x3b456000}, 
-    {0x3b458000}, {0x3b45a000}, {0x3b45c000}, {0x3b45e000}, 
-    {0x3b460000}, {0x3b462000}, {0x3b464000}, {0x3b466000}, 
-    {0x3b468000}, {0x3b46a000}, {0x3b46c000}, {0x3b46e000}, 
-    {0x3b470000}, {0x3b472000}, {0x3b474000}, {0x3b476000}, 
-    {0x3b478000}, {0x3b47a000}, {0x3b47c000}, {0x3b47e000}, 
-    {0x3b480000}, {0x3b482000}, {0x3b484000}, {0x3b486000}, 
-    {0x3b488000}, {0x3b48a000}, {0x3b48c000}, {0x3b48e000}, 
-    {0x3b490000}, {0x3b492000}, {0x3b494000}, {0x3b496000}, 
-    {0x3b498000}, {0x3b49a000}, {0x3b49c000}, {0x3b49e000}, 
-    {0x3b4a0000}, {0x3b4a2000}, {0x3b4a4000}, {0x3b4a6000}, 
-    {0x3b4a8000}, {0x3b4aa000}, {0x3b4ac000}, {0x3b4ae000}, 
-    {0x3b4b0000}, {0x3b4b2000}, {0x3b4b4000}, {0x3b4b6000}, 
-    {0x3b4b8000}, {0x3b4ba000}, {0x3b4bc000}, {0x3b4be000}, 
-    {0x3b4c0000}, {0x3b4c2000}, {0x3b4c4000}, {0x3b4c6000}, 
-    {0x3b4c8000}, {0x3b4ca000}, {0x3b4cc000}, {0x3b4ce000}, 
-    {0x3b4d0000}, {0x3b4d2000}, {0x3b4d4000}, {0x3b4d6000}, 
-    {0x3b4d8000}, {0x3b4da000}, {0x3b4dc000}, {0x3b4de000}, 
-    {0x3b4e0000}, {0x3b4e2000}, {0x3b4e4000}, {0x3b4e6000}, 
-    {0x3b4e8000}, {0x3b4ea000}, {0x3b4ec000}, {0x3b4ee000}, 
-    {0x3b4f0000}, {0x3b4f2000}, {0x3b4f4000}, {0x3b4f6000}, 
-    {0x3b4f8000}, {0x3b4fa000}, {0x3b4fc000}, {0x3b4fe000}, 
-    {0x3b500000}, {0x3b502000}, {0x3b504000}, {0x3b506000}, 
-    {0x3b508000}, {0x3b50a000}, {0x3b50c000}, {0x3b50e000}, 
-    {0x3b510000}, {0x3b512000}, {0x3b514000}, {0x3b516000}, 
-    {0x3b518000}, {0x3b51a000}, {0x3b51c000}, {0x3b51e000}, 
-    {0x3b520000}, {0x3b522000}, {0x3b524000}, {0x3b526000}, 
-    {0x3b528000}, {0x3b52a000}, {0x3b52c000}, {0x3b52e000}, 
-    {0x3b530000}, {0x3b532000}, {0x3b534000}, {0x3b536000}, 
-    {0x3b538000}, {0x3b53a000}, {0x3b53c000}, {0x3b53e000}, 
-    {0x3b540000}, {0x3b542000}, {0x3b544000}, {0x3b546000}, 
-    {0x3b548000}, {0x3b54a000}, {0x3b54c000}, {0x3b54e000}, 
-    {0x3b550000}, {0x3b552000}, {0x3b554000}, {0x3b556000}, 
-    {0x3b558000}, {0x3b55a000}, {0x3b55c000}, {0x3b55e000}, 
-    {0x3b560000}, {0x3b562000}, {0x3b564000}, {0x3b566000}, 
-    {0x3b568000}, {0x3b56a000}, {0x3b56c000}, {0x3b56e000}, 
-    {0x3b570000}, {0x3b572000}, {0x3b574000}, {0x3b576000}, 
-    {0x3b578000}, {0x3b57a000}, {0x3b57c000}, {0x3b57e000}, 
-    {0x3b580000}, {0x3b582000}, {0x3b584000}, {0x3b586000}, 
-    {0x3b588000}, {0x3b58a000}, {0x3b58c000}, {0x3b58e000}, 
-    {0x3b590000}, {0x3b592000}, {0x3b594000}, {0x3b596000}, 
-    {0x3b598000}, {0x3b59a000}, {0x3b59c000}, {0x3b59e000}, 
-    {0x3b5a0000}, {0x3b5a2000}, {0x3b5a4000}, {0x3b5a6000}, 
-    {0x3b5a8000}, {0x3b5aa000}, {0x3b5ac000}, {0x3b5ae000}, 
-    {0x3b5b0000}, {0x3b5b2000}, {0x3b5b4000}, {0x3b5b6000}, 
-    {0x3b5b8000}, {0x3b5ba000}, {0x3b5bc000}, {0x3b5be000}, 
-    {0x3b5c0000}, {0x3b5c2000}, {0x3b5c4000}, {0x3b5c6000}, 
-    {0x3b5c8000}, {0x3b5ca000}, {0x3b5cc000}, {0x3b5ce000}, 
-    {0x3b5d0000}, {0x3b5d2000}, {0x3b5d4000}, {0x3b5d6000}, 
-    {0x3b5d8000}, {0x3b5da000}, {0x3b5dc000}, {0x3b5de000}, 
-    {0x3b5e0000}, {0x3b5e2000}, {0x3b5e4000}, {0x3b5e6000}, 
-    {0x3b5e8000}, {0x3b5ea000}, {0x3b5ec000}, {0x3b5ee000}, 
-    {0x3b5f0000}, {0x3b5f2000}, {0x3b5f4000}, {0x3b5f6000}, 
-    {0x3b5f8000}, {0x3b5fa000}, {0x3b5fc000}, {0x3b5fe000}, 
-    {0x3b600000}, {0x3b602000}, {0x3b604000}, {0x3b606000}, 
-    {0x3b608000}, {0x3b60a000}, {0x3b60c000}, {0x3b60e000}, 
-    {0x3b610000}, {0x3b612000}, {0x3b614000}, {0x3b616000}, 
-    {0x3b618000}, {0x3b61a000}, {0x3b61c000}, {0x3b61e000}, 
-    {0x3b620000}, {0x3b622000}, {0x3b624000}, {0x3b626000}, 
-    {0x3b628000}, {0x3b62a000}, {0x3b62c000}, {0x3b62e000}, 
-    {0x3b630000}, {0x3b632000}, {0x3b634000}, {0x3b636000}, 
-    {0x3b638000}, {0x3b63a000}, {0x3b63c000}, {0x3b63e000}, 
-    {0x3b640000}, {0x3b642000}, {0x3b644000}, {0x3b646000}, 
-    {0x3b648000}, {0x3b64a000}, {0x3b64c000}, {0x3b64e000}, 
-    {0x3b650000}, {0x3b652000}, {0x3b654000}, {0x3b656000}, 
-    {0x3b658000}, {0x3b65a000}, {0x3b65c000}, {0x3b65e000}, 
-    {0x3b660000}, {0x3b662000}, {0x3b664000}, {0x3b666000}, 
-    {0x3b668000}, {0x3b66a000}, {0x3b66c000}, {0x3b66e000}, 
-    {0x3b670000}, {0x3b672000}, {0x3b674000}, {0x3b676000}, 
-    {0x3b678000}, {0x3b67a000}, {0x3b67c000}, {0x3b67e000}, 
-    {0x3b680000}, {0x3b682000}, {0x3b684000}, {0x3b686000}, 
-    {0x3b688000}, {0x3b68a000}, {0x3b68c000}, {0x3b68e000}, 
-    {0x3b690000}, {0x3b692000}, {0x3b694000}, {0x3b696000}, 
-    {0x3b698000}, {0x3b69a000}, {0x3b69c000}, {0x3b69e000}, 
-    {0x3b6a0000}, {0x3b6a2000}, {0x3b6a4000}, {0x3b6a6000}, 
-    {0x3b6a8000}, {0x3b6aa000}, {0x3b6ac000}, {0x3b6ae000}, 
-    {0x3b6b0000}, {0x3b6b2000}, {0x3b6b4000}, {0x3b6b6000}, 
-    {0x3b6b8000}, {0x3b6ba000}, {0x3b6bc000}, {0x3b6be000}, 
-    {0x3b6c0000}, {0x3b6c2000}, {0x3b6c4000}, {0x3b6c6000}, 
-    {0x3b6c8000}, {0x3b6ca000}, {0x3b6cc000}, {0x3b6ce000}, 
-    {0x3b6d0000}, {0x3b6d2000}, {0x3b6d4000}, {0x3b6d6000}, 
-    {0x3b6d8000}, {0x3b6da000}, {0x3b6dc000}, {0x3b6de000}, 
-    {0x3b6e0000}, {0x3b6e2000}, {0x3b6e4000}, {0x3b6e6000}, 
-    {0x3b6e8000}, {0x3b6ea000}, {0x3b6ec000}, {0x3b6ee000}, 
-    {0x3b6f0000}, {0x3b6f2000}, {0x3b6f4000}, {0x3b6f6000}, 
-    {0x3b6f8000}, {0x3b6fa000}, {0x3b6fc000}, {0x3b6fe000}, 
-    {0x3b700000}, {0x3b702000}, {0x3b704000}, {0x3b706000}, 
-    {0x3b708000}, {0x3b70a000}, {0x3b70c000}, {0x3b70e000}, 
-    {0x3b710000}, {0x3b712000}, {0x3b714000}, {0x3b716000}, 
-    {0x3b718000}, {0x3b71a000}, {0x3b71c000}, {0x3b71e000}, 
-    {0x3b720000}, {0x3b722000}, {0x3b724000}, {0x3b726000}, 
-    {0x3b728000}, {0x3b72a000}, {0x3b72c000}, {0x3b72e000}, 
-    {0x3b730000}, {0x3b732000}, {0x3b734000}, {0x3b736000}, 
-    {0x3b738000}, {0x3b73a000}, {0x3b73c000}, {0x3b73e000}, 
-    {0x3b740000}, {0x3b742000}, {0x3b744000}, {0x3b746000}, 
-    {0x3b748000}, {0x3b74a000}, {0x3b74c000}, {0x3b74e000}, 
-    {0x3b750000}, {0x3b752000}, {0x3b754000}, {0x3b756000}, 
-    {0x3b758000}, {0x3b75a000}, {0x3b75c000}, {0x3b75e000}, 
-    {0x3b760000}, {0x3b762000}, {0x3b764000}, {0x3b766000}, 
-    {0x3b768000}, {0x3b76a000}, {0x3b76c000}, {0x3b76e000}, 
-    {0x3b770000}, {0x3b772000}, {0x3b774000}, {0x3b776000}, 
-    {0x3b778000}, {0x3b77a000}, {0x3b77c000}, {0x3b77e000}, 
-    {0x3b780000}, {0x3b782000}, {0x3b784000}, {0x3b786000}, 
-    {0x3b788000}, {0x3b78a000}, {0x3b78c000}, {0x3b78e000}, 
-    {0x3b790000}, {0x3b792000}, {0x3b794000}, {0x3b796000}, 
-    {0x3b798000}, {0x3b79a000}, {0x3b79c000}, {0x3b79e000}, 
-    {0x3b7a0000}, {0x3b7a2000}, {0x3b7a4000}, {0x3b7a6000}, 
-    {0x3b7a8000}, {0x3b7aa000}, {0x3b7ac000}, {0x3b7ae000}, 
-    {0x3b7b0000}, {0x3b7b2000}, {0x3b7b4000}, {0x3b7b6000}, 
-    {0x3b7b8000}, {0x3b7ba000}, {0x3b7bc000}, {0x3b7be000}, 
-    {0x3b7c0000}, {0x3b7c2000}, {0x3b7c4000}, {0x3b7c6000}, 
-    {0x3b7c8000}, {0x3b7ca000}, {0x3b7cc000}, {0x3b7ce000}, 
-    {0x3b7d0000}, {0x3b7d2000}, {0x3b7d4000}, {0x3b7d6000}, 
-    {0x3b7d8000}, {0x3b7da000}, {0x3b7dc000}, {0x3b7de000}, 
-    {0x3b7e0000}, {0x3b7e2000}, {0x3b7e4000}, {0x3b7e6000}, 
-    {0x3b7e8000}, {0x3b7ea000}, {0x3b7ec000}, {0x3b7ee000}, 
-    {0x3b7f0000}, {0x3b7f2000}, {0x3b7f4000}, {0x3b7f6000}, 
-    {0x3b7f8000}, {0x3b7fa000}, {0x3b7fc000}, {0x3b7fe000}, 
-    {0x3b800000}, {0x3b802000}, {0x3b804000}, {0x3b806000}, 
-    {0x3b808000}, {0x3b80a000}, {0x3b80c000}, {0x3b80e000}, 
-    {0x3b810000}, {0x3b812000}, {0x3b814000}, {0x3b816000}, 
-    {0x3b818000}, {0x3b81a000}, {0x3b81c000}, {0x3b81e000}, 
-    {0x3b820000}, {0x3b822000}, {0x3b824000}, {0x3b826000}, 
-    {0x3b828000}, {0x3b82a000}, {0x3b82c000}, {0x3b82e000}, 
-    {0x3b830000}, {0x3b832000}, {0x3b834000}, {0x3b836000}, 
-    {0x3b838000}, {0x3b83a000}, {0x3b83c000}, {0x3b83e000}, 
-    {0x3b840000}, {0x3b842000}, {0x3b844000}, {0x3b846000}, 
-    {0x3b848000}, {0x3b84a000}, {0x3b84c000}, {0x3b84e000}, 
-    {0x3b850000}, {0x3b852000}, {0x3b854000}, {0x3b856000}, 
-    {0x3b858000}, {0x3b85a000}, {0x3b85c000}, {0x3b85e000}, 
-    {0x3b860000}, {0x3b862000}, {0x3b864000}, {0x3b866000}, 
-    {0x3b868000}, {0x3b86a000}, {0x3b86c000}, {0x3b86e000}, 
-    {0x3b870000}, {0x3b872000}, {0x3b874000}, {0x3b876000}, 
-    {0x3b878000}, {0x3b87a000}, {0x3b87c000}, {0x3b87e000}, 
-    {0x3b880000}, {0x3b882000}, {0x3b884000}, {0x3b886000}, 
-    {0x3b888000}, {0x3b88a000}, {0x3b88c000}, {0x3b88e000}, 
-    {0x3b890000}, {0x3b892000}, {0x3b894000}, {0x3b896000}, 
-    {0x3b898000}, {0x3b89a000}, {0x3b89c000}, {0x3b89e000}, 
-    {0x3b8a0000}, {0x3b8a2000}, {0x3b8a4000}, {0x3b8a6000}, 
-    {0x3b8a8000}, {0x3b8aa000}, {0x3b8ac000}, {0x3b8ae000}, 
-    {0x3b8b0000}, {0x3b8b2000}, {0x3b8b4000}, {0x3b8b6000}, 
-    {0x3b8b8000}, {0x3b8ba000}, {0x3b8bc000}, {0x3b8be000}, 
-    {0x3b8c0000}, {0x3b8c2000}, {0x3b8c4000}, {0x3b8c6000}, 
-    {0x3b8c8000}, {0x3b8ca000}, {0x3b8cc000}, {0x3b8ce000}, 
-    {0x3b8d0000}, {0x3b8d2000}, {0x3b8d4000}, {0x3b8d6000}, 
-    {0x3b8d8000}, {0x3b8da000}, {0x3b8dc000}, {0x3b8de000}, 
-    {0x3b8e0000}, {0x3b8e2000}, {0x3b8e4000}, {0x3b8e6000}, 
-    {0x3b8e8000}, {0x3b8ea000}, {0x3b8ec000}, {0x3b8ee000}, 
-    {0x3b8f0000}, {0x3b8f2000}, {0x3b8f4000}, {0x3b8f6000}, 
-    {0x3b8f8000}, {0x3b8fa000}, {0x3b8fc000}, {0x3b8fe000}, 
-    {0x3b900000}, {0x3b902000}, {0x3b904000}, {0x3b906000}, 
-    {0x3b908000}, {0x3b90a000}, {0x3b90c000}, {0x3b90e000}, 
-    {0x3b910000}, {0x3b912000}, {0x3b914000}, {0x3b916000}, 
-    {0x3b918000}, {0x3b91a000}, {0x3b91c000}, {0x3b91e000}, 
-    {0x3b920000}, {0x3b922000}, {0x3b924000}, {0x3b926000}, 
-    {0x3b928000}, {0x3b92a000}, {0x3b92c000}, {0x3b92e000}, 
-    {0x3b930000}, {0x3b932000}, {0x3b934000}, {0x3b936000}, 
-    {0x3b938000}, {0x3b93a000}, {0x3b93c000}, {0x3b93e000}, 
-    {0x3b940000}, {0x3b942000}, {0x3b944000}, {0x3b946000}, 
-    {0x3b948000}, {0x3b94a000}, {0x3b94c000}, {0x3b94e000}, 
-    {0x3b950000}, {0x3b952000}, {0x3b954000}, {0x3b956000}, 
-    {0x3b958000}, {0x3b95a000}, {0x3b95c000}, {0x3b95e000}, 
-    {0x3b960000}, {0x3b962000}, {0x3b964000}, {0x3b966000}, 
-    {0x3b968000}, {0x3b96a000}, {0x3b96c000}, {0x3b96e000}, 
-    {0x3b970000}, {0x3b972000}, {0x3b974000}, {0x3b976000}, 
-    {0x3b978000}, {0x3b97a000}, {0x3b97c000}, {0x3b97e000}, 
-    {0x3b980000}, {0x3b982000}, {0x3b984000}, {0x3b986000}, 
-    {0x3b988000}, {0x3b98a000}, {0x3b98c000}, {0x3b98e000}, 
-    {0x3b990000}, {0x3b992000}, {0x3b994000}, {0x3b996000}, 
-    {0x3b998000}, {0x3b99a000}, {0x3b99c000}, {0x3b99e000}, 
-    {0x3b9a0000}, {0x3b9a2000}, {0x3b9a4000}, {0x3b9a6000}, 
-    {0x3b9a8000}, {0x3b9aa000}, {0x3b9ac000}, {0x3b9ae000}, 
-    {0x3b9b0000}, {0x3b9b2000}, {0x3b9b4000}, {0x3b9b6000}, 
-    {0x3b9b8000}, {0x3b9ba000}, {0x3b9bc000}, {0x3b9be000}, 
-    {0x3b9c0000}, {0x3b9c2000}, {0x3b9c4000}, {0x3b9c6000}, 
-    {0x3b9c8000}, {0x3b9ca000}, {0x3b9cc000}, {0x3b9ce000}, 
-    {0x3b9d0000}, {0x3b9d2000}, {0x3b9d4000}, {0x3b9d6000}, 
-    {0x3b9d8000}, {0x3b9da000}, {0x3b9dc000}, {0x3b9de000}, 
-    {0x3b9e0000}, {0x3b9e2000}, {0x3b9e4000}, {0x3b9e6000}, 
-    {0x3b9e8000}, {0x3b9ea000}, {0x3b9ec000}, {0x3b9ee000}, 
-    {0x3b9f0000}, {0x3b9f2000}, {0x3b9f4000}, {0x3b9f6000}, 
-    {0x3b9f8000}, {0x3b9fa000}, {0x3b9fc000}, {0x3b9fe000}, 
-    {0x3ba00000}, {0x3ba02000}, {0x3ba04000}, {0x3ba06000}, 
-    {0x3ba08000}, {0x3ba0a000}, {0x3ba0c000}, {0x3ba0e000}, 
-    {0x3ba10000}, {0x3ba12000}, {0x3ba14000}, {0x3ba16000}, 
-    {0x3ba18000}, {0x3ba1a000}, {0x3ba1c000}, {0x3ba1e000}, 
-    {0x3ba20000}, {0x3ba22000}, {0x3ba24000}, {0x3ba26000}, 
-    {0x3ba28000}, {0x3ba2a000}, {0x3ba2c000}, {0x3ba2e000}, 
-    {0x3ba30000}, {0x3ba32000}, {0x3ba34000}, {0x3ba36000}, 
-    {0x3ba38000}, {0x3ba3a000}, {0x3ba3c000}, {0x3ba3e000}, 
-    {0x3ba40000}, {0x3ba42000}, {0x3ba44000}, {0x3ba46000}, 
-    {0x3ba48000}, {0x3ba4a000}, {0x3ba4c000}, {0x3ba4e000}, 
-    {0x3ba50000}, {0x3ba52000}, {0x3ba54000}, {0x3ba56000}, 
-    {0x3ba58000}, {0x3ba5a000}, {0x3ba5c000}, {0x3ba5e000}, 
-    {0x3ba60000}, {0x3ba62000}, {0x3ba64000}, {0x3ba66000}, 
-    {0x3ba68000}, {0x3ba6a000}, {0x3ba6c000}, {0x3ba6e000}, 
-    {0x3ba70000}, {0x3ba72000}, {0x3ba74000}, {0x3ba76000}, 
-    {0x3ba78000}, {0x3ba7a000}, {0x3ba7c000}, {0x3ba7e000}, 
-    {0x3ba80000}, {0x3ba82000}, {0x3ba84000}, {0x3ba86000}, 
-    {0x3ba88000}, {0x3ba8a000}, {0x3ba8c000}, {0x3ba8e000}, 
-    {0x3ba90000}, {0x3ba92000}, {0x3ba94000}, {0x3ba96000}, 
-    {0x3ba98000}, {0x3ba9a000}, {0x3ba9c000}, {0x3ba9e000}, 
-    {0x3baa0000}, {0x3baa2000}, {0x3baa4000}, {0x3baa6000}, 
-    {0x3baa8000}, {0x3baaa000}, {0x3baac000}, {0x3baae000}, 
-    {0x3bab0000}, {0x3bab2000}, {0x3bab4000}, {0x3bab6000}, 
-    {0x3bab8000}, {0x3baba000}, {0x3babc000}, {0x3babe000}, 
-    {0x3bac0000}, {0x3bac2000}, {0x3bac4000}, {0x3bac6000}, 
-    {0x3bac8000}, {0x3baca000}, {0x3bacc000}, {0x3bace000}, 
-    {0x3bad0000}, {0x3bad2000}, {0x3bad4000}, {0x3bad6000}, 
-    {0x3bad8000}, {0x3bada000}, {0x3badc000}, {0x3bade000}, 
-    {0x3bae0000}, {0x3bae2000}, {0x3bae4000}, {0x3bae6000}, 
-    {0x3bae8000}, {0x3baea000}, {0x3baec000}, {0x3baee000}, 
-    {0x3baf0000}, {0x3baf2000}, {0x3baf4000}, {0x3baf6000}, 
-    {0x3baf8000}, {0x3bafa000}, {0x3bafc000}, {0x3bafe000}, 
-    {0x3bb00000}, {0x3bb02000}, {0x3bb04000}, {0x3bb06000}, 
-    {0x3bb08000}, {0x3bb0a000}, {0x3bb0c000}, {0x3bb0e000}, 
-    {0x3bb10000}, {0x3bb12000}, {0x3bb14000}, {0x3bb16000}, 
-    {0x3bb18000}, {0x3bb1a000}, {0x3bb1c000}, {0x3bb1e000}, 
-    {0x3bb20000}, {0x3bb22000}, {0x3bb24000}, {0x3bb26000}, 
-    {0x3bb28000}, {0x3bb2a000}, {0x3bb2c000}, {0x3bb2e000}, 
-    {0x3bb30000}, {0x3bb32000}, {0x3bb34000}, {0x3bb36000}, 
-    {0x3bb38000}, {0x3bb3a000}, {0x3bb3c000}, {0x3bb3e000}, 
-    {0x3bb40000}, {0x3bb42000}, {0x3bb44000}, {0x3bb46000}, 
-    {0x3bb48000}, {0x3bb4a000}, {0x3bb4c000}, {0x3bb4e000}, 
-    {0x3bb50000}, {0x3bb52000}, {0x3bb54000}, {0x3bb56000}, 
-    {0x3bb58000}, {0x3bb5a000}, {0x3bb5c000}, {0x3bb5e000}, 
-    {0x3bb60000}, {0x3bb62000}, {0x3bb64000}, {0x3bb66000}, 
-    {0x3bb68000}, {0x3bb6a000}, {0x3bb6c000}, {0x3bb6e000}, 
-    {0x3bb70000}, {0x3bb72000}, {0x3bb74000}, {0x3bb76000}, 
-    {0x3bb78000}, {0x3bb7a000}, {0x3bb7c000}, {0x3bb7e000}, 
-    {0x3bb80000}, {0x3bb82000}, {0x3bb84000}, {0x3bb86000}, 
-    {0x3bb88000}, {0x3bb8a000}, {0x3bb8c000}, {0x3bb8e000}, 
-    {0x3bb90000}, {0x3bb92000}, {0x3bb94000}, {0x3bb96000}, 
-    {0x3bb98000}, {0x3bb9a000}, {0x3bb9c000}, {0x3bb9e000}, 
-    {0x3bba0000}, {0x3bba2000}, {0x3bba4000}, {0x3bba6000}, 
-    {0x3bba8000}, {0x3bbaa000}, {0x3bbac000}, {0x3bbae000}, 
-    {0x3bbb0000}, {0x3bbb2000}, {0x3bbb4000}, {0x3bbb6000}, 
-    {0x3bbb8000}, {0x3bbba000}, {0x3bbbc000}, {0x3bbbe000}, 
-    {0x3bbc0000}, {0x3bbc2000}, {0x3bbc4000}, {0x3bbc6000}, 
-    {0x3bbc8000}, {0x3bbca000}, {0x3bbcc000}, {0x3bbce000}, 
-    {0x3bbd0000}, {0x3bbd2000}, {0x3bbd4000}, {0x3bbd6000}, 
-    {0x3bbd8000}, {0x3bbda000}, {0x3bbdc000}, {0x3bbde000}, 
-    {0x3bbe0000}, {0x3bbe2000}, {0x3bbe4000}, {0x3bbe6000}, 
-    {0x3bbe8000}, {0x3bbea000}, {0x3bbec000}, {0x3bbee000}, 
-    {0x3bbf0000}, {0x3bbf2000}, {0x3bbf4000}, {0x3bbf6000}, 
-    {0x3bbf8000}, {0x3bbfa000}, {0x3bbfc000}, {0x3bbfe000}, 
-    {0x3bc00000}, {0x3bc02000}, {0x3bc04000}, {0x3bc06000}, 
-    {0x3bc08000}, {0x3bc0a000}, {0x3bc0c000}, {0x3bc0e000}, 
-    {0x3bc10000}, {0x3bc12000}, {0x3bc14000}, {0x3bc16000}, 
-    {0x3bc18000}, {0x3bc1a000}, {0x3bc1c000}, {0x3bc1e000}, 
-    {0x3bc20000}, {0x3bc22000}, {0x3bc24000}, {0x3bc26000}, 
-    {0x3bc28000}, {0x3bc2a000}, {0x3bc2c000}, {0x3bc2e000}, 
-    {0x3bc30000}, {0x3bc32000}, {0x3bc34000}, {0x3bc36000}, 
-    {0x3bc38000}, {0x3bc3a000}, {0x3bc3c000}, {0x3bc3e000}, 
-    {0x3bc40000}, {0x3bc42000}, {0x3bc44000}, {0x3bc46000}, 
-    {0x3bc48000}, {0x3bc4a000}, {0x3bc4c000}, {0x3bc4e000}, 
-    {0x3bc50000}, {0x3bc52000}, {0x3bc54000}, {0x3bc56000}, 
-    {0x3bc58000}, {0x3bc5a000}, {0x3bc5c000}, {0x3bc5e000}, 
-    {0x3bc60000}, {0x3bc62000}, {0x3bc64000}, {0x3bc66000}, 
-    {0x3bc68000}, {0x3bc6a000}, {0x3bc6c000}, {0x3bc6e000}, 
-    {0x3bc70000}, {0x3bc72000}, {0x3bc74000}, {0x3bc76000}, 
-    {0x3bc78000}, {0x3bc7a000}, {0x3bc7c000}, {0x3bc7e000}, 
-    {0x3bc80000}, {0x3bc82000}, {0x3bc84000}, {0x3bc86000}, 
-    {0x3bc88000}, {0x3bc8a000}, {0x3bc8c000}, {0x3bc8e000}, 
-    {0x3bc90000}, {0x3bc92000}, {0x3bc94000}, {0x3bc96000}, 
-    {0x3bc98000}, {0x3bc9a000}, {0x3bc9c000}, {0x3bc9e000}, 
-    {0x3bca0000}, {0x3bca2000}, {0x3bca4000}, {0x3bca6000}, 
-    {0x3bca8000}, {0x3bcaa000}, {0x3bcac000}, {0x3bcae000}, 
-    {0x3bcb0000}, {0x3bcb2000}, {0x3bcb4000}, {0x3bcb6000}, 
-    {0x3bcb8000}, {0x3bcba000}, {0x3bcbc000}, {0x3bcbe000}, 
-    {0x3bcc0000}, {0x3bcc2000}, {0x3bcc4000}, {0x3bcc6000}, 
-    {0x3bcc8000}, {0x3bcca000}, {0x3bccc000}, {0x3bcce000}, 
-    {0x3bcd0000}, {0x3bcd2000}, {0x3bcd4000}, {0x3bcd6000}, 
-    {0x3bcd8000}, {0x3bcda000}, {0x3bcdc000}, {0x3bcde000}, 
-    {0x3bce0000}, {0x3bce2000}, {0x3bce4000}, {0x3bce6000}, 
-    {0x3bce8000}, {0x3bcea000}, {0x3bcec000}, {0x3bcee000}, 
-    {0x3bcf0000}, {0x3bcf2000}, {0x3bcf4000}, {0x3bcf6000}, 
-    {0x3bcf8000}, {0x3bcfa000}, {0x3bcfc000}, {0x3bcfe000}, 
-    {0x3bd00000}, {0x3bd02000}, {0x3bd04000}, {0x3bd06000}, 
-    {0x3bd08000}, {0x3bd0a000}, {0x3bd0c000}, {0x3bd0e000}, 
-    {0x3bd10000}, {0x3bd12000}, {0x3bd14000}, {0x3bd16000}, 
-    {0x3bd18000}, {0x3bd1a000}, {0x3bd1c000}, {0x3bd1e000}, 
-    {0x3bd20000}, {0x3bd22000}, {0x3bd24000}, {0x3bd26000}, 
-    {0x3bd28000}, {0x3bd2a000}, {0x3bd2c000}, {0x3bd2e000}, 
-    {0x3bd30000}, {0x3bd32000}, {0x3bd34000}, {0x3bd36000}, 
-    {0x3bd38000}, {0x3bd3a000}, {0x3bd3c000}, {0x3bd3e000}, 
-    {0x3bd40000}, {0x3bd42000}, {0x3bd44000}, {0x3bd46000}, 
-    {0x3bd48000}, {0x3bd4a000}, {0x3bd4c000}, {0x3bd4e000}, 
-    {0x3bd50000}, {0x3bd52000}, {0x3bd54000}, {0x3bd56000}, 
-    {0x3bd58000}, {0x3bd5a000}, {0x3bd5c000}, {0x3bd5e000}, 
-    {0x3bd60000}, {0x3bd62000}, {0x3bd64000}, {0x3bd66000}, 
-    {0x3bd68000}, {0x3bd6a000}, {0x3bd6c000}, {0x3bd6e000}, 
-    {0x3bd70000}, {0x3bd72000}, {0x3bd74000}, {0x3bd76000}, 
-    {0x3bd78000}, {0x3bd7a000}, {0x3bd7c000}, {0x3bd7e000}, 
-    {0x3bd80000}, {0x3bd82000}, {0x3bd84000}, {0x3bd86000}, 
-    {0x3bd88000}, {0x3bd8a000}, {0x3bd8c000}, {0x3bd8e000}, 
-    {0x3bd90000}, {0x3bd92000}, {0x3bd94000}, {0x3bd96000}, 
-    {0x3bd98000}, {0x3bd9a000}, {0x3bd9c000}, {0x3bd9e000}, 
-    {0x3bda0000}, {0x3bda2000}, {0x3bda4000}, {0x3bda6000}, 
-    {0x3bda8000}, {0x3bdaa000}, {0x3bdac000}, {0x3bdae000}, 
-    {0x3bdb0000}, {0x3bdb2000}, {0x3bdb4000}, {0x3bdb6000}, 
-    {0x3bdb8000}, {0x3bdba000}, {0x3bdbc000}, {0x3bdbe000}, 
-    {0x3bdc0000}, {0x3bdc2000}, {0x3bdc4000}, {0x3bdc6000}, 
-    {0x3bdc8000}, {0x3bdca000}, {0x3bdcc000}, {0x3bdce000}, 
-    {0x3bdd0000}, {0x3bdd2000}, {0x3bdd4000}, {0x3bdd6000}, 
-    {0x3bdd8000}, {0x3bdda000}, {0x3bddc000}, {0x3bdde000}, 
-    {0x3bde0000}, {0x3bde2000}, {0x3bde4000}, {0x3bde6000}, 
-    {0x3bde8000}, {0x3bdea000}, {0x3bdec000}, {0x3bdee000}, 
-    {0x3bdf0000}, {0x3bdf2000}, {0x3bdf4000}, {0x3bdf6000}, 
-    {0x3bdf8000}, {0x3bdfa000}, {0x3bdfc000}, {0x3bdfe000}, 
-    {0x3be00000}, {0x3be02000}, {0x3be04000}, {0x3be06000}, 
-    {0x3be08000}, {0x3be0a000}, {0x3be0c000}, {0x3be0e000}, 
-    {0x3be10000}, {0x3be12000}, {0x3be14000}, {0x3be16000}, 
-    {0x3be18000}, {0x3be1a000}, {0x3be1c000}, {0x3be1e000}, 
-    {0x3be20000}, {0x3be22000}, {0x3be24000}, {0x3be26000}, 
-    {0x3be28000}, {0x3be2a000}, {0x3be2c000}, {0x3be2e000}, 
-    {0x3be30000}, {0x3be32000}, {0x3be34000}, {0x3be36000}, 
-    {0x3be38000}, {0x3be3a000}, {0x3be3c000}, {0x3be3e000}, 
-    {0x3be40000}, {0x3be42000}, {0x3be44000}, {0x3be46000}, 
-    {0x3be48000}, {0x3be4a000}, {0x3be4c000}, {0x3be4e000}, 
-    {0x3be50000}, {0x3be52000}, {0x3be54000}, {0x3be56000}, 
-    {0x3be58000}, {0x3be5a000}, {0x3be5c000}, {0x3be5e000}, 
-    {0x3be60000}, {0x3be62000}, {0x3be64000}, {0x3be66000}, 
-    {0x3be68000}, {0x3be6a000}, {0x3be6c000}, {0x3be6e000}, 
-    {0x3be70000}, {0x3be72000}, {0x3be74000}, {0x3be76000}, 
-    {0x3be78000}, {0x3be7a000}, {0x3be7c000}, {0x3be7e000}, 
-    {0x3be80000}, {0x3be82000}, {0x3be84000}, {0x3be86000}, 
-    {0x3be88000}, {0x3be8a000}, {0x3be8c000}, {0x3be8e000}, 
-    {0x3be90000}, {0x3be92000}, {0x3be94000}, {0x3be96000}, 
-    {0x3be98000}, {0x3be9a000}, {0x3be9c000}, {0x3be9e000}, 
-    {0x3bea0000}, {0x3bea2000}, {0x3bea4000}, {0x3bea6000}, 
-    {0x3bea8000}, {0x3beaa000}, {0x3beac000}, {0x3beae000}, 
-    {0x3beb0000}, {0x3beb2000}, {0x3beb4000}, {0x3beb6000}, 
-    {0x3beb8000}, {0x3beba000}, {0x3bebc000}, {0x3bebe000}, 
-    {0x3bec0000}, {0x3bec2000}, {0x3bec4000}, {0x3bec6000}, 
-    {0x3bec8000}, {0x3beca000}, {0x3becc000}, {0x3bece000}, 
-    {0x3bed0000}, {0x3bed2000}, {0x3bed4000}, {0x3bed6000}, 
-    {0x3bed8000}, {0x3beda000}, {0x3bedc000}, {0x3bede000}, 
-    {0x3bee0000}, {0x3bee2000}, {0x3bee4000}, {0x3bee6000}, 
-    {0x3bee8000}, {0x3beea000}, {0x3beec000}, {0x3beee000}, 
-    {0x3bef0000}, {0x3bef2000}, {0x3bef4000}, {0x3bef6000}, 
-    {0x3bef8000}, {0x3befa000}, {0x3befc000}, {0x3befe000}, 
-    {0x3bf00000}, {0x3bf02000}, {0x3bf04000}, {0x3bf06000}, 
-    {0x3bf08000}, {0x3bf0a000}, {0x3bf0c000}, {0x3bf0e000}, 
-    {0x3bf10000}, {0x3bf12000}, {0x3bf14000}, {0x3bf16000}, 
-    {0x3bf18000}, {0x3bf1a000}, {0x3bf1c000}, {0x3bf1e000}, 
-    {0x3bf20000}, {0x3bf22000}, {0x3bf24000}, {0x3bf26000}, 
-    {0x3bf28000}, {0x3bf2a000}, {0x3bf2c000}, {0x3bf2e000}, 
-    {0x3bf30000}, {0x3bf32000}, {0x3bf34000}, {0x3bf36000}, 
-    {0x3bf38000}, {0x3bf3a000}, {0x3bf3c000}, {0x3bf3e000}, 
-    {0x3bf40000}, {0x3bf42000}, {0x3bf44000}, {0x3bf46000}, 
-    {0x3bf48000}, {0x3bf4a000}, {0x3bf4c000}, {0x3bf4e000}, 
-    {0x3bf50000}, {0x3bf52000}, {0x3bf54000}, {0x3bf56000}, 
-    {0x3bf58000}, {0x3bf5a000}, {0x3bf5c000}, {0x3bf5e000}, 
-    {0x3bf60000}, {0x3bf62000}, {0x3bf64000}, {0x3bf66000}, 
-    {0x3bf68000}, {0x3bf6a000}, {0x3bf6c000}, {0x3bf6e000}, 
-    {0x3bf70000}, {0x3bf72000}, {0x3bf74000}, {0x3bf76000}, 
-    {0x3bf78000}, {0x3bf7a000}, {0x3bf7c000}, {0x3bf7e000}, 
-    {0x3bf80000}, {0x3bf82000}, {0x3bf84000}, {0x3bf86000}, 
-    {0x3bf88000}, {0x3bf8a000}, {0x3bf8c000}, {0x3bf8e000}, 
-    {0x3bf90000}, {0x3bf92000}, {0x3bf94000}, {0x3bf96000}, 
-    {0x3bf98000}, {0x3bf9a000}, {0x3bf9c000}, {0x3bf9e000}, 
-    {0x3bfa0000}, {0x3bfa2000}, {0x3bfa4000}, {0x3bfa6000}, 
-    {0x3bfa8000}, {0x3bfaa000}, {0x3bfac000}, {0x3bfae000}, 
-    {0x3bfb0000}, {0x3bfb2000}, {0x3bfb4000}, {0x3bfb6000}, 
-    {0x3bfb8000}, {0x3bfba000}, {0x3bfbc000}, {0x3bfbe000}, 
-    {0x3bfc0000}, {0x3bfc2000}, {0x3bfc4000}, {0x3bfc6000}, 
-    {0x3bfc8000}, {0x3bfca000}, {0x3bfcc000}, {0x3bfce000}, 
-    {0x3bfd0000}, {0x3bfd2000}, {0x3bfd4000}, {0x3bfd6000}, 
-    {0x3bfd8000}, {0x3bfda000}, {0x3bfdc000}, {0x3bfde000}, 
-    {0x3bfe0000}, {0x3bfe2000}, {0x3bfe4000}, {0x3bfe6000}, 
-    {0x3bfe8000}, {0x3bfea000}, {0x3bfec000}, {0x3bfee000}, 
-    {0x3bff0000}, {0x3bff2000}, {0x3bff4000}, {0x3bff6000}, 
-    {0x3bff8000}, {0x3bffa000}, {0x3bffc000}, {0x3bffe000}, 
-    {0x3c000000}, {0x3c002000}, {0x3c004000}, {0x3c006000}, 
-    {0x3c008000}, {0x3c00a000}, {0x3c00c000}, {0x3c00e000}, 
-    {0x3c010000}, {0x3c012000}, {0x3c014000}, {0x3c016000}, 
-    {0x3c018000}, {0x3c01a000}, {0x3c01c000}, {0x3c01e000}, 
-    {0x3c020000}, {0x3c022000}, {0x3c024000}, {0x3c026000}, 
-    {0x3c028000}, {0x3c02a000}, {0x3c02c000}, {0x3c02e000}, 
-    {0x3c030000}, {0x3c032000}, {0x3c034000}, {0x3c036000}, 
-    {0x3c038000}, {0x3c03a000}, {0x3c03c000}, {0x3c03e000}, 
-    {0x3c040000}, {0x3c042000}, {0x3c044000}, {0x3c046000}, 
-    {0x3c048000}, {0x3c04a000}, {0x3c04c000}, {0x3c04e000}, 
-    {0x3c050000}, {0x3c052000}, {0x3c054000}, {0x3c056000}, 
-    {0x3c058000}, {0x3c05a000}, {0x3c05c000}, {0x3c05e000}, 
-    {0x3c060000}, {0x3c062000}, {0x3c064000}, {0x3c066000}, 
-    {0x3c068000}, {0x3c06a000}, {0x3c06c000}, {0x3c06e000}, 
-    {0x3c070000}, {0x3c072000}, {0x3c074000}, {0x3c076000}, 
-    {0x3c078000}, {0x3c07a000}, {0x3c07c000}, {0x3c07e000}, 
-    {0x3c080000}, {0x3c082000}, {0x3c084000}, {0x3c086000}, 
-    {0x3c088000}, {0x3c08a000}, {0x3c08c000}, {0x3c08e000}, 
-    {0x3c090000}, {0x3c092000}, {0x3c094000}, {0x3c096000}, 
-    {0x3c098000}, {0x3c09a000}, {0x3c09c000}, {0x3c09e000}, 
-    {0x3c0a0000}, {0x3c0a2000}, {0x3c0a4000}, {0x3c0a6000}, 
-    {0x3c0a8000}, {0x3c0aa000}, {0x3c0ac000}, {0x3c0ae000}, 
-    {0x3c0b0000}, {0x3c0b2000}, {0x3c0b4000}, {0x3c0b6000}, 
-    {0x3c0b8000}, {0x3c0ba000}, {0x3c0bc000}, {0x3c0be000}, 
-    {0x3c0c0000}, {0x3c0c2000}, {0x3c0c4000}, {0x3c0c6000}, 
-    {0x3c0c8000}, {0x3c0ca000}, {0x3c0cc000}, {0x3c0ce000}, 
-    {0x3c0d0000}, {0x3c0d2000}, {0x3c0d4000}, {0x3c0d6000}, 
-    {0x3c0d8000}, {0x3c0da000}, {0x3c0dc000}, {0x3c0de000}, 
-    {0x3c0e0000}, {0x3c0e2000}, {0x3c0e4000}, {0x3c0e6000}, 
-    {0x3c0e8000}, {0x3c0ea000}, {0x3c0ec000}, {0x3c0ee000}, 
-    {0x3c0f0000}, {0x3c0f2000}, {0x3c0f4000}, {0x3c0f6000}, 
-    {0x3c0f8000}, {0x3c0fa000}, {0x3c0fc000}, {0x3c0fe000}, 
-    {0x3c100000}, {0x3c102000}, {0x3c104000}, {0x3c106000}, 
-    {0x3c108000}, {0x3c10a000}, {0x3c10c000}, {0x3c10e000}, 
-    {0x3c110000}, {0x3c112000}, {0x3c114000}, {0x3c116000}, 
-    {0x3c118000}, {0x3c11a000}, {0x3c11c000}, {0x3c11e000}, 
-    {0x3c120000}, {0x3c122000}, {0x3c124000}, {0x3c126000}, 
-    {0x3c128000}, {0x3c12a000}, {0x3c12c000}, {0x3c12e000}, 
-    {0x3c130000}, {0x3c132000}, {0x3c134000}, {0x3c136000}, 
-    {0x3c138000}, {0x3c13a000}, {0x3c13c000}, {0x3c13e000}, 
-    {0x3c140000}, {0x3c142000}, {0x3c144000}, {0x3c146000}, 
-    {0x3c148000}, {0x3c14a000}, {0x3c14c000}, {0x3c14e000}, 
-    {0x3c150000}, {0x3c152000}, {0x3c154000}, {0x3c156000}, 
-    {0x3c158000}, {0x3c15a000}, {0x3c15c000}, {0x3c15e000}, 
-    {0x3c160000}, {0x3c162000}, {0x3c164000}, {0x3c166000}, 
-    {0x3c168000}, {0x3c16a000}, {0x3c16c000}, {0x3c16e000}, 
-    {0x3c170000}, {0x3c172000}, {0x3c174000}, {0x3c176000}, 
-    {0x3c178000}, {0x3c17a000}, {0x3c17c000}, {0x3c17e000}, 
-    {0x3c180000}, {0x3c182000}, {0x3c184000}, {0x3c186000}, 
-    {0x3c188000}, {0x3c18a000}, {0x3c18c000}, {0x3c18e000}, 
-    {0x3c190000}, {0x3c192000}, {0x3c194000}, {0x3c196000}, 
-    {0x3c198000}, {0x3c19a000}, {0x3c19c000}, {0x3c19e000}, 
-    {0x3c1a0000}, {0x3c1a2000}, {0x3c1a4000}, {0x3c1a6000}, 
-    {0x3c1a8000}, {0x3c1aa000}, {0x3c1ac000}, {0x3c1ae000}, 
-    {0x3c1b0000}, {0x3c1b2000}, {0x3c1b4000}, {0x3c1b6000}, 
-    {0x3c1b8000}, {0x3c1ba000}, {0x3c1bc000}, {0x3c1be000}, 
-    {0x3c1c0000}, {0x3c1c2000}, {0x3c1c4000}, {0x3c1c6000}, 
-    {0x3c1c8000}, {0x3c1ca000}, {0x3c1cc000}, {0x3c1ce000}, 
-    {0x3c1d0000}, {0x3c1d2000}, {0x3c1d4000}, {0x3c1d6000}, 
-    {0x3c1d8000}, {0x3c1da000}, {0x3c1dc000}, {0x3c1de000}, 
-    {0x3c1e0000}, {0x3c1e2000}, {0x3c1e4000}, {0x3c1e6000}, 
-    {0x3c1e8000}, {0x3c1ea000}, {0x3c1ec000}, {0x3c1ee000}, 
-    {0x3c1f0000}, {0x3c1f2000}, {0x3c1f4000}, {0x3c1f6000}, 
-    {0x3c1f8000}, {0x3c1fa000}, {0x3c1fc000}, {0x3c1fe000}, 
-    {0x3c200000}, {0x3c202000}, {0x3c204000}, {0x3c206000}, 
-    {0x3c208000}, {0x3c20a000}, {0x3c20c000}, {0x3c20e000}, 
-    {0x3c210000}, {0x3c212000}, {0x3c214000}, {0x3c216000}, 
-    {0x3c218000}, {0x3c21a000}, {0x3c21c000}, {0x3c21e000}, 
-    {0x3c220000}, {0x3c222000}, {0x3c224000}, {0x3c226000}, 
-    {0x3c228000}, {0x3c22a000}, {0x3c22c000}, {0x3c22e000}, 
-    {0x3c230000}, {0x3c232000}, {0x3c234000}, {0x3c236000}, 
-    {0x3c238000}, {0x3c23a000}, {0x3c23c000}, {0x3c23e000}, 
-    {0x3c240000}, {0x3c242000}, {0x3c244000}, {0x3c246000}, 
-    {0x3c248000}, {0x3c24a000}, {0x3c24c000}, {0x3c24e000}, 
-    {0x3c250000}, {0x3c252000}, {0x3c254000}, {0x3c256000}, 
-    {0x3c258000}, {0x3c25a000}, {0x3c25c000}, {0x3c25e000}, 
-    {0x3c260000}, {0x3c262000}, {0x3c264000}, {0x3c266000}, 
-    {0x3c268000}, {0x3c26a000}, {0x3c26c000}, {0x3c26e000}, 
-    {0x3c270000}, {0x3c272000}, {0x3c274000}, {0x3c276000}, 
-    {0x3c278000}, {0x3c27a000}, {0x3c27c000}, {0x3c27e000}, 
-    {0x3c280000}, {0x3c282000}, {0x3c284000}, {0x3c286000}, 
-    {0x3c288000}, {0x3c28a000}, {0x3c28c000}, {0x3c28e000}, 
-    {0x3c290000}, {0x3c292000}, {0x3c294000}, {0x3c296000}, 
-    {0x3c298000}, {0x3c29a000}, {0x3c29c000}, {0x3c29e000}, 
-    {0x3c2a0000}, {0x3c2a2000}, {0x3c2a4000}, {0x3c2a6000}, 
-    {0x3c2a8000}, {0x3c2aa000}, {0x3c2ac000}, {0x3c2ae000}, 
-    {0x3c2b0000}, {0x3c2b2000}, {0x3c2b4000}, {0x3c2b6000}, 
-    {0x3c2b8000}, {0x3c2ba000}, {0x3c2bc000}, {0x3c2be000}, 
-    {0x3c2c0000}, {0x3c2c2000}, {0x3c2c4000}, {0x3c2c6000}, 
-    {0x3c2c8000}, {0x3c2ca000}, {0x3c2cc000}, {0x3c2ce000}, 
-    {0x3c2d0000}, {0x3c2d2000}, {0x3c2d4000}, {0x3c2d6000}, 
-    {0x3c2d8000}, {0x3c2da000}, {0x3c2dc000}, {0x3c2de000}, 
-    {0x3c2e0000}, {0x3c2e2000}, {0x3c2e4000}, {0x3c2e6000}, 
-    {0x3c2e8000}, {0x3c2ea000}, {0x3c2ec000}, {0x3c2ee000}, 
-    {0x3c2f0000}, {0x3c2f2000}, {0x3c2f4000}, {0x3c2f6000}, 
-    {0x3c2f8000}, {0x3c2fa000}, {0x3c2fc000}, {0x3c2fe000}, 
-    {0x3c300000}, {0x3c302000}, {0x3c304000}, {0x3c306000}, 
-    {0x3c308000}, {0x3c30a000}, {0x3c30c000}, {0x3c30e000}, 
-    {0x3c310000}, {0x3c312000}, {0x3c314000}, {0x3c316000}, 
-    {0x3c318000}, {0x3c31a000}, {0x3c31c000}, {0x3c31e000}, 
-    {0x3c320000}, {0x3c322000}, {0x3c324000}, {0x3c326000}, 
-    {0x3c328000}, {0x3c32a000}, {0x3c32c000}, {0x3c32e000}, 
-    {0x3c330000}, {0x3c332000}, {0x3c334000}, {0x3c336000}, 
-    {0x3c338000}, {0x3c33a000}, {0x3c33c000}, {0x3c33e000}, 
-    {0x3c340000}, {0x3c342000}, {0x3c344000}, {0x3c346000}, 
-    {0x3c348000}, {0x3c34a000}, {0x3c34c000}, {0x3c34e000}, 
-    {0x3c350000}, {0x3c352000}, {0x3c354000}, {0x3c356000}, 
-    {0x3c358000}, {0x3c35a000}, {0x3c35c000}, {0x3c35e000}, 
-    {0x3c360000}, {0x3c362000}, {0x3c364000}, {0x3c366000}, 
-    {0x3c368000}, {0x3c36a000}, {0x3c36c000}, {0x3c36e000}, 
-    {0x3c370000}, {0x3c372000}, {0x3c374000}, {0x3c376000}, 
-    {0x3c378000}, {0x3c37a000}, {0x3c37c000}, {0x3c37e000}, 
-    {0x3c380000}, {0x3c382000}, {0x3c384000}, {0x3c386000}, 
-    {0x3c388000}, {0x3c38a000}, {0x3c38c000}, {0x3c38e000}, 
-    {0x3c390000}, {0x3c392000}, {0x3c394000}, {0x3c396000}, 
-    {0x3c398000}, {0x3c39a000}, {0x3c39c000}, {0x3c39e000}, 
-    {0x3c3a0000}, {0x3c3a2000}, {0x3c3a4000}, {0x3c3a6000}, 
-    {0x3c3a8000}, {0x3c3aa000}, {0x3c3ac000}, {0x3c3ae000}, 
-    {0x3c3b0000}, {0x3c3b2000}, {0x3c3b4000}, {0x3c3b6000}, 
-    {0x3c3b8000}, {0x3c3ba000}, {0x3c3bc000}, {0x3c3be000}, 
-    {0x3c3c0000}, {0x3c3c2000}, {0x3c3c4000}, {0x3c3c6000}, 
-    {0x3c3c8000}, {0x3c3ca000}, {0x3c3cc000}, {0x3c3ce000}, 
-    {0x3c3d0000}, {0x3c3d2000}, {0x3c3d4000}, {0x3c3d6000}, 
-    {0x3c3d8000}, {0x3c3da000}, {0x3c3dc000}, {0x3c3de000}, 
-    {0x3c3e0000}, {0x3c3e2000}, {0x3c3e4000}, {0x3c3e6000}, 
-    {0x3c3e8000}, {0x3c3ea000}, {0x3c3ec000}, {0x3c3ee000}, 
-    {0x3c3f0000}, {0x3c3f2000}, {0x3c3f4000}, {0x3c3f6000}, 
-    {0x3c3f8000}, {0x3c3fa000}, {0x3c3fc000}, {0x3c3fe000}, 
-    {0x3c400000}, {0x3c402000}, {0x3c404000}, {0x3c406000}, 
-    {0x3c408000}, {0x3c40a000}, {0x3c40c000}, {0x3c40e000}, 
-    {0x3c410000}, {0x3c412000}, {0x3c414000}, {0x3c416000}, 
-    {0x3c418000}, {0x3c41a000}, {0x3c41c000}, {0x3c41e000}, 
-    {0x3c420000}, {0x3c422000}, {0x3c424000}, {0x3c426000}, 
-    {0x3c428000}, {0x3c42a000}, {0x3c42c000}, {0x3c42e000}, 
-    {0x3c430000}, {0x3c432000}, {0x3c434000}, {0x3c436000}, 
-    {0x3c438000}, {0x3c43a000}, {0x3c43c000}, {0x3c43e000}, 
-    {0x3c440000}, {0x3c442000}, {0x3c444000}, {0x3c446000}, 
-    {0x3c448000}, {0x3c44a000}, {0x3c44c000}, {0x3c44e000}, 
-    {0x3c450000}, {0x3c452000}, {0x3c454000}, {0x3c456000}, 
-    {0x3c458000}, {0x3c45a000}, {0x3c45c000}, {0x3c45e000}, 
-    {0x3c460000}, {0x3c462000}, {0x3c464000}, {0x3c466000}, 
-    {0x3c468000}, {0x3c46a000}, {0x3c46c000}, {0x3c46e000}, 
-    {0x3c470000}, {0x3c472000}, {0x3c474000}, {0x3c476000}, 
-    {0x3c478000}, {0x3c47a000}, {0x3c47c000}, {0x3c47e000}, 
-    {0x3c480000}, {0x3c482000}, {0x3c484000}, {0x3c486000}, 
-    {0x3c488000}, {0x3c48a000}, {0x3c48c000}, {0x3c48e000}, 
-    {0x3c490000}, {0x3c492000}, {0x3c494000}, {0x3c496000}, 
-    {0x3c498000}, {0x3c49a000}, {0x3c49c000}, {0x3c49e000}, 
-    {0x3c4a0000}, {0x3c4a2000}, {0x3c4a4000}, {0x3c4a6000}, 
-    {0x3c4a8000}, {0x3c4aa000}, {0x3c4ac000}, {0x3c4ae000}, 
-    {0x3c4b0000}, {0x3c4b2000}, {0x3c4b4000}, {0x3c4b6000}, 
-    {0x3c4b8000}, {0x3c4ba000}, {0x3c4bc000}, {0x3c4be000}, 
-    {0x3c4c0000}, {0x3c4c2000}, {0x3c4c4000}, {0x3c4c6000}, 
-    {0x3c4c8000}, {0x3c4ca000}, {0x3c4cc000}, {0x3c4ce000}, 
-    {0x3c4d0000}, {0x3c4d2000}, {0x3c4d4000}, {0x3c4d6000}, 
-    {0x3c4d8000}, {0x3c4da000}, {0x3c4dc000}, {0x3c4de000}, 
-    {0x3c4e0000}, {0x3c4e2000}, {0x3c4e4000}, {0x3c4e6000}, 
-    {0x3c4e8000}, {0x3c4ea000}, {0x3c4ec000}, {0x3c4ee000}, 
-    {0x3c4f0000}, {0x3c4f2000}, {0x3c4f4000}, {0x3c4f6000}, 
-    {0x3c4f8000}, {0x3c4fa000}, {0x3c4fc000}, {0x3c4fe000}, 
-    {0x3c500000}, {0x3c502000}, {0x3c504000}, {0x3c506000}, 
-    {0x3c508000}, {0x3c50a000}, {0x3c50c000}, {0x3c50e000}, 
-    {0x3c510000}, {0x3c512000}, {0x3c514000}, {0x3c516000}, 
-    {0x3c518000}, {0x3c51a000}, {0x3c51c000}, {0x3c51e000}, 
-    {0x3c520000}, {0x3c522000}, {0x3c524000}, {0x3c526000}, 
-    {0x3c528000}, {0x3c52a000}, {0x3c52c000}, {0x3c52e000}, 
-    {0x3c530000}, {0x3c532000}, {0x3c534000}, {0x3c536000}, 
-    {0x3c538000}, {0x3c53a000}, {0x3c53c000}, {0x3c53e000}, 
-    {0x3c540000}, {0x3c542000}, {0x3c544000}, {0x3c546000}, 
-    {0x3c548000}, {0x3c54a000}, {0x3c54c000}, {0x3c54e000}, 
-    {0x3c550000}, {0x3c552000}, {0x3c554000}, {0x3c556000}, 
-    {0x3c558000}, {0x3c55a000}, {0x3c55c000}, {0x3c55e000}, 
-    {0x3c560000}, {0x3c562000}, {0x3c564000}, {0x3c566000}, 
-    {0x3c568000}, {0x3c56a000}, {0x3c56c000}, {0x3c56e000}, 
-    {0x3c570000}, {0x3c572000}, {0x3c574000}, {0x3c576000}, 
-    {0x3c578000}, {0x3c57a000}, {0x3c57c000}, {0x3c57e000}, 
-    {0x3c580000}, {0x3c582000}, {0x3c584000}, {0x3c586000}, 
-    {0x3c588000}, {0x3c58a000}, {0x3c58c000}, {0x3c58e000}, 
-    {0x3c590000}, {0x3c592000}, {0x3c594000}, {0x3c596000}, 
-    {0x3c598000}, {0x3c59a000}, {0x3c59c000}, {0x3c59e000}, 
-    {0x3c5a0000}, {0x3c5a2000}, {0x3c5a4000}, {0x3c5a6000}, 
-    {0x3c5a8000}, {0x3c5aa000}, {0x3c5ac000}, {0x3c5ae000}, 
-    {0x3c5b0000}, {0x3c5b2000}, {0x3c5b4000}, {0x3c5b6000}, 
-    {0x3c5b8000}, {0x3c5ba000}, {0x3c5bc000}, {0x3c5be000}, 
-    {0x3c5c0000}, {0x3c5c2000}, {0x3c5c4000}, {0x3c5c6000}, 
-    {0x3c5c8000}, {0x3c5ca000}, {0x3c5cc000}, {0x3c5ce000}, 
-    {0x3c5d0000}, {0x3c5d2000}, {0x3c5d4000}, {0x3c5d6000}, 
-    {0x3c5d8000}, {0x3c5da000}, {0x3c5dc000}, {0x3c5de000}, 
-    {0x3c5e0000}, {0x3c5e2000}, {0x3c5e4000}, {0x3c5e6000}, 
-    {0x3c5e8000}, {0x3c5ea000}, {0x3c5ec000}, {0x3c5ee000}, 
-    {0x3c5f0000}, {0x3c5f2000}, {0x3c5f4000}, {0x3c5f6000}, 
-    {0x3c5f8000}, {0x3c5fa000}, {0x3c5fc000}, {0x3c5fe000}, 
-    {0x3c600000}, {0x3c602000}, {0x3c604000}, {0x3c606000}, 
-    {0x3c608000}, {0x3c60a000}, {0x3c60c000}, {0x3c60e000}, 
-    {0x3c610000}, {0x3c612000}, {0x3c614000}, {0x3c616000}, 
-    {0x3c618000}, {0x3c61a000}, {0x3c61c000}, {0x3c61e000}, 
-    {0x3c620000}, {0x3c622000}, {0x3c624000}, {0x3c626000}, 
-    {0x3c628000}, {0x3c62a000}, {0x3c62c000}, {0x3c62e000}, 
-    {0x3c630000}, {0x3c632000}, {0x3c634000}, {0x3c636000}, 
-    {0x3c638000}, {0x3c63a000}, {0x3c63c000}, {0x3c63e000}, 
-    {0x3c640000}, {0x3c642000}, {0x3c644000}, {0x3c646000}, 
-    {0x3c648000}, {0x3c64a000}, {0x3c64c000}, {0x3c64e000}, 
-    {0x3c650000}, {0x3c652000}, {0x3c654000}, {0x3c656000}, 
-    {0x3c658000}, {0x3c65a000}, {0x3c65c000}, {0x3c65e000}, 
-    {0x3c660000}, {0x3c662000}, {0x3c664000}, {0x3c666000}, 
-    {0x3c668000}, {0x3c66a000}, {0x3c66c000}, {0x3c66e000}, 
-    {0x3c670000}, {0x3c672000}, {0x3c674000}, {0x3c676000}, 
-    {0x3c678000}, {0x3c67a000}, {0x3c67c000}, {0x3c67e000}, 
-    {0x3c680000}, {0x3c682000}, {0x3c684000}, {0x3c686000}, 
-    {0x3c688000}, {0x3c68a000}, {0x3c68c000}, {0x3c68e000}, 
-    {0x3c690000}, {0x3c692000}, {0x3c694000}, {0x3c696000}, 
-    {0x3c698000}, {0x3c69a000}, {0x3c69c000}, {0x3c69e000}, 
-    {0x3c6a0000}, {0x3c6a2000}, {0x3c6a4000}, {0x3c6a6000}, 
-    {0x3c6a8000}, {0x3c6aa000}, {0x3c6ac000}, {0x3c6ae000}, 
-    {0x3c6b0000}, {0x3c6b2000}, {0x3c6b4000}, {0x3c6b6000}, 
-    {0x3c6b8000}, {0x3c6ba000}, {0x3c6bc000}, {0x3c6be000}, 
-    {0x3c6c0000}, {0x3c6c2000}, {0x3c6c4000}, {0x3c6c6000}, 
-    {0x3c6c8000}, {0x3c6ca000}, {0x3c6cc000}, {0x3c6ce000}, 
-    {0x3c6d0000}, {0x3c6d2000}, {0x3c6d4000}, {0x3c6d6000}, 
-    {0x3c6d8000}, {0x3c6da000}, {0x3c6dc000}, {0x3c6de000}, 
-    {0x3c6e0000}, {0x3c6e2000}, {0x3c6e4000}, {0x3c6e6000}, 
-    {0x3c6e8000}, {0x3c6ea000}, {0x3c6ec000}, {0x3c6ee000}, 
-    {0x3c6f0000}, {0x3c6f2000}, {0x3c6f4000}, {0x3c6f6000}, 
-    {0x3c6f8000}, {0x3c6fa000}, {0x3c6fc000}, {0x3c6fe000}, 
-    {0x3c700000}, {0x3c702000}, {0x3c704000}, {0x3c706000}, 
-    {0x3c708000}, {0x3c70a000}, {0x3c70c000}, {0x3c70e000}, 
-    {0x3c710000}, {0x3c712000}, {0x3c714000}, {0x3c716000}, 
-    {0x3c718000}, {0x3c71a000}, {0x3c71c000}, {0x3c71e000}, 
-    {0x3c720000}, {0x3c722000}, {0x3c724000}, {0x3c726000}, 
-    {0x3c728000}, {0x3c72a000}, {0x3c72c000}, {0x3c72e000}, 
-    {0x3c730000}, {0x3c732000}, {0x3c734000}, {0x3c736000}, 
-    {0x3c738000}, {0x3c73a000}, {0x3c73c000}, {0x3c73e000}, 
-    {0x3c740000}, {0x3c742000}, {0x3c744000}, {0x3c746000}, 
-    {0x3c748000}, {0x3c74a000}, {0x3c74c000}, {0x3c74e000}, 
-    {0x3c750000}, {0x3c752000}, {0x3c754000}, {0x3c756000}, 
-    {0x3c758000}, {0x3c75a000}, {0x3c75c000}, {0x3c75e000}, 
-    {0x3c760000}, {0x3c762000}, {0x3c764000}, {0x3c766000}, 
-    {0x3c768000}, {0x3c76a000}, {0x3c76c000}, {0x3c76e000}, 
-    {0x3c770000}, {0x3c772000}, {0x3c774000}, {0x3c776000}, 
-    {0x3c778000}, {0x3c77a000}, {0x3c77c000}, {0x3c77e000}, 
-    {0x3c780000}, {0x3c782000}, {0x3c784000}, {0x3c786000}, 
-    {0x3c788000}, {0x3c78a000}, {0x3c78c000}, {0x3c78e000}, 
-    {0x3c790000}, {0x3c792000}, {0x3c794000}, {0x3c796000}, 
-    {0x3c798000}, {0x3c79a000}, {0x3c79c000}, {0x3c79e000}, 
-    {0x3c7a0000}, {0x3c7a2000}, {0x3c7a4000}, {0x3c7a6000}, 
-    {0x3c7a8000}, {0x3c7aa000}, {0x3c7ac000}, {0x3c7ae000}, 
-    {0x3c7b0000}, {0x3c7b2000}, {0x3c7b4000}, {0x3c7b6000}, 
-    {0x3c7b8000}, {0x3c7ba000}, {0x3c7bc000}, {0x3c7be000}, 
-    {0x3c7c0000}, {0x3c7c2000}, {0x3c7c4000}, {0x3c7c6000}, 
-    {0x3c7c8000}, {0x3c7ca000}, {0x3c7cc000}, {0x3c7ce000}, 
-    {0x3c7d0000}, {0x3c7d2000}, {0x3c7d4000}, {0x3c7d6000}, 
-    {0x3c7d8000}, {0x3c7da000}, {0x3c7dc000}, {0x3c7de000}, 
-    {0x3c7e0000}, {0x3c7e2000}, {0x3c7e4000}, {0x3c7e6000}, 
-    {0x3c7e8000}, {0x3c7ea000}, {0x3c7ec000}, {0x3c7ee000}, 
-    {0x3c7f0000}, {0x3c7f2000}, {0x3c7f4000}, {0x3c7f6000}, 
-    {0x3c7f8000}, {0x3c7fa000}, {0x3c7fc000}, {0x3c7fe000}, 
-    {0x3c800000}, {0x3c802000}, {0x3c804000}, {0x3c806000}, 
-    {0x3c808000}, {0x3c80a000}, {0x3c80c000}, {0x3c80e000}, 
-    {0x3c810000}, {0x3c812000}, {0x3c814000}, {0x3c816000}, 
-    {0x3c818000}, {0x3c81a000}, {0x3c81c000}, {0x3c81e000}, 
-    {0x3c820000}, {0x3c822000}, {0x3c824000}, {0x3c826000}, 
-    {0x3c828000}, {0x3c82a000}, {0x3c82c000}, {0x3c82e000}, 
-    {0x3c830000}, {0x3c832000}, {0x3c834000}, {0x3c836000}, 
-    {0x3c838000}, {0x3c83a000}, {0x3c83c000}, {0x3c83e000}, 
-    {0x3c840000}, {0x3c842000}, {0x3c844000}, {0x3c846000}, 
-    {0x3c848000}, {0x3c84a000}, {0x3c84c000}, {0x3c84e000}, 
-    {0x3c850000}, {0x3c852000}, {0x3c854000}, {0x3c856000}, 
-    {0x3c858000}, {0x3c85a000}, {0x3c85c000}, {0x3c85e000}, 
-    {0x3c860000}, {0x3c862000}, {0x3c864000}, {0x3c866000}, 
-    {0x3c868000}, {0x3c86a000}, {0x3c86c000}, {0x3c86e000}, 
-    {0x3c870000}, {0x3c872000}, {0x3c874000}, {0x3c876000}, 
-    {0x3c878000}, {0x3c87a000}, {0x3c87c000}, {0x3c87e000}, 
-    {0x3c880000}, {0x3c882000}, {0x3c884000}, {0x3c886000}, 
-    {0x3c888000}, {0x3c88a000}, {0x3c88c000}, {0x3c88e000}, 
-    {0x3c890000}, {0x3c892000}, {0x3c894000}, {0x3c896000}, 
-    {0x3c898000}, {0x3c89a000}, {0x3c89c000}, {0x3c89e000}, 
-    {0x3c8a0000}, {0x3c8a2000}, {0x3c8a4000}, {0x3c8a6000}, 
-    {0x3c8a8000}, {0x3c8aa000}, {0x3c8ac000}, {0x3c8ae000}, 
-    {0x3c8b0000}, {0x3c8b2000}, {0x3c8b4000}, {0x3c8b6000}, 
-    {0x3c8b8000}, {0x3c8ba000}, {0x3c8bc000}, {0x3c8be000}, 
-    {0x3c8c0000}, {0x3c8c2000}, {0x3c8c4000}, {0x3c8c6000}, 
-    {0x3c8c8000}, {0x3c8ca000}, {0x3c8cc000}, {0x3c8ce000}, 
-    {0x3c8d0000}, {0x3c8d2000}, {0x3c8d4000}, {0x3c8d6000}, 
-    {0x3c8d8000}, {0x3c8da000}, {0x3c8dc000}, {0x3c8de000}, 
-    {0x3c8e0000}, {0x3c8e2000}, {0x3c8e4000}, {0x3c8e6000}, 
-    {0x3c8e8000}, {0x3c8ea000}, {0x3c8ec000}, {0x3c8ee000}, 
-    {0x3c8f0000}, {0x3c8f2000}, {0x3c8f4000}, {0x3c8f6000}, 
-    {0x3c8f8000}, {0x3c8fa000}, {0x3c8fc000}, {0x3c8fe000}, 
-    {0x3c900000}, {0x3c902000}, {0x3c904000}, {0x3c906000}, 
-    {0x3c908000}, {0x3c90a000}, {0x3c90c000}, {0x3c90e000}, 
-    {0x3c910000}, {0x3c912000}, {0x3c914000}, {0x3c916000}, 
-    {0x3c918000}, {0x3c91a000}, {0x3c91c000}, {0x3c91e000}, 
-    {0x3c920000}, {0x3c922000}, {0x3c924000}, {0x3c926000}, 
-    {0x3c928000}, {0x3c92a000}, {0x3c92c000}, {0x3c92e000}, 
-    {0x3c930000}, {0x3c932000}, {0x3c934000}, {0x3c936000}, 
-    {0x3c938000}, {0x3c93a000}, {0x3c93c000}, {0x3c93e000}, 
-    {0x3c940000}, {0x3c942000}, {0x3c944000}, {0x3c946000}, 
-    {0x3c948000}, {0x3c94a000}, {0x3c94c000}, {0x3c94e000}, 
-    {0x3c950000}, {0x3c952000}, {0x3c954000}, {0x3c956000}, 
-    {0x3c958000}, {0x3c95a000}, {0x3c95c000}, {0x3c95e000}, 
-    {0x3c960000}, {0x3c962000}, {0x3c964000}, {0x3c966000}, 
-    {0x3c968000}, {0x3c96a000}, {0x3c96c000}, {0x3c96e000}, 
-    {0x3c970000}, {0x3c972000}, {0x3c974000}, {0x3c976000}, 
-    {0x3c978000}, {0x3c97a000}, {0x3c97c000}, {0x3c97e000}, 
-    {0x3c980000}, {0x3c982000}, {0x3c984000}, {0x3c986000}, 
-    {0x3c988000}, {0x3c98a000}, {0x3c98c000}, {0x3c98e000}, 
-    {0x3c990000}, {0x3c992000}, {0x3c994000}, {0x3c996000}, 
-    {0x3c998000}, {0x3c99a000}, {0x3c99c000}, {0x3c99e000}, 
-    {0x3c9a0000}, {0x3c9a2000}, {0x3c9a4000}, {0x3c9a6000}, 
-    {0x3c9a8000}, {0x3c9aa000}, {0x3c9ac000}, {0x3c9ae000}, 
-    {0x3c9b0000}, {0x3c9b2000}, {0x3c9b4000}, {0x3c9b6000}, 
-    {0x3c9b8000}, {0x3c9ba000}, {0x3c9bc000}, {0x3c9be000}, 
-    {0x3c9c0000}, {0x3c9c2000}, {0x3c9c4000}, {0x3c9c6000}, 
-    {0x3c9c8000}, {0x3c9ca000}, {0x3c9cc000}, {0x3c9ce000}, 
-    {0x3c9d0000}, {0x3c9d2000}, {0x3c9d4000}, {0x3c9d6000}, 
-    {0x3c9d8000}, {0x3c9da000}, {0x3c9dc000}, {0x3c9de000}, 
-    {0x3c9e0000}, {0x3c9e2000}, {0x3c9e4000}, {0x3c9e6000}, 
-    {0x3c9e8000}, {0x3c9ea000}, {0x3c9ec000}, {0x3c9ee000}, 
-    {0x3c9f0000}, {0x3c9f2000}, {0x3c9f4000}, {0x3c9f6000}, 
-    {0x3c9f8000}, {0x3c9fa000}, {0x3c9fc000}, {0x3c9fe000}, 
-    {0x3ca00000}, {0x3ca02000}, {0x3ca04000}, {0x3ca06000}, 
-    {0x3ca08000}, {0x3ca0a000}, {0x3ca0c000}, {0x3ca0e000}, 
-    {0x3ca10000}, {0x3ca12000}, {0x3ca14000}, {0x3ca16000}, 
-    {0x3ca18000}, {0x3ca1a000}, {0x3ca1c000}, {0x3ca1e000}, 
-    {0x3ca20000}, {0x3ca22000}, {0x3ca24000}, {0x3ca26000}, 
-    {0x3ca28000}, {0x3ca2a000}, {0x3ca2c000}, {0x3ca2e000}, 
-    {0x3ca30000}, {0x3ca32000}, {0x3ca34000}, {0x3ca36000}, 
-    {0x3ca38000}, {0x3ca3a000}, {0x3ca3c000}, {0x3ca3e000}, 
-    {0x3ca40000}, {0x3ca42000}, {0x3ca44000}, {0x3ca46000}, 
-    {0x3ca48000}, {0x3ca4a000}, {0x3ca4c000}, {0x3ca4e000}, 
-    {0x3ca50000}, {0x3ca52000}, {0x3ca54000}, {0x3ca56000}, 
-    {0x3ca58000}, {0x3ca5a000}, {0x3ca5c000}, {0x3ca5e000}, 
-    {0x3ca60000}, {0x3ca62000}, {0x3ca64000}, {0x3ca66000}, 
-    {0x3ca68000}, {0x3ca6a000}, {0x3ca6c000}, {0x3ca6e000}, 
-    {0x3ca70000}, {0x3ca72000}, {0x3ca74000}, {0x3ca76000}, 
-    {0x3ca78000}, {0x3ca7a000}, {0x3ca7c000}, {0x3ca7e000}, 
-    {0x3ca80000}, {0x3ca82000}, {0x3ca84000}, {0x3ca86000}, 
-    {0x3ca88000}, {0x3ca8a000}, {0x3ca8c000}, {0x3ca8e000}, 
-    {0x3ca90000}, {0x3ca92000}, {0x3ca94000}, {0x3ca96000}, 
-    {0x3ca98000}, {0x3ca9a000}, {0x3ca9c000}, {0x3ca9e000}, 
-    {0x3caa0000}, {0x3caa2000}, {0x3caa4000}, {0x3caa6000}, 
-    {0x3caa8000}, {0x3caaa000}, {0x3caac000}, {0x3caae000}, 
-    {0x3cab0000}, {0x3cab2000}, {0x3cab4000}, {0x3cab6000}, 
-    {0x3cab8000}, {0x3caba000}, {0x3cabc000}, {0x3cabe000}, 
-    {0x3cac0000}, {0x3cac2000}, {0x3cac4000}, {0x3cac6000}, 
-    {0x3cac8000}, {0x3caca000}, {0x3cacc000}, {0x3cace000}, 
-    {0x3cad0000}, {0x3cad2000}, {0x3cad4000}, {0x3cad6000}, 
-    {0x3cad8000}, {0x3cada000}, {0x3cadc000}, {0x3cade000}, 
-    {0x3cae0000}, {0x3cae2000}, {0x3cae4000}, {0x3cae6000}, 
-    {0x3cae8000}, {0x3caea000}, {0x3caec000}, {0x3caee000}, 
-    {0x3caf0000}, {0x3caf2000}, {0x3caf4000}, {0x3caf6000}, 
-    {0x3caf8000}, {0x3cafa000}, {0x3cafc000}, {0x3cafe000}, 
-    {0x3cb00000}, {0x3cb02000}, {0x3cb04000}, {0x3cb06000}, 
-    {0x3cb08000}, {0x3cb0a000}, {0x3cb0c000}, {0x3cb0e000}, 
-    {0x3cb10000}, {0x3cb12000}, {0x3cb14000}, {0x3cb16000}, 
-    {0x3cb18000}, {0x3cb1a000}, {0x3cb1c000}, {0x3cb1e000}, 
-    {0x3cb20000}, {0x3cb22000}, {0x3cb24000}, {0x3cb26000}, 
-    {0x3cb28000}, {0x3cb2a000}, {0x3cb2c000}, {0x3cb2e000}, 
-    {0x3cb30000}, {0x3cb32000}, {0x3cb34000}, {0x3cb36000}, 
-    {0x3cb38000}, {0x3cb3a000}, {0x3cb3c000}, {0x3cb3e000}, 
-    {0x3cb40000}, {0x3cb42000}, {0x3cb44000}, {0x3cb46000}, 
-    {0x3cb48000}, {0x3cb4a000}, {0x3cb4c000}, {0x3cb4e000}, 
-    {0x3cb50000}, {0x3cb52000}, {0x3cb54000}, {0x3cb56000}, 
-    {0x3cb58000}, {0x3cb5a000}, {0x3cb5c000}, {0x3cb5e000}, 
-    {0x3cb60000}, {0x3cb62000}, {0x3cb64000}, {0x3cb66000}, 
-    {0x3cb68000}, {0x3cb6a000}, {0x3cb6c000}, {0x3cb6e000}, 
-    {0x3cb70000}, {0x3cb72000}, {0x3cb74000}, {0x3cb76000}, 
-    {0x3cb78000}, {0x3cb7a000}, {0x3cb7c000}, {0x3cb7e000}, 
-    {0x3cb80000}, {0x3cb82000}, {0x3cb84000}, {0x3cb86000}, 
-    {0x3cb88000}, {0x3cb8a000}, {0x3cb8c000}, {0x3cb8e000}, 
-    {0x3cb90000}, {0x3cb92000}, {0x3cb94000}, {0x3cb96000}, 
-    {0x3cb98000}, {0x3cb9a000}, {0x3cb9c000}, {0x3cb9e000}, 
-    {0x3cba0000}, {0x3cba2000}, {0x3cba4000}, {0x3cba6000}, 
-    {0x3cba8000}, {0x3cbaa000}, {0x3cbac000}, {0x3cbae000}, 
-    {0x3cbb0000}, {0x3cbb2000}, {0x3cbb4000}, {0x3cbb6000}, 
-    {0x3cbb8000}, {0x3cbba000}, {0x3cbbc000}, {0x3cbbe000}, 
-    {0x3cbc0000}, {0x3cbc2000}, {0x3cbc4000}, {0x3cbc6000}, 
-    {0x3cbc8000}, {0x3cbca000}, {0x3cbcc000}, {0x3cbce000}, 
-    {0x3cbd0000}, {0x3cbd2000}, {0x3cbd4000}, {0x3cbd6000}, 
-    {0x3cbd8000}, {0x3cbda000}, {0x3cbdc000}, {0x3cbde000}, 
-    {0x3cbe0000}, {0x3cbe2000}, {0x3cbe4000}, {0x3cbe6000}, 
-    {0x3cbe8000}, {0x3cbea000}, {0x3cbec000}, {0x3cbee000}, 
-    {0x3cbf0000}, {0x3cbf2000}, {0x3cbf4000}, {0x3cbf6000}, 
-    {0x3cbf8000}, {0x3cbfa000}, {0x3cbfc000}, {0x3cbfe000}, 
-    {0x3cc00000}, {0x3cc02000}, {0x3cc04000}, {0x3cc06000}, 
-    {0x3cc08000}, {0x3cc0a000}, {0x3cc0c000}, {0x3cc0e000}, 
-    {0x3cc10000}, {0x3cc12000}, {0x3cc14000}, {0x3cc16000}, 
-    {0x3cc18000}, {0x3cc1a000}, {0x3cc1c000}, {0x3cc1e000}, 
-    {0x3cc20000}, {0x3cc22000}, {0x3cc24000}, {0x3cc26000}, 
-    {0x3cc28000}, {0x3cc2a000}, {0x3cc2c000}, {0x3cc2e000}, 
-    {0x3cc30000}, {0x3cc32000}, {0x3cc34000}, {0x3cc36000}, 
-    {0x3cc38000}, {0x3cc3a000}, {0x3cc3c000}, {0x3cc3e000}, 
-    {0x3cc40000}, {0x3cc42000}, {0x3cc44000}, {0x3cc46000}, 
-    {0x3cc48000}, {0x3cc4a000}, {0x3cc4c000}, {0x3cc4e000}, 
-    {0x3cc50000}, {0x3cc52000}, {0x3cc54000}, {0x3cc56000}, 
-    {0x3cc58000}, {0x3cc5a000}, {0x3cc5c000}, {0x3cc5e000}, 
-    {0x3cc60000}, {0x3cc62000}, {0x3cc64000}, {0x3cc66000}, 
-    {0x3cc68000}, {0x3cc6a000}, {0x3cc6c000}, {0x3cc6e000}, 
-    {0x3cc70000}, {0x3cc72000}, {0x3cc74000}, {0x3cc76000}, 
-    {0x3cc78000}, {0x3cc7a000}, {0x3cc7c000}, {0x3cc7e000}, 
-    {0x3cc80000}, {0x3cc82000}, {0x3cc84000}, {0x3cc86000}, 
-    {0x3cc88000}, {0x3cc8a000}, {0x3cc8c000}, {0x3cc8e000}, 
-    {0x3cc90000}, {0x3cc92000}, {0x3cc94000}, {0x3cc96000}, 
-    {0x3cc98000}, {0x3cc9a000}, {0x3cc9c000}, {0x3cc9e000}, 
-    {0x3cca0000}, {0x3cca2000}, {0x3cca4000}, {0x3cca6000}, 
-    {0x3cca8000}, {0x3ccaa000}, {0x3ccac000}, {0x3ccae000}, 
-    {0x3ccb0000}, {0x3ccb2000}, {0x3ccb4000}, {0x3ccb6000}, 
-    {0x3ccb8000}, {0x3ccba000}, {0x3ccbc000}, {0x3ccbe000}, 
-    {0x3ccc0000}, {0x3ccc2000}, {0x3ccc4000}, {0x3ccc6000}, 
-    {0x3ccc8000}, {0x3ccca000}, {0x3cccc000}, {0x3ccce000}, 
-    {0x3ccd0000}, {0x3ccd2000}, {0x3ccd4000}, {0x3ccd6000}, 
-    {0x3ccd8000}, {0x3ccda000}, {0x3ccdc000}, {0x3ccde000}, 
-    {0x3cce0000}, {0x3cce2000}, {0x3cce4000}, {0x3cce6000}, 
-    {0x3cce8000}, {0x3ccea000}, {0x3ccec000}, {0x3ccee000}, 
-    {0x3ccf0000}, {0x3ccf2000}, {0x3ccf4000}, {0x3ccf6000}, 
-    {0x3ccf8000}, {0x3ccfa000}, {0x3ccfc000}, {0x3ccfe000}, 
-    {0x3cd00000}, {0x3cd02000}, {0x3cd04000}, {0x3cd06000}, 
-    {0x3cd08000}, {0x3cd0a000}, {0x3cd0c000}, {0x3cd0e000}, 
-    {0x3cd10000}, {0x3cd12000}, {0x3cd14000}, {0x3cd16000}, 
-    {0x3cd18000}, {0x3cd1a000}, {0x3cd1c000}, {0x3cd1e000}, 
-    {0x3cd20000}, {0x3cd22000}, {0x3cd24000}, {0x3cd26000}, 
-    {0x3cd28000}, {0x3cd2a000}, {0x3cd2c000}, {0x3cd2e000}, 
-    {0x3cd30000}, {0x3cd32000}, {0x3cd34000}, {0x3cd36000}, 
-    {0x3cd38000}, {0x3cd3a000}, {0x3cd3c000}, {0x3cd3e000}, 
-    {0x3cd40000}, {0x3cd42000}, {0x3cd44000}, {0x3cd46000}, 
-    {0x3cd48000}, {0x3cd4a000}, {0x3cd4c000}, {0x3cd4e000}, 
-    {0x3cd50000}, {0x3cd52000}, {0x3cd54000}, {0x3cd56000}, 
-    {0x3cd58000}, {0x3cd5a000}, {0x3cd5c000}, {0x3cd5e000}, 
-    {0x3cd60000}, {0x3cd62000}, {0x3cd64000}, {0x3cd66000}, 
-    {0x3cd68000}, {0x3cd6a000}, {0x3cd6c000}, {0x3cd6e000}, 
-    {0x3cd70000}, {0x3cd72000}, {0x3cd74000}, {0x3cd76000}, 
-    {0x3cd78000}, {0x3cd7a000}, {0x3cd7c000}, {0x3cd7e000}, 
-    {0x3cd80000}, {0x3cd82000}, {0x3cd84000}, {0x3cd86000}, 
-    {0x3cd88000}, {0x3cd8a000}, {0x3cd8c000}, {0x3cd8e000}, 
-    {0x3cd90000}, {0x3cd92000}, {0x3cd94000}, {0x3cd96000}, 
-    {0x3cd98000}, {0x3cd9a000}, {0x3cd9c000}, {0x3cd9e000}, 
-    {0x3cda0000}, {0x3cda2000}, {0x3cda4000}, {0x3cda6000}, 
-    {0x3cda8000}, {0x3cdaa000}, {0x3cdac000}, {0x3cdae000}, 
-    {0x3cdb0000}, {0x3cdb2000}, {0x3cdb4000}, {0x3cdb6000}, 
-    {0x3cdb8000}, {0x3cdba000}, {0x3cdbc000}, {0x3cdbe000}, 
-    {0x3cdc0000}, {0x3cdc2000}, {0x3cdc4000}, {0x3cdc6000}, 
-    {0x3cdc8000}, {0x3cdca000}, {0x3cdcc000}, {0x3cdce000}, 
-    {0x3cdd0000}, {0x3cdd2000}, {0x3cdd4000}, {0x3cdd6000}, 
-    {0x3cdd8000}, {0x3cdda000}, {0x3cddc000}, {0x3cdde000}, 
-    {0x3cde0000}, {0x3cde2000}, {0x3cde4000}, {0x3cde6000}, 
-    {0x3cde8000}, {0x3cdea000}, {0x3cdec000}, {0x3cdee000}, 
-    {0x3cdf0000}, {0x3cdf2000}, {0x3cdf4000}, {0x3cdf6000}, 
-    {0x3cdf8000}, {0x3cdfa000}, {0x3cdfc000}, {0x3cdfe000}, 
-    {0x3ce00000}, {0x3ce02000}, {0x3ce04000}, {0x3ce06000}, 
-    {0x3ce08000}, {0x3ce0a000}, {0x3ce0c000}, {0x3ce0e000}, 
-    {0x3ce10000}, {0x3ce12000}, {0x3ce14000}, {0x3ce16000}, 
-    {0x3ce18000}, {0x3ce1a000}, {0x3ce1c000}, {0x3ce1e000}, 
-    {0x3ce20000}, {0x3ce22000}, {0x3ce24000}, {0x3ce26000}, 
-    {0x3ce28000}, {0x3ce2a000}, {0x3ce2c000}, {0x3ce2e000}, 
-    {0x3ce30000}, {0x3ce32000}, {0x3ce34000}, {0x3ce36000}, 
-    {0x3ce38000}, {0x3ce3a000}, {0x3ce3c000}, {0x3ce3e000}, 
-    {0x3ce40000}, {0x3ce42000}, {0x3ce44000}, {0x3ce46000}, 
-    {0x3ce48000}, {0x3ce4a000}, {0x3ce4c000}, {0x3ce4e000}, 
-    {0x3ce50000}, {0x3ce52000}, {0x3ce54000}, {0x3ce56000}, 
-    {0x3ce58000}, {0x3ce5a000}, {0x3ce5c000}, {0x3ce5e000}, 
-    {0x3ce60000}, {0x3ce62000}, {0x3ce64000}, {0x3ce66000}, 
-    {0x3ce68000}, {0x3ce6a000}, {0x3ce6c000}, {0x3ce6e000}, 
-    {0x3ce70000}, {0x3ce72000}, {0x3ce74000}, {0x3ce76000}, 
-    {0x3ce78000}, {0x3ce7a000}, {0x3ce7c000}, {0x3ce7e000}, 
-    {0x3ce80000}, {0x3ce82000}, {0x3ce84000}, {0x3ce86000}, 
-    {0x3ce88000}, {0x3ce8a000}, {0x3ce8c000}, {0x3ce8e000}, 
-    {0x3ce90000}, {0x3ce92000}, {0x3ce94000}, {0x3ce96000}, 
-    {0x3ce98000}, {0x3ce9a000}, {0x3ce9c000}, {0x3ce9e000}, 
-    {0x3cea0000}, {0x3cea2000}, {0x3cea4000}, {0x3cea6000}, 
-    {0x3cea8000}, {0x3ceaa000}, {0x3ceac000}, {0x3ceae000}, 
-    {0x3ceb0000}, {0x3ceb2000}, {0x3ceb4000}, {0x3ceb6000}, 
-    {0x3ceb8000}, {0x3ceba000}, {0x3cebc000}, {0x3cebe000}, 
-    {0x3cec0000}, {0x3cec2000}, {0x3cec4000}, {0x3cec6000}, 
-    {0x3cec8000}, {0x3ceca000}, {0x3cecc000}, {0x3cece000}, 
-    {0x3ced0000}, {0x3ced2000}, {0x3ced4000}, {0x3ced6000}, 
-    {0x3ced8000}, {0x3ceda000}, {0x3cedc000}, {0x3cede000}, 
-    {0x3cee0000}, {0x3cee2000}, {0x3cee4000}, {0x3cee6000}, 
-    {0x3cee8000}, {0x3ceea000}, {0x3ceec000}, {0x3ceee000}, 
-    {0x3cef0000}, {0x3cef2000}, {0x3cef4000}, {0x3cef6000}, 
-    {0x3cef8000}, {0x3cefa000}, {0x3cefc000}, {0x3cefe000}, 
-    {0x3cf00000}, {0x3cf02000}, {0x3cf04000}, {0x3cf06000}, 
-    {0x3cf08000}, {0x3cf0a000}, {0x3cf0c000}, {0x3cf0e000}, 
-    {0x3cf10000}, {0x3cf12000}, {0x3cf14000}, {0x3cf16000}, 
-    {0x3cf18000}, {0x3cf1a000}, {0x3cf1c000}, {0x3cf1e000}, 
-    {0x3cf20000}, {0x3cf22000}, {0x3cf24000}, {0x3cf26000}, 
-    {0x3cf28000}, {0x3cf2a000}, {0x3cf2c000}, {0x3cf2e000}, 
-    {0x3cf30000}, {0x3cf32000}, {0x3cf34000}, {0x3cf36000}, 
-    {0x3cf38000}, {0x3cf3a000}, {0x3cf3c000}, {0x3cf3e000}, 
-    {0x3cf40000}, {0x3cf42000}, {0x3cf44000}, {0x3cf46000}, 
-    {0x3cf48000}, {0x3cf4a000}, {0x3cf4c000}, {0x3cf4e000}, 
-    {0x3cf50000}, {0x3cf52000}, {0x3cf54000}, {0x3cf56000}, 
-    {0x3cf58000}, {0x3cf5a000}, {0x3cf5c000}, {0x3cf5e000}, 
-    {0x3cf60000}, {0x3cf62000}, {0x3cf64000}, {0x3cf66000}, 
-    {0x3cf68000}, {0x3cf6a000}, {0x3cf6c000}, {0x3cf6e000}, 
-    {0x3cf70000}, {0x3cf72000}, {0x3cf74000}, {0x3cf76000}, 
-    {0x3cf78000}, {0x3cf7a000}, {0x3cf7c000}, {0x3cf7e000}, 
-    {0x3cf80000}, {0x3cf82000}, {0x3cf84000}, {0x3cf86000}, 
-    {0x3cf88000}, {0x3cf8a000}, {0x3cf8c000}, {0x3cf8e000}, 
-    {0x3cf90000}, {0x3cf92000}, {0x3cf94000}, {0x3cf96000}, 
-    {0x3cf98000}, {0x3cf9a000}, {0x3cf9c000}, {0x3cf9e000}, 
-    {0x3cfa0000}, {0x3cfa2000}, {0x3cfa4000}, {0x3cfa6000}, 
-    {0x3cfa8000}, {0x3cfaa000}, {0x3cfac000}, {0x3cfae000}, 
-    {0x3cfb0000}, {0x3cfb2000}, {0x3cfb4000}, {0x3cfb6000}, 
-    {0x3cfb8000}, {0x3cfba000}, {0x3cfbc000}, {0x3cfbe000}, 
-    {0x3cfc0000}, {0x3cfc2000}, {0x3cfc4000}, {0x3cfc6000}, 
-    {0x3cfc8000}, {0x3cfca000}, {0x3cfcc000}, {0x3cfce000}, 
-    {0x3cfd0000}, {0x3cfd2000}, {0x3cfd4000}, {0x3cfd6000}, 
-    {0x3cfd8000}, {0x3cfda000}, {0x3cfdc000}, {0x3cfde000}, 
-    {0x3cfe0000}, {0x3cfe2000}, {0x3cfe4000}, {0x3cfe6000}, 
-    {0x3cfe8000}, {0x3cfea000}, {0x3cfec000}, {0x3cfee000}, 
-    {0x3cff0000}, {0x3cff2000}, {0x3cff4000}, {0x3cff6000}, 
-    {0x3cff8000}, {0x3cffa000}, {0x3cffc000}, {0x3cffe000}, 
-    {0x3d000000}, {0x3d002000}, {0x3d004000}, {0x3d006000}, 
-    {0x3d008000}, {0x3d00a000}, {0x3d00c000}, {0x3d00e000}, 
-    {0x3d010000}, {0x3d012000}, {0x3d014000}, {0x3d016000}, 
-    {0x3d018000}, {0x3d01a000}, {0x3d01c000}, {0x3d01e000}, 
-    {0x3d020000}, {0x3d022000}, {0x3d024000}, {0x3d026000}, 
-    {0x3d028000}, {0x3d02a000}, {0x3d02c000}, {0x3d02e000}, 
-    {0x3d030000}, {0x3d032000}, {0x3d034000}, {0x3d036000}, 
-    {0x3d038000}, {0x3d03a000}, {0x3d03c000}, {0x3d03e000}, 
-    {0x3d040000}, {0x3d042000}, {0x3d044000}, {0x3d046000}, 
-    {0x3d048000}, {0x3d04a000}, {0x3d04c000}, {0x3d04e000}, 
-    {0x3d050000}, {0x3d052000}, {0x3d054000}, {0x3d056000}, 
-    {0x3d058000}, {0x3d05a000}, {0x3d05c000}, {0x3d05e000}, 
-    {0x3d060000}, {0x3d062000}, {0x3d064000}, {0x3d066000}, 
-    {0x3d068000}, {0x3d06a000}, {0x3d06c000}, {0x3d06e000}, 
-    {0x3d070000}, {0x3d072000}, {0x3d074000}, {0x3d076000}, 
-    {0x3d078000}, {0x3d07a000}, {0x3d07c000}, {0x3d07e000}, 
-    {0x3d080000}, {0x3d082000}, {0x3d084000}, {0x3d086000}, 
-    {0x3d088000}, {0x3d08a000}, {0x3d08c000}, {0x3d08e000}, 
-    {0x3d090000}, {0x3d092000}, {0x3d094000}, {0x3d096000}, 
-    {0x3d098000}, {0x3d09a000}, {0x3d09c000}, {0x3d09e000}, 
-    {0x3d0a0000}, {0x3d0a2000}, {0x3d0a4000}, {0x3d0a6000}, 
-    {0x3d0a8000}, {0x3d0aa000}, {0x3d0ac000}, {0x3d0ae000}, 
-    {0x3d0b0000}, {0x3d0b2000}, {0x3d0b4000}, {0x3d0b6000}, 
-    {0x3d0b8000}, {0x3d0ba000}, {0x3d0bc000}, {0x3d0be000}, 
-    {0x3d0c0000}, {0x3d0c2000}, {0x3d0c4000}, {0x3d0c6000}, 
-    {0x3d0c8000}, {0x3d0ca000}, {0x3d0cc000}, {0x3d0ce000}, 
-    {0x3d0d0000}, {0x3d0d2000}, {0x3d0d4000}, {0x3d0d6000}, 
-    {0x3d0d8000}, {0x3d0da000}, {0x3d0dc000}, {0x3d0de000}, 
-    {0x3d0e0000}, {0x3d0e2000}, {0x3d0e4000}, {0x3d0e6000}, 
-    {0x3d0e8000}, {0x3d0ea000}, {0x3d0ec000}, {0x3d0ee000}, 
-    {0x3d0f0000}, {0x3d0f2000}, {0x3d0f4000}, {0x3d0f6000}, 
-    {0x3d0f8000}, {0x3d0fa000}, {0x3d0fc000}, {0x3d0fe000}, 
-    {0x3d100000}, {0x3d102000}, {0x3d104000}, {0x3d106000}, 
-    {0x3d108000}, {0x3d10a000}, {0x3d10c000}, {0x3d10e000}, 
-    {0x3d110000}, {0x3d112000}, {0x3d114000}, {0x3d116000}, 
-    {0x3d118000}, {0x3d11a000}, {0x3d11c000}, {0x3d11e000}, 
-    {0x3d120000}, {0x3d122000}, {0x3d124000}, {0x3d126000}, 
-    {0x3d128000}, {0x3d12a000}, {0x3d12c000}, {0x3d12e000}, 
-    {0x3d130000}, {0x3d132000}, {0x3d134000}, {0x3d136000}, 
-    {0x3d138000}, {0x3d13a000}, {0x3d13c000}, {0x3d13e000}, 
-    {0x3d140000}, {0x3d142000}, {0x3d144000}, {0x3d146000}, 
-    {0x3d148000}, {0x3d14a000}, {0x3d14c000}, {0x3d14e000}, 
-    {0x3d150000}, {0x3d152000}, {0x3d154000}, {0x3d156000}, 
-    {0x3d158000}, {0x3d15a000}, {0x3d15c000}, {0x3d15e000}, 
-    {0x3d160000}, {0x3d162000}, {0x3d164000}, {0x3d166000}, 
-    {0x3d168000}, {0x3d16a000}, {0x3d16c000}, {0x3d16e000}, 
-    {0x3d170000}, {0x3d172000}, {0x3d174000}, {0x3d176000}, 
-    {0x3d178000}, {0x3d17a000}, {0x3d17c000}, {0x3d17e000}, 
-    {0x3d180000}, {0x3d182000}, {0x3d184000}, {0x3d186000}, 
-    {0x3d188000}, {0x3d18a000}, {0x3d18c000}, {0x3d18e000}, 
-    {0x3d190000}, {0x3d192000}, {0x3d194000}, {0x3d196000}, 
-    {0x3d198000}, {0x3d19a000}, {0x3d19c000}, {0x3d19e000}, 
-    {0x3d1a0000}, {0x3d1a2000}, {0x3d1a4000}, {0x3d1a6000}, 
-    {0x3d1a8000}, {0x3d1aa000}, {0x3d1ac000}, {0x3d1ae000}, 
-    {0x3d1b0000}, {0x3d1b2000}, {0x3d1b4000}, {0x3d1b6000}, 
-    {0x3d1b8000}, {0x3d1ba000}, {0x3d1bc000}, {0x3d1be000}, 
-    {0x3d1c0000}, {0x3d1c2000}, {0x3d1c4000}, {0x3d1c6000}, 
-    {0x3d1c8000}, {0x3d1ca000}, {0x3d1cc000}, {0x3d1ce000}, 
-    {0x3d1d0000}, {0x3d1d2000}, {0x3d1d4000}, {0x3d1d6000}, 
-    {0x3d1d8000}, {0x3d1da000}, {0x3d1dc000}, {0x3d1de000}, 
-    {0x3d1e0000}, {0x3d1e2000}, {0x3d1e4000}, {0x3d1e6000}, 
-    {0x3d1e8000}, {0x3d1ea000}, {0x3d1ec000}, {0x3d1ee000}, 
-    {0x3d1f0000}, {0x3d1f2000}, {0x3d1f4000}, {0x3d1f6000}, 
-    {0x3d1f8000}, {0x3d1fa000}, {0x3d1fc000}, {0x3d1fe000}, 
-    {0x3d200000}, {0x3d202000}, {0x3d204000}, {0x3d206000}, 
-    {0x3d208000}, {0x3d20a000}, {0x3d20c000}, {0x3d20e000}, 
-    {0x3d210000}, {0x3d212000}, {0x3d214000}, {0x3d216000}, 
-    {0x3d218000}, {0x3d21a000}, {0x3d21c000}, {0x3d21e000}, 
-    {0x3d220000}, {0x3d222000}, {0x3d224000}, {0x3d226000}, 
-    {0x3d228000}, {0x3d22a000}, {0x3d22c000}, {0x3d22e000}, 
-    {0x3d230000}, {0x3d232000}, {0x3d234000}, {0x3d236000}, 
-    {0x3d238000}, {0x3d23a000}, {0x3d23c000}, {0x3d23e000}, 
-    {0x3d240000}, {0x3d242000}, {0x3d244000}, {0x3d246000}, 
-    {0x3d248000}, {0x3d24a000}, {0x3d24c000}, {0x3d24e000}, 
-    {0x3d250000}, {0x3d252000}, {0x3d254000}, {0x3d256000}, 
-    {0x3d258000}, {0x3d25a000}, {0x3d25c000}, {0x3d25e000}, 
-    {0x3d260000}, {0x3d262000}, {0x3d264000}, {0x3d266000}, 
-    {0x3d268000}, {0x3d26a000}, {0x3d26c000}, {0x3d26e000}, 
-    {0x3d270000}, {0x3d272000}, {0x3d274000}, {0x3d276000}, 
-    {0x3d278000}, {0x3d27a000}, {0x3d27c000}, {0x3d27e000}, 
-    {0x3d280000}, {0x3d282000}, {0x3d284000}, {0x3d286000}, 
-    {0x3d288000}, {0x3d28a000}, {0x3d28c000}, {0x3d28e000}, 
-    {0x3d290000}, {0x3d292000}, {0x3d294000}, {0x3d296000}, 
-    {0x3d298000}, {0x3d29a000}, {0x3d29c000}, {0x3d29e000}, 
-    {0x3d2a0000}, {0x3d2a2000}, {0x3d2a4000}, {0x3d2a6000}, 
-    {0x3d2a8000}, {0x3d2aa000}, {0x3d2ac000}, {0x3d2ae000}, 
-    {0x3d2b0000}, {0x3d2b2000}, {0x3d2b4000}, {0x3d2b6000}, 
-    {0x3d2b8000}, {0x3d2ba000}, {0x3d2bc000}, {0x3d2be000}, 
-    {0x3d2c0000}, {0x3d2c2000}, {0x3d2c4000}, {0x3d2c6000}, 
-    {0x3d2c8000}, {0x3d2ca000}, {0x3d2cc000}, {0x3d2ce000}, 
-    {0x3d2d0000}, {0x3d2d2000}, {0x3d2d4000}, {0x3d2d6000}, 
-    {0x3d2d8000}, {0x3d2da000}, {0x3d2dc000}, {0x3d2de000}, 
-    {0x3d2e0000}, {0x3d2e2000}, {0x3d2e4000}, {0x3d2e6000}, 
-    {0x3d2e8000}, {0x3d2ea000}, {0x3d2ec000}, {0x3d2ee000}, 
-    {0x3d2f0000}, {0x3d2f2000}, {0x3d2f4000}, {0x3d2f6000}, 
-    {0x3d2f8000}, {0x3d2fa000}, {0x3d2fc000}, {0x3d2fe000}, 
-    {0x3d300000}, {0x3d302000}, {0x3d304000}, {0x3d306000}, 
-    {0x3d308000}, {0x3d30a000}, {0x3d30c000}, {0x3d30e000}, 
-    {0x3d310000}, {0x3d312000}, {0x3d314000}, {0x3d316000}, 
-    {0x3d318000}, {0x3d31a000}, {0x3d31c000}, {0x3d31e000}, 
-    {0x3d320000}, {0x3d322000}, {0x3d324000}, {0x3d326000}, 
-    {0x3d328000}, {0x3d32a000}, {0x3d32c000}, {0x3d32e000}, 
-    {0x3d330000}, {0x3d332000}, {0x3d334000}, {0x3d336000}, 
-    {0x3d338000}, {0x3d33a000}, {0x3d33c000}, {0x3d33e000}, 
-    {0x3d340000}, {0x3d342000}, {0x3d344000}, {0x3d346000}, 
-    {0x3d348000}, {0x3d34a000}, {0x3d34c000}, {0x3d34e000}, 
-    {0x3d350000}, {0x3d352000}, {0x3d354000}, {0x3d356000}, 
-    {0x3d358000}, {0x3d35a000}, {0x3d35c000}, {0x3d35e000}, 
-    {0x3d360000}, {0x3d362000}, {0x3d364000}, {0x3d366000}, 
-    {0x3d368000}, {0x3d36a000}, {0x3d36c000}, {0x3d36e000}, 
-    {0x3d370000}, {0x3d372000}, {0x3d374000}, {0x3d376000}, 
-    {0x3d378000}, {0x3d37a000}, {0x3d37c000}, {0x3d37e000}, 
-    {0x3d380000}, {0x3d382000}, {0x3d384000}, {0x3d386000}, 
-    {0x3d388000}, {0x3d38a000}, {0x3d38c000}, {0x3d38e000}, 
-    {0x3d390000}, {0x3d392000}, {0x3d394000}, {0x3d396000}, 
-    {0x3d398000}, {0x3d39a000}, {0x3d39c000}, {0x3d39e000}, 
-    {0x3d3a0000}, {0x3d3a2000}, {0x3d3a4000}, {0x3d3a6000}, 
-    {0x3d3a8000}, {0x3d3aa000}, {0x3d3ac000}, {0x3d3ae000}, 
-    {0x3d3b0000}, {0x3d3b2000}, {0x3d3b4000}, {0x3d3b6000}, 
-    {0x3d3b8000}, {0x3d3ba000}, {0x3d3bc000}, {0x3d3be000}, 
-    {0x3d3c0000}, {0x3d3c2000}, {0x3d3c4000}, {0x3d3c6000}, 
-    {0x3d3c8000}, {0x3d3ca000}, {0x3d3cc000}, {0x3d3ce000}, 
-    {0x3d3d0000}, {0x3d3d2000}, {0x3d3d4000}, {0x3d3d6000}, 
-    {0x3d3d8000}, {0x3d3da000}, {0x3d3dc000}, {0x3d3de000}, 
-    {0x3d3e0000}, {0x3d3e2000}, {0x3d3e4000}, {0x3d3e6000}, 
-    {0x3d3e8000}, {0x3d3ea000}, {0x3d3ec000}, {0x3d3ee000}, 
-    {0x3d3f0000}, {0x3d3f2000}, {0x3d3f4000}, {0x3d3f6000}, 
-    {0x3d3f8000}, {0x3d3fa000}, {0x3d3fc000}, {0x3d3fe000}, 
-    {0x3d400000}, {0x3d402000}, {0x3d404000}, {0x3d406000}, 
-    {0x3d408000}, {0x3d40a000}, {0x3d40c000}, {0x3d40e000}, 
-    {0x3d410000}, {0x3d412000}, {0x3d414000}, {0x3d416000}, 
-    {0x3d418000}, {0x3d41a000}, {0x3d41c000}, {0x3d41e000}, 
-    {0x3d420000}, {0x3d422000}, {0x3d424000}, {0x3d426000}, 
-    {0x3d428000}, {0x3d42a000}, {0x3d42c000}, {0x3d42e000}, 
-    {0x3d430000}, {0x3d432000}, {0x3d434000}, {0x3d436000}, 
-    {0x3d438000}, {0x3d43a000}, {0x3d43c000}, {0x3d43e000}, 
-    {0x3d440000}, {0x3d442000}, {0x3d444000}, {0x3d446000}, 
-    {0x3d448000}, {0x3d44a000}, {0x3d44c000}, {0x3d44e000}, 
-    {0x3d450000}, {0x3d452000}, {0x3d454000}, {0x3d456000}, 
-    {0x3d458000}, {0x3d45a000}, {0x3d45c000}, {0x3d45e000}, 
-    {0x3d460000}, {0x3d462000}, {0x3d464000}, {0x3d466000}, 
-    {0x3d468000}, {0x3d46a000}, {0x3d46c000}, {0x3d46e000}, 
-    {0x3d470000}, {0x3d472000}, {0x3d474000}, {0x3d476000}, 
-    {0x3d478000}, {0x3d47a000}, {0x3d47c000}, {0x3d47e000}, 
-    {0x3d480000}, {0x3d482000}, {0x3d484000}, {0x3d486000}, 
-    {0x3d488000}, {0x3d48a000}, {0x3d48c000}, {0x3d48e000}, 
-    {0x3d490000}, {0x3d492000}, {0x3d494000}, {0x3d496000}, 
-    {0x3d498000}, {0x3d49a000}, {0x3d49c000}, {0x3d49e000}, 
-    {0x3d4a0000}, {0x3d4a2000}, {0x3d4a4000}, {0x3d4a6000}, 
-    {0x3d4a8000}, {0x3d4aa000}, {0x3d4ac000}, {0x3d4ae000}, 
-    {0x3d4b0000}, {0x3d4b2000}, {0x3d4b4000}, {0x3d4b6000}, 
-    {0x3d4b8000}, {0x3d4ba000}, {0x3d4bc000}, {0x3d4be000}, 
-    {0x3d4c0000}, {0x3d4c2000}, {0x3d4c4000}, {0x3d4c6000}, 
-    {0x3d4c8000}, {0x3d4ca000}, {0x3d4cc000}, {0x3d4ce000}, 
-    {0x3d4d0000}, {0x3d4d2000}, {0x3d4d4000}, {0x3d4d6000}, 
-    {0x3d4d8000}, {0x3d4da000}, {0x3d4dc000}, {0x3d4de000}, 
-    {0x3d4e0000}, {0x3d4e2000}, {0x3d4e4000}, {0x3d4e6000}, 
-    {0x3d4e8000}, {0x3d4ea000}, {0x3d4ec000}, {0x3d4ee000}, 
-    {0x3d4f0000}, {0x3d4f2000}, {0x3d4f4000}, {0x3d4f6000}, 
-    {0x3d4f8000}, {0x3d4fa000}, {0x3d4fc000}, {0x3d4fe000}, 
-    {0x3d500000}, {0x3d502000}, {0x3d504000}, {0x3d506000}, 
-    {0x3d508000}, {0x3d50a000}, {0x3d50c000}, {0x3d50e000}, 
-    {0x3d510000}, {0x3d512000}, {0x3d514000}, {0x3d516000}, 
-    {0x3d518000}, {0x3d51a000}, {0x3d51c000}, {0x3d51e000}, 
-    {0x3d520000}, {0x3d522000}, {0x3d524000}, {0x3d526000}, 
-    {0x3d528000}, {0x3d52a000}, {0x3d52c000}, {0x3d52e000}, 
-    {0x3d530000}, {0x3d532000}, {0x3d534000}, {0x3d536000}, 
-    {0x3d538000}, {0x3d53a000}, {0x3d53c000}, {0x3d53e000}, 
-    {0x3d540000}, {0x3d542000}, {0x3d544000}, {0x3d546000}, 
-    {0x3d548000}, {0x3d54a000}, {0x3d54c000}, {0x3d54e000}, 
-    {0x3d550000}, {0x3d552000}, {0x3d554000}, {0x3d556000}, 
-    {0x3d558000}, {0x3d55a000}, {0x3d55c000}, {0x3d55e000}, 
-    {0x3d560000}, {0x3d562000}, {0x3d564000}, {0x3d566000}, 
-    {0x3d568000}, {0x3d56a000}, {0x3d56c000}, {0x3d56e000}, 
-    {0x3d570000}, {0x3d572000}, {0x3d574000}, {0x3d576000}, 
-    {0x3d578000}, {0x3d57a000}, {0x3d57c000}, {0x3d57e000}, 
-    {0x3d580000}, {0x3d582000}, {0x3d584000}, {0x3d586000}, 
-    {0x3d588000}, {0x3d58a000}, {0x3d58c000}, {0x3d58e000}, 
-    {0x3d590000}, {0x3d592000}, {0x3d594000}, {0x3d596000}, 
-    {0x3d598000}, {0x3d59a000}, {0x3d59c000}, {0x3d59e000}, 
-    {0x3d5a0000}, {0x3d5a2000}, {0x3d5a4000}, {0x3d5a6000}, 
-    {0x3d5a8000}, {0x3d5aa000}, {0x3d5ac000}, {0x3d5ae000}, 
-    {0x3d5b0000}, {0x3d5b2000}, {0x3d5b4000}, {0x3d5b6000}, 
-    {0x3d5b8000}, {0x3d5ba000}, {0x3d5bc000}, {0x3d5be000}, 
-    {0x3d5c0000}, {0x3d5c2000}, {0x3d5c4000}, {0x3d5c6000}, 
-    {0x3d5c8000}, {0x3d5ca000}, {0x3d5cc000}, {0x3d5ce000}, 
-    {0x3d5d0000}, {0x3d5d2000}, {0x3d5d4000}, {0x3d5d6000}, 
-    {0x3d5d8000}, {0x3d5da000}, {0x3d5dc000}, {0x3d5de000}, 
-    {0x3d5e0000}, {0x3d5e2000}, {0x3d5e4000}, {0x3d5e6000}, 
-    {0x3d5e8000}, {0x3d5ea000}, {0x3d5ec000}, {0x3d5ee000}, 
-    {0x3d5f0000}, {0x3d5f2000}, {0x3d5f4000}, {0x3d5f6000}, 
-    {0x3d5f8000}, {0x3d5fa000}, {0x3d5fc000}, {0x3d5fe000}, 
-    {0x3d600000}, {0x3d602000}, {0x3d604000}, {0x3d606000}, 
-    {0x3d608000}, {0x3d60a000}, {0x3d60c000}, {0x3d60e000}, 
-    {0x3d610000}, {0x3d612000}, {0x3d614000}, {0x3d616000}, 
-    {0x3d618000}, {0x3d61a000}, {0x3d61c000}, {0x3d61e000}, 
-    {0x3d620000}, {0x3d622000}, {0x3d624000}, {0x3d626000}, 
-    {0x3d628000}, {0x3d62a000}, {0x3d62c000}, {0x3d62e000}, 
-    {0x3d630000}, {0x3d632000}, {0x3d634000}, {0x3d636000}, 
-    {0x3d638000}, {0x3d63a000}, {0x3d63c000}, {0x3d63e000}, 
-    {0x3d640000}, {0x3d642000}, {0x3d644000}, {0x3d646000}, 
-    {0x3d648000}, {0x3d64a000}, {0x3d64c000}, {0x3d64e000}, 
-    {0x3d650000}, {0x3d652000}, {0x3d654000}, {0x3d656000}, 
-    {0x3d658000}, {0x3d65a000}, {0x3d65c000}, {0x3d65e000}, 
-    {0x3d660000}, {0x3d662000}, {0x3d664000}, {0x3d666000}, 
-    {0x3d668000}, {0x3d66a000}, {0x3d66c000}, {0x3d66e000}, 
-    {0x3d670000}, {0x3d672000}, {0x3d674000}, {0x3d676000}, 
-    {0x3d678000}, {0x3d67a000}, {0x3d67c000}, {0x3d67e000}, 
-    {0x3d680000}, {0x3d682000}, {0x3d684000}, {0x3d686000}, 
-    {0x3d688000}, {0x3d68a000}, {0x3d68c000}, {0x3d68e000}, 
-    {0x3d690000}, {0x3d692000}, {0x3d694000}, {0x3d696000}, 
-    {0x3d698000}, {0x3d69a000}, {0x3d69c000}, {0x3d69e000}, 
-    {0x3d6a0000}, {0x3d6a2000}, {0x3d6a4000}, {0x3d6a6000}, 
-    {0x3d6a8000}, {0x3d6aa000}, {0x3d6ac000}, {0x3d6ae000}, 
-    {0x3d6b0000}, {0x3d6b2000}, {0x3d6b4000}, {0x3d6b6000}, 
-    {0x3d6b8000}, {0x3d6ba000}, {0x3d6bc000}, {0x3d6be000}, 
-    {0x3d6c0000}, {0x3d6c2000}, {0x3d6c4000}, {0x3d6c6000}, 
-    {0x3d6c8000}, {0x3d6ca000}, {0x3d6cc000}, {0x3d6ce000}, 
-    {0x3d6d0000}, {0x3d6d2000}, {0x3d6d4000}, {0x3d6d6000}, 
-    {0x3d6d8000}, {0x3d6da000}, {0x3d6dc000}, {0x3d6de000}, 
-    {0x3d6e0000}, {0x3d6e2000}, {0x3d6e4000}, {0x3d6e6000}, 
-    {0x3d6e8000}, {0x3d6ea000}, {0x3d6ec000}, {0x3d6ee000}, 
-    {0x3d6f0000}, {0x3d6f2000}, {0x3d6f4000}, {0x3d6f6000}, 
-    {0x3d6f8000}, {0x3d6fa000}, {0x3d6fc000}, {0x3d6fe000}, 
-    {0x3d700000}, {0x3d702000}, {0x3d704000}, {0x3d706000}, 
-    {0x3d708000}, {0x3d70a000}, {0x3d70c000}, {0x3d70e000}, 
-    {0x3d710000}, {0x3d712000}, {0x3d714000}, {0x3d716000}, 
-    {0x3d718000}, {0x3d71a000}, {0x3d71c000}, {0x3d71e000}, 
-    {0x3d720000}, {0x3d722000}, {0x3d724000}, {0x3d726000}, 
-    {0x3d728000}, {0x3d72a000}, {0x3d72c000}, {0x3d72e000}, 
-    {0x3d730000}, {0x3d732000}, {0x3d734000}, {0x3d736000}, 
-    {0x3d738000}, {0x3d73a000}, {0x3d73c000}, {0x3d73e000}, 
-    {0x3d740000}, {0x3d742000}, {0x3d744000}, {0x3d746000}, 
-    {0x3d748000}, {0x3d74a000}, {0x3d74c000}, {0x3d74e000}, 
-    {0x3d750000}, {0x3d752000}, {0x3d754000}, {0x3d756000}, 
-    {0x3d758000}, {0x3d75a000}, {0x3d75c000}, {0x3d75e000}, 
-    {0x3d760000}, {0x3d762000}, {0x3d764000}, {0x3d766000}, 
-    {0x3d768000}, {0x3d76a000}, {0x3d76c000}, {0x3d76e000}, 
-    {0x3d770000}, {0x3d772000}, {0x3d774000}, {0x3d776000}, 
-    {0x3d778000}, {0x3d77a000}, {0x3d77c000}, {0x3d77e000}, 
-    {0x3d780000}, {0x3d782000}, {0x3d784000}, {0x3d786000}, 
-    {0x3d788000}, {0x3d78a000}, {0x3d78c000}, {0x3d78e000}, 
-    {0x3d790000}, {0x3d792000}, {0x3d794000}, {0x3d796000}, 
-    {0x3d798000}, {0x3d79a000}, {0x3d79c000}, {0x3d79e000}, 
-    {0x3d7a0000}, {0x3d7a2000}, {0x3d7a4000}, {0x3d7a6000}, 
-    {0x3d7a8000}, {0x3d7aa000}, {0x3d7ac000}, {0x3d7ae000}, 
-    {0x3d7b0000}, {0x3d7b2000}, {0x3d7b4000}, {0x3d7b6000}, 
-    {0x3d7b8000}, {0x3d7ba000}, {0x3d7bc000}, {0x3d7be000}, 
-    {0x3d7c0000}, {0x3d7c2000}, {0x3d7c4000}, {0x3d7c6000}, 
-    {0x3d7c8000}, {0x3d7ca000}, {0x3d7cc000}, {0x3d7ce000}, 
-    {0x3d7d0000}, {0x3d7d2000}, {0x3d7d4000}, {0x3d7d6000}, 
-    {0x3d7d8000}, {0x3d7da000}, {0x3d7dc000}, {0x3d7de000}, 
-    {0x3d7e0000}, {0x3d7e2000}, {0x3d7e4000}, {0x3d7e6000}, 
-    {0x3d7e8000}, {0x3d7ea000}, {0x3d7ec000}, {0x3d7ee000}, 
-    {0x3d7f0000}, {0x3d7f2000}, {0x3d7f4000}, {0x3d7f6000}, 
-    {0x3d7f8000}, {0x3d7fa000}, {0x3d7fc000}, {0x3d7fe000}, 
-    {0x3d800000}, {0x3d802000}, {0x3d804000}, {0x3d806000}, 
-    {0x3d808000}, {0x3d80a000}, {0x3d80c000}, {0x3d80e000}, 
-    {0x3d810000}, {0x3d812000}, {0x3d814000}, {0x3d816000}, 
-    {0x3d818000}, {0x3d81a000}, {0x3d81c000}, {0x3d81e000}, 
-    {0x3d820000}, {0x3d822000}, {0x3d824000}, {0x3d826000}, 
-    {0x3d828000}, {0x3d82a000}, {0x3d82c000}, {0x3d82e000}, 
-    {0x3d830000}, {0x3d832000}, {0x3d834000}, {0x3d836000}, 
-    {0x3d838000}, {0x3d83a000}, {0x3d83c000}, {0x3d83e000}, 
-    {0x3d840000}, {0x3d842000}, {0x3d844000}, {0x3d846000}, 
-    {0x3d848000}, {0x3d84a000}, {0x3d84c000}, {0x3d84e000}, 
-    {0x3d850000}, {0x3d852000}, {0x3d854000}, {0x3d856000}, 
-    {0x3d858000}, {0x3d85a000}, {0x3d85c000}, {0x3d85e000}, 
-    {0x3d860000}, {0x3d862000}, {0x3d864000}, {0x3d866000}, 
-    {0x3d868000}, {0x3d86a000}, {0x3d86c000}, {0x3d86e000}, 
-    {0x3d870000}, {0x3d872000}, {0x3d874000}, {0x3d876000}, 
-    {0x3d878000}, {0x3d87a000}, {0x3d87c000}, {0x3d87e000}, 
-    {0x3d880000}, {0x3d882000}, {0x3d884000}, {0x3d886000}, 
-    {0x3d888000}, {0x3d88a000}, {0x3d88c000}, {0x3d88e000}, 
-    {0x3d890000}, {0x3d892000}, {0x3d894000}, {0x3d896000}, 
-    {0x3d898000}, {0x3d89a000}, {0x3d89c000}, {0x3d89e000}, 
-    {0x3d8a0000}, {0x3d8a2000}, {0x3d8a4000}, {0x3d8a6000}, 
-    {0x3d8a8000}, {0x3d8aa000}, {0x3d8ac000}, {0x3d8ae000}, 
-    {0x3d8b0000}, {0x3d8b2000}, {0x3d8b4000}, {0x3d8b6000}, 
-    {0x3d8b8000}, {0x3d8ba000}, {0x3d8bc000}, {0x3d8be000}, 
-    {0x3d8c0000}, {0x3d8c2000}, {0x3d8c4000}, {0x3d8c6000}, 
-    {0x3d8c8000}, {0x3d8ca000}, {0x3d8cc000}, {0x3d8ce000}, 
-    {0x3d8d0000}, {0x3d8d2000}, {0x3d8d4000}, {0x3d8d6000}, 
-    {0x3d8d8000}, {0x3d8da000}, {0x3d8dc000}, {0x3d8de000}, 
-    {0x3d8e0000}, {0x3d8e2000}, {0x3d8e4000}, {0x3d8e6000}, 
-    {0x3d8e8000}, {0x3d8ea000}, {0x3d8ec000}, {0x3d8ee000}, 
-    {0x3d8f0000}, {0x3d8f2000}, {0x3d8f4000}, {0x3d8f6000}, 
-    {0x3d8f8000}, {0x3d8fa000}, {0x3d8fc000}, {0x3d8fe000}, 
-    {0x3d900000}, {0x3d902000}, {0x3d904000}, {0x3d906000}, 
-    {0x3d908000}, {0x3d90a000}, {0x3d90c000}, {0x3d90e000}, 
-    {0x3d910000}, {0x3d912000}, {0x3d914000}, {0x3d916000}, 
-    {0x3d918000}, {0x3d91a000}, {0x3d91c000}, {0x3d91e000}, 
-    {0x3d920000}, {0x3d922000}, {0x3d924000}, {0x3d926000}, 
-    {0x3d928000}, {0x3d92a000}, {0x3d92c000}, {0x3d92e000}, 
-    {0x3d930000}, {0x3d932000}, {0x3d934000}, {0x3d936000}, 
-    {0x3d938000}, {0x3d93a000}, {0x3d93c000}, {0x3d93e000}, 
-    {0x3d940000}, {0x3d942000}, {0x3d944000}, {0x3d946000}, 
-    {0x3d948000}, {0x3d94a000}, {0x3d94c000}, {0x3d94e000}, 
-    {0x3d950000}, {0x3d952000}, {0x3d954000}, {0x3d956000}, 
-    {0x3d958000}, {0x3d95a000}, {0x3d95c000}, {0x3d95e000}, 
-    {0x3d960000}, {0x3d962000}, {0x3d964000}, {0x3d966000}, 
-    {0x3d968000}, {0x3d96a000}, {0x3d96c000}, {0x3d96e000}, 
-    {0x3d970000}, {0x3d972000}, {0x3d974000}, {0x3d976000}, 
-    {0x3d978000}, {0x3d97a000}, {0x3d97c000}, {0x3d97e000}, 
-    {0x3d980000}, {0x3d982000}, {0x3d984000}, {0x3d986000}, 
-    {0x3d988000}, {0x3d98a000}, {0x3d98c000}, {0x3d98e000}, 
-    {0x3d990000}, {0x3d992000}, {0x3d994000}, {0x3d996000}, 
-    {0x3d998000}, {0x3d99a000}, {0x3d99c000}, {0x3d99e000}, 
-    {0x3d9a0000}, {0x3d9a2000}, {0x3d9a4000}, {0x3d9a6000}, 
-    {0x3d9a8000}, {0x3d9aa000}, {0x3d9ac000}, {0x3d9ae000}, 
-    {0x3d9b0000}, {0x3d9b2000}, {0x3d9b4000}, {0x3d9b6000}, 
-    {0x3d9b8000}, {0x3d9ba000}, {0x3d9bc000}, {0x3d9be000}, 
-    {0x3d9c0000}, {0x3d9c2000}, {0x3d9c4000}, {0x3d9c6000}, 
-    {0x3d9c8000}, {0x3d9ca000}, {0x3d9cc000}, {0x3d9ce000}, 
-    {0x3d9d0000}, {0x3d9d2000}, {0x3d9d4000}, {0x3d9d6000}, 
-    {0x3d9d8000}, {0x3d9da000}, {0x3d9dc000}, {0x3d9de000}, 
-    {0x3d9e0000}, {0x3d9e2000}, {0x3d9e4000}, {0x3d9e6000}, 
-    {0x3d9e8000}, {0x3d9ea000}, {0x3d9ec000}, {0x3d9ee000}, 
-    {0x3d9f0000}, {0x3d9f2000}, {0x3d9f4000}, {0x3d9f6000}, 
-    {0x3d9f8000}, {0x3d9fa000}, {0x3d9fc000}, {0x3d9fe000}, 
-    {0x3da00000}, {0x3da02000}, {0x3da04000}, {0x3da06000}, 
-    {0x3da08000}, {0x3da0a000}, {0x3da0c000}, {0x3da0e000}, 
-    {0x3da10000}, {0x3da12000}, {0x3da14000}, {0x3da16000}, 
-    {0x3da18000}, {0x3da1a000}, {0x3da1c000}, {0x3da1e000}, 
-    {0x3da20000}, {0x3da22000}, {0x3da24000}, {0x3da26000}, 
-    {0x3da28000}, {0x3da2a000}, {0x3da2c000}, {0x3da2e000}, 
-    {0x3da30000}, {0x3da32000}, {0x3da34000}, {0x3da36000}, 
-    {0x3da38000}, {0x3da3a000}, {0x3da3c000}, {0x3da3e000}, 
-    {0x3da40000}, {0x3da42000}, {0x3da44000}, {0x3da46000}, 
-    {0x3da48000}, {0x3da4a000}, {0x3da4c000}, {0x3da4e000}, 
-    {0x3da50000}, {0x3da52000}, {0x3da54000}, {0x3da56000}, 
-    {0x3da58000}, {0x3da5a000}, {0x3da5c000}, {0x3da5e000}, 
-    {0x3da60000}, {0x3da62000}, {0x3da64000}, {0x3da66000}, 
-    {0x3da68000}, {0x3da6a000}, {0x3da6c000}, {0x3da6e000}, 
-    {0x3da70000}, {0x3da72000}, {0x3da74000}, {0x3da76000}, 
-    {0x3da78000}, {0x3da7a000}, {0x3da7c000}, {0x3da7e000}, 
-    {0x3da80000}, {0x3da82000}, {0x3da84000}, {0x3da86000}, 
-    {0x3da88000}, {0x3da8a000}, {0x3da8c000}, {0x3da8e000}, 
-    {0x3da90000}, {0x3da92000}, {0x3da94000}, {0x3da96000}, 
-    {0x3da98000}, {0x3da9a000}, {0x3da9c000}, {0x3da9e000}, 
-    {0x3daa0000}, {0x3daa2000}, {0x3daa4000}, {0x3daa6000}, 
-    {0x3daa8000}, {0x3daaa000}, {0x3daac000}, {0x3daae000}, 
-    {0x3dab0000}, {0x3dab2000}, {0x3dab4000}, {0x3dab6000}, 
-    {0x3dab8000}, {0x3daba000}, {0x3dabc000}, {0x3dabe000}, 
-    {0x3dac0000}, {0x3dac2000}, {0x3dac4000}, {0x3dac6000}, 
-    {0x3dac8000}, {0x3daca000}, {0x3dacc000}, {0x3dace000}, 
-    {0x3dad0000}, {0x3dad2000}, {0x3dad4000}, {0x3dad6000}, 
-    {0x3dad8000}, {0x3dada000}, {0x3dadc000}, {0x3dade000}, 
-    {0x3dae0000}, {0x3dae2000}, {0x3dae4000}, {0x3dae6000}, 
-    {0x3dae8000}, {0x3daea000}, {0x3daec000}, {0x3daee000}, 
-    {0x3daf0000}, {0x3daf2000}, {0x3daf4000}, {0x3daf6000}, 
-    {0x3daf8000}, {0x3dafa000}, {0x3dafc000}, {0x3dafe000}, 
-    {0x3db00000}, {0x3db02000}, {0x3db04000}, {0x3db06000}, 
-    {0x3db08000}, {0x3db0a000}, {0x3db0c000}, {0x3db0e000}, 
-    {0x3db10000}, {0x3db12000}, {0x3db14000}, {0x3db16000}, 
-    {0x3db18000}, {0x3db1a000}, {0x3db1c000}, {0x3db1e000}, 
-    {0x3db20000}, {0x3db22000}, {0x3db24000}, {0x3db26000}, 
-    {0x3db28000}, {0x3db2a000}, {0x3db2c000}, {0x3db2e000}, 
-    {0x3db30000}, {0x3db32000}, {0x3db34000}, {0x3db36000}, 
-    {0x3db38000}, {0x3db3a000}, {0x3db3c000}, {0x3db3e000}, 
-    {0x3db40000}, {0x3db42000}, {0x3db44000}, {0x3db46000}, 
-    {0x3db48000}, {0x3db4a000}, {0x3db4c000}, {0x3db4e000}, 
-    {0x3db50000}, {0x3db52000}, {0x3db54000}, {0x3db56000}, 
-    {0x3db58000}, {0x3db5a000}, {0x3db5c000}, {0x3db5e000}, 
-    {0x3db60000}, {0x3db62000}, {0x3db64000}, {0x3db66000}, 
-    {0x3db68000}, {0x3db6a000}, {0x3db6c000}, {0x3db6e000}, 
-    {0x3db70000}, {0x3db72000}, {0x3db74000}, {0x3db76000}, 
-    {0x3db78000}, {0x3db7a000}, {0x3db7c000}, {0x3db7e000}, 
-    {0x3db80000}, {0x3db82000}, {0x3db84000}, {0x3db86000}, 
-    {0x3db88000}, {0x3db8a000}, {0x3db8c000}, {0x3db8e000}, 
-    {0x3db90000}, {0x3db92000}, {0x3db94000}, {0x3db96000}, 
-    {0x3db98000}, {0x3db9a000}, {0x3db9c000}, {0x3db9e000}, 
-    {0x3dba0000}, {0x3dba2000}, {0x3dba4000}, {0x3dba6000}, 
-    {0x3dba8000}, {0x3dbaa000}, {0x3dbac000}, {0x3dbae000}, 
-    {0x3dbb0000}, {0x3dbb2000}, {0x3dbb4000}, {0x3dbb6000}, 
-    {0x3dbb8000}, {0x3dbba000}, {0x3dbbc000}, {0x3dbbe000}, 
-    {0x3dbc0000}, {0x3dbc2000}, {0x3dbc4000}, {0x3dbc6000}, 
-    {0x3dbc8000}, {0x3dbca000}, {0x3dbcc000}, {0x3dbce000}, 
-    {0x3dbd0000}, {0x3dbd2000}, {0x3dbd4000}, {0x3dbd6000}, 
-    {0x3dbd8000}, {0x3dbda000}, {0x3dbdc000}, {0x3dbde000}, 
-    {0x3dbe0000}, {0x3dbe2000}, {0x3dbe4000}, {0x3dbe6000}, 
-    {0x3dbe8000}, {0x3dbea000}, {0x3dbec000}, {0x3dbee000}, 
-    {0x3dbf0000}, {0x3dbf2000}, {0x3dbf4000}, {0x3dbf6000}, 
-    {0x3dbf8000}, {0x3dbfa000}, {0x3dbfc000}, {0x3dbfe000}, 
-    {0x3dc00000}, {0x3dc02000}, {0x3dc04000}, {0x3dc06000}, 
-    {0x3dc08000}, {0x3dc0a000}, {0x3dc0c000}, {0x3dc0e000}, 
-    {0x3dc10000}, {0x3dc12000}, {0x3dc14000}, {0x3dc16000}, 
-    {0x3dc18000}, {0x3dc1a000}, {0x3dc1c000}, {0x3dc1e000}, 
-    {0x3dc20000}, {0x3dc22000}, {0x3dc24000}, {0x3dc26000}, 
-    {0x3dc28000}, {0x3dc2a000}, {0x3dc2c000}, {0x3dc2e000}, 
-    {0x3dc30000}, {0x3dc32000}, {0x3dc34000}, {0x3dc36000}, 
-    {0x3dc38000}, {0x3dc3a000}, {0x3dc3c000}, {0x3dc3e000}, 
-    {0x3dc40000}, {0x3dc42000}, {0x3dc44000}, {0x3dc46000}, 
-    {0x3dc48000}, {0x3dc4a000}, {0x3dc4c000}, {0x3dc4e000}, 
-    {0x3dc50000}, {0x3dc52000}, {0x3dc54000}, {0x3dc56000}, 
-    {0x3dc58000}, {0x3dc5a000}, {0x3dc5c000}, {0x3dc5e000}, 
-    {0x3dc60000}, {0x3dc62000}, {0x3dc64000}, {0x3dc66000}, 
-    {0x3dc68000}, {0x3dc6a000}, {0x3dc6c000}, {0x3dc6e000}, 
-    {0x3dc70000}, {0x3dc72000}, {0x3dc74000}, {0x3dc76000}, 
-    {0x3dc78000}, {0x3dc7a000}, {0x3dc7c000}, {0x3dc7e000}, 
-    {0x3dc80000}, {0x3dc82000}, {0x3dc84000}, {0x3dc86000}, 
-    {0x3dc88000}, {0x3dc8a000}, {0x3dc8c000}, {0x3dc8e000}, 
-    {0x3dc90000}, {0x3dc92000}, {0x3dc94000}, {0x3dc96000}, 
-    {0x3dc98000}, {0x3dc9a000}, {0x3dc9c000}, {0x3dc9e000}, 
-    {0x3dca0000}, {0x3dca2000}, {0x3dca4000}, {0x3dca6000}, 
-    {0x3dca8000}, {0x3dcaa000}, {0x3dcac000}, {0x3dcae000}, 
-    {0x3dcb0000}, {0x3dcb2000}, {0x3dcb4000}, {0x3dcb6000}, 
-    {0x3dcb8000}, {0x3dcba000}, {0x3dcbc000}, {0x3dcbe000}, 
-    {0x3dcc0000}, {0x3dcc2000}, {0x3dcc4000}, {0x3dcc6000}, 
-    {0x3dcc8000}, {0x3dcca000}, {0x3dccc000}, {0x3dcce000}, 
-    {0x3dcd0000}, {0x3dcd2000}, {0x3dcd4000}, {0x3dcd6000}, 
-    {0x3dcd8000}, {0x3dcda000}, {0x3dcdc000}, {0x3dcde000}, 
-    {0x3dce0000}, {0x3dce2000}, {0x3dce4000}, {0x3dce6000}, 
-    {0x3dce8000}, {0x3dcea000}, {0x3dcec000}, {0x3dcee000}, 
-    {0x3dcf0000}, {0x3dcf2000}, {0x3dcf4000}, {0x3dcf6000}, 
-    {0x3dcf8000}, {0x3dcfa000}, {0x3dcfc000}, {0x3dcfe000}, 
-    {0x3dd00000}, {0x3dd02000}, {0x3dd04000}, {0x3dd06000}, 
-    {0x3dd08000}, {0x3dd0a000}, {0x3dd0c000}, {0x3dd0e000}, 
-    {0x3dd10000}, {0x3dd12000}, {0x3dd14000}, {0x3dd16000}, 
-    {0x3dd18000}, {0x3dd1a000}, {0x3dd1c000}, {0x3dd1e000}, 
-    {0x3dd20000}, {0x3dd22000}, {0x3dd24000}, {0x3dd26000}, 
-    {0x3dd28000}, {0x3dd2a000}, {0x3dd2c000}, {0x3dd2e000}, 
-    {0x3dd30000}, {0x3dd32000}, {0x3dd34000}, {0x3dd36000}, 
-    {0x3dd38000}, {0x3dd3a000}, {0x3dd3c000}, {0x3dd3e000}, 
-    {0x3dd40000}, {0x3dd42000}, {0x3dd44000}, {0x3dd46000}, 
-    {0x3dd48000}, {0x3dd4a000}, {0x3dd4c000}, {0x3dd4e000}, 
-    {0x3dd50000}, {0x3dd52000}, {0x3dd54000}, {0x3dd56000}, 
-    {0x3dd58000}, {0x3dd5a000}, {0x3dd5c000}, {0x3dd5e000}, 
-    {0x3dd60000}, {0x3dd62000}, {0x3dd64000}, {0x3dd66000}, 
-    {0x3dd68000}, {0x3dd6a000}, {0x3dd6c000}, {0x3dd6e000}, 
-    {0x3dd70000}, {0x3dd72000}, {0x3dd74000}, {0x3dd76000}, 
-    {0x3dd78000}, {0x3dd7a000}, {0x3dd7c000}, {0x3dd7e000}, 
-    {0x3dd80000}, {0x3dd82000}, {0x3dd84000}, {0x3dd86000}, 
-    {0x3dd88000}, {0x3dd8a000}, {0x3dd8c000}, {0x3dd8e000}, 
-    {0x3dd90000}, {0x3dd92000}, {0x3dd94000}, {0x3dd96000}, 
-    {0x3dd98000}, {0x3dd9a000}, {0x3dd9c000}, {0x3dd9e000}, 
-    {0x3dda0000}, {0x3dda2000}, {0x3dda4000}, {0x3dda6000}, 
-    {0x3dda8000}, {0x3ddaa000}, {0x3ddac000}, {0x3ddae000}, 
-    {0x3ddb0000}, {0x3ddb2000}, {0x3ddb4000}, {0x3ddb6000}, 
-    {0x3ddb8000}, {0x3ddba000}, {0x3ddbc000}, {0x3ddbe000}, 
-    {0x3ddc0000}, {0x3ddc2000}, {0x3ddc4000}, {0x3ddc6000}, 
-    {0x3ddc8000}, {0x3ddca000}, {0x3ddcc000}, {0x3ddce000}, 
-    {0x3ddd0000}, {0x3ddd2000}, {0x3ddd4000}, {0x3ddd6000}, 
-    {0x3ddd8000}, {0x3ddda000}, {0x3dddc000}, {0x3ddde000}, 
-    {0x3dde0000}, {0x3dde2000}, {0x3dde4000}, {0x3dde6000}, 
-    {0x3dde8000}, {0x3ddea000}, {0x3ddec000}, {0x3ddee000}, 
-    {0x3ddf0000}, {0x3ddf2000}, {0x3ddf4000}, {0x3ddf6000}, 
-    {0x3ddf8000}, {0x3ddfa000}, {0x3ddfc000}, {0x3ddfe000}, 
-    {0x3de00000}, {0x3de02000}, {0x3de04000}, {0x3de06000}, 
-    {0x3de08000}, {0x3de0a000}, {0x3de0c000}, {0x3de0e000}, 
-    {0x3de10000}, {0x3de12000}, {0x3de14000}, {0x3de16000}, 
-    {0x3de18000}, {0x3de1a000}, {0x3de1c000}, {0x3de1e000}, 
-    {0x3de20000}, {0x3de22000}, {0x3de24000}, {0x3de26000}, 
-    {0x3de28000}, {0x3de2a000}, {0x3de2c000}, {0x3de2e000}, 
-    {0x3de30000}, {0x3de32000}, {0x3de34000}, {0x3de36000}, 
-    {0x3de38000}, {0x3de3a000}, {0x3de3c000}, {0x3de3e000}, 
-    {0x3de40000}, {0x3de42000}, {0x3de44000}, {0x3de46000}, 
-    {0x3de48000}, {0x3de4a000}, {0x3de4c000}, {0x3de4e000}, 
-    {0x3de50000}, {0x3de52000}, {0x3de54000}, {0x3de56000}, 
-    {0x3de58000}, {0x3de5a000}, {0x3de5c000}, {0x3de5e000}, 
-    {0x3de60000}, {0x3de62000}, {0x3de64000}, {0x3de66000}, 
-    {0x3de68000}, {0x3de6a000}, {0x3de6c000}, {0x3de6e000}, 
-    {0x3de70000}, {0x3de72000}, {0x3de74000}, {0x3de76000}, 
-    {0x3de78000}, {0x3de7a000}, {0x3de7c000}, {0x3de7e000}, 
-    {0x3de80000}, {0x3de82000}, {0x3de84000}, {0x3de86000}, 
-    {0x3de88000}, {0x3de8a000}, {0x3de8c000}, {0x3de8e000}, 
-    {0x3de90000}, {0x3de92000}, {0x3de94000}, {0x3de96000}, 
-    {0x3de98000}, {0x3de9a000}, {0x3de9c000}, {0x3de9e000}, 
-    {0x3dea0000}, {0x3dea2000}, {0x3dea4000}, {0x3dea6000}, 
-    {0x3dea8000}, {0x3deaa000}, {0x3deac000}, {0x3deae000}, 
-    {0x3deb0000}, {0x3deb2000}, {0x3deb4000}, {0x3deb6000}, 
-    {0x3deb8000}, {0x3deba000}, {0x3debc000}, {0x3debe000}, 
-    {0x3dec0000}, {0x3dec2000}, {0x3dec4000}, {0x3dec6000}, 
-    {0x3dec8000}, {0x3deca000}, {0x3decc000}, {0x3dece000}, 
-    {0x3ded0000}, {0x3ded2000}, {0x3ded4000}, {0x3ded6000}, 
-    {0x3ded8000}, {0x3deda000}, {0x3dedc000}, {0x3dede000}, 
-    {0x3dee0000}, {0x3dee2000}, {0x3dee4000}, {0x3dee6000}, 
-    {0x3dee8000}, {0x3deea000}, {0x3deec000}, {0x3deee000}, 
-    {0x3def0000}, {0x3def2000}, {0x3def4000}, {0x3def6000}, 
-    {0x3def8000}, {0x3defa000}, {0x3defc000}, {0x3defe000}, 
-    {0x3df00000}, {0x3df02000}, {0x3df04000}, {0x3df06000}, 
-    {0x3df08000}, {0x3df0a000}, {0x3df0c000}, {0x3df0e000}, 
-    {0x3df10000}, {0x3df12000}, {0x3df14000}, {0x3df16000}, 
-    {0x3df18000}, {0x3df1a000}, {0x3df1c000}, {0x3df1e000}, 
-    {0x3df20000}, {0x3df22000}, {0x3df24000}, {0x3df26000}, 
-    {0x3df28000}, {0x3df2a000}, {0x3df2c000}, {0x3df2e000}, 
-    {0x3df30000}, {0x3df32000}, {0x3df34000}, {0x3df36000}, 
-    {0x3df38000}, {0x3df3a000}, {0x3df3c000}, {0x3df3e000}, 
-    {0x3df40000}, {0x3df42000}, {0x3df44000}, {0x3df46000}, 
-    {0x3df48000}, {0x3df4a000}, {0x3df4c000}, {0x3df4e000}, 
-    {0x3df50000}, {0x3df52000}, {0x3df54000}, {0x3df56000}, 
-    {0x3df58000}, {0x3df5a000}, {0x3df5c000}, {0x3df5e000}, 
-    {0x3df60000}, {0x3df62000}, {0x3df64000}, {0x3df66000}, 
-    {0x3df68000}, {0x3df6a000}, {0x3df6c000}, {0x3df6e000}, 
-    {0x3df70000}, {0x3df72000}, {0x3df74000}, {0x3df76000}, 
-    {0x3df78000}, {0x3df7a000}, {0x3df7c000}, {0x3df7e000}, 
-    {0x3df80000}, {0x3df82000}, {0x3df84000}, {0x3df86000}, 
-    {0x3df88000}, {0x3df8a000}, {0x3df8c000}, {0x3df8e000}, 
-    {0x3df90000}, {0x3df92000}, {0x3df94000}, {0x3df96000}, 
-    {0x3df98000}, {0x3df9a000}, {0x3df9c000}, {0x3df9e000}, 
-    {0x3dfa0000}, {0x3dfa2000}, {0x3dfa4000}, {0x3dfa6000}, 
-    {0x3dfa8000}, {0x3dfaa000}, {0x3dfac000}, {0x3dfae000}, 
-    {0x3dfb0000}, {0x3dfb2000}, {0x3dfb4000}, {0x3dfb6000}, 
-    {0x3dfb8000}, {0x3dfba000}, {0x3dfbc000}, {0x3dfbe000}, 
-    {0x3dfc0000}, {0x3dfc2000}, {0x3dfc4000}, {0x3dfc6000}, 
-    {0x3dfc8000}, {0x3dfca000}, {0x3dfcc000}, {0x3dfce000}, 
-    {0x3dfd0000}, {0x3dfd2000}, {0x3dfd4000}, {0x3dfd6000}, 
-    {0x3dfd8000}, {0x3dfda000}, {0x3dfdc000}, {0x3dfde000}, 
-    {0x3dfe0000}, {0x3dfe2000}, {0x3dfe4000}, {0x3dfe6000}, 
-    {0x3dfe8000}, {0x3dfea000}, {0x3dfec000}, {0x3dfee000}, 
-    {0x3dff0000}, {0x3dff2000}, {0x3dff4000}, {0x3dff6000}, 
-    {0x3dff8000}, {0x3dffa000}, {0x3dffc000}, {0x3dffe000}, 
-    {0x3e000000}, {0x3e002000}, {0x3e004000}, {0x3e006000}, 
-    {0x3e008000}, {0x3e00a000}, {0x3e00c000}, {0x3e00e000}, 
-    {0x3e010000}, {0x3e012000}, {0x3e014000}, {0x3e016000}, 
-    {0x3e018000}, {0x3e01a000}, {0x3e01c000}, {0x3e01e000}, 
-    {0x3e020000}, {0x3e022000}, {0x3e024000}, {0x3e026000}, 
-    {0x3e028000}, {0x3e02a000}, {0x3e02c000}, {0x3e02e000}, 
-    {0x3e030000}, {0x3e032000}, {0x3e034000}, {0x3e036000}, 
-    {0x3e038000}, {0x3e03a000}, {0x3e03c000}, {0x3e03e000}, 
-    {0x3e040000}, {0x3e042000}, {0x3e044000}, {0x3e046000}, 
-    {0x3e048000}, {0x3e04a000}, {0x3e04c000}, {0x3e04e000}, 
-    {0x3e050000}, {0x3e052000}, {0x3e054000}, {0x3e056000}, 
-    {0x3e058000}, {0x3e05a000}, {0x3e05c000}, {0x3e05e000}, 
-    {0x3e060000}, {0x3e062000}, {0x3e064000}, {0x3e066000}, 
-    {0x3e068000}, {0x3e06a000}, {0x3e06c000}, {0x3e06e000}, 
-    {0x3e070000}, {0x3e072000}, {0x3e074000}, {0x3e076000}, 
-    {0x3e078000}, {0x3e07a000}, {0x3e07c000}, {0x3e07e000}, 
-    {0x3e080000}, {0x3e082000}, {0x3e084000}, {0x3e086000}, 
-    {0x3e088000}, {0x3e08a000}, {0x3e08c000}, {0x3e08e000}, 
-    {0x3e090000}, {0x3e092000}, {0x3e094000}, {0x3e096000}, 
-    {0x3e098000}, {0x3e09a000}, {0x3e09c000}, {0x3e09e000}, 
-    {0x3e0a0000}, {0x3e0a2000}, {0x3e0a4000}, {0x3e0a6000}, 
-    {0x3e0a8000}, {0x3e0aa000}, {0x3e0ac000}, {0x3e0ae000}, 
-    {0x3e0b0000}, {0x3e0b2000}, {0x3e0b4000}, {0x3e0b6000}, 
-    {0x3e0b8000}, {0x3e0ba000}, {0x3e0bc000}, {0x3e0be000}, 
-    {0x3e0c0000}, {0x3e0c2000}, {0x3e0c4000}, {0x3e0c6000}, 
-    {0x3e0c8000}, {0x3e0ca000}, {0x3e0cc000}, {0x3e0ce000}, 
-    {0x3e0d0000}, {0x3e0d2000}, {0x3e0d4000}, {0x3e0d6000}, 
-    {0x3e0d8000}, {0x3e0da000}, {0x3e0dc000}, {0x3e0de000}, 
-    {0x3e0e0000}, {0x3e0e2000}, {0x3e0e4000}, {0x3e0e6000}, 
-    {0x3e0e8000}, {0x3e0ea000}, {0x3e0ec000}, {0x3e0ee000}, 
-    {0x3e0f0000}, {0x3e0f2000}, {0x3e0f4000}, {0x3e0f6000}, 
-    {0x3e0f8000}, {0x3e0fa000}, {0x3e0fc000}, {0x3e0fe000}, 
-    {0x3e100000}, {0x3e102000}, {0x3e104000}, {0x3e106000}, 
-    {0x3e108000}, {0x3e10a000}, {0x3e10c000}, {0x3e10e000}, 
-    {0x3e110000}, {0x3e112000}, {0x3e114000}, {0x3e116000}, 
-    {0x3e118000}, {0x3e11a000}, {0x3e11c000}, {0x3e11e000}, 
-    {0x3e120000}, {0x3e122000}, {0x3e124000}, {0x3e126000}, 
-    {0x3e128000}, {0x3e12a000}, {0x3e12c000}, {0x3e12e000}, 
-    {0x3e130000}, {0x3e132000}, {0x3e134000}, {0x3e136000}, 
-    {0x3e138000}, {0x3e13a000}, {0x3e13c000}, {0x3e13e000}, 
-    {0x3e140000}, {0x3e142000}, {0x3e144000}, {0x3e146000}, 
-    {0x3e148000}, {0x3e14a000}, {0x3e14c000}, {0x3e14e000}, 
-    {0x3e150000}, {0x3e152000}, {0x3e154000}, {0x3e156000}, 
-    {0x3e158000}, {0x3e15a000}, {0x3e15c000}, {0x3e15e000}, 
-    {0x3e160000}, {0x3e162000}, {0x3e164000}, {0x3e166000}, 
-    {0x3e168000}, {0x3e16a000}, {0x3e16c000}, {0x3e16e000}, 
-    {0x3e170000}, {0x3e172000}, {0x3e174000}, {0x3e176000}, 
-    {0x3e178000}, {0x3e17a000}, {0x3e17c000}, {0x3e17e000}, 
-    {0x3e180000}, {0x3e182000}, {0x3e184000}, {0x3e186000}, 
-    {0x3e188000}, {0x3e18a000}, {0x3e18c000}, {0x3e18e000}, 
-    {0x3e190000}, {0x3e192000}, {0x3e194000}, {0x3e196000}, 
-    {0x3e198000}, {0x3e19a000}, {0x3e19c000}, {0x3e19e000}, 
-    {0x3e1a0000}, {0x3e1a2000}, {0x3e1a4000}, {0x3e1a6000}, 
-    {0x3e1a8000}, {0x3e1aa000}, {0x3e1ac000}, {0x3e1ae000}, 
-    {0x3e1b0000}, {0x3e1b2000}, {0x3e1b4000}, {0x3e1b6000}, 
-    {0x3e1b8000}, {0x3e1ba000}, {0x3e1bc000}, {0x3e1be000}, 
-    {0x3e1c0000}, {0x3e1c2000}, {0x3e1c4000}, {0x3e1c6000}, 
-    {0x3e1c8000}, {0x3e1ca000}, {0x3e1cc000}, {0x3e1ce000}, 
-    {0x3e1d0000}, {0x3e1d2000}, {0x3e1d4000}, {0x3e1d6000}, 
-    {0x3e1d8000}, {0x3e1da000}, {0x3e1dc000}, {0x3e1de000}, 
-    {0x3e1e0000}, {0x3e1e2000}, {0x3e1e4000}, {0x3e1e6000}, 
-    {0x3e1e8000}, {0x3e1ea000}, {0x3e1ec000}, {0x3e1ee000}, 
-    {0x3e1f0000}, {0x3e1f2000}, {0x3e1f4000}, {0x3e1f6000}, 
-    {0x3e1f8000}, {0x3e1fa000}, {0x3e1fc000}, {0x3e1fe000}, 
-    {0x3e200000}, {0x3e202000}, {0x3e204000}, {0x3e206000}, 
-    {0x3e208000}, {0x3e20a000}, {0x3e20c000}, {0x3e20e000}, 
-    {0x3e210000}, {0x3e212000}, {0x3e214000}, {0x3e216000}, 
-    {0x3e218000}, {0x3e21a000}, {0x3e21c000}, {0x3e21e000}, 
-    {0x3e220000}, {0x3e222000}, {0x3e224000}, {0x3e226000}, 
-    {0x3e228000}, {0x3e22a000}, {0x3e22c000}, {0x3e22e000}, 
-    {0x3e230000}, {0x3e232000}, {0x3e234000}, {0x3e236000}, 
-    {0x3e238000}, {0x3e23a000}, {0x3e23c000}, {0x3e23e000}, 
-    {0x3e240000}, {0x3e242000}, {0x3e244000}, {0x3e246000}, 
-    {0x3e248000}, {0x3e24a000}, {0x3e24c000}, {0x3e24e000}, 
-    {0x3e250000}, {0x3e252000}, {0x3e254000}, {0x3e256000}, 
-    {0x3e258000}, {0x3e25a000}, {0x3e25c000}, {0x3e25e000}, 
-    {0x3e260000}, {0x3e262000}, {0x3e264000}, {0x3e266000}, 
-    {0x3e268000}, {0x3e26a000}, {0x3e26c000}, {0x3e26e000}, 
-    {0x3e270000}, {0x3e272000}, {0x3e274000}, {0x3e276000}, 
-    {0x3e278000}, {0x3e27a000}, {0x3e27c000}, {0x3e27e000}, 
-    {0x3e280000}, {0x3e282000}, {0x3e284000}, {0x3e286000}, 
-    {0x3e288000}, {0x3e28a000}, {0x3e28c000}, {0x3e28e000}, 
-    {0x3e290000}, {0x3e292000}, {0x3e294000}, {0x3e296000}, 
-    {0x3e298000}, {0x3e29a000}, {0x3e29c000}, {0x3e29e000}, 
-    {0x3e2a0000}, {0x3e2a2000}, {0x3e2a4000}, {0x3e2a6000}, 
-    {0x3e2a8000}, {0x3e2aa000}, {0x3e2ac000}, {0x3e2ae000}, 
-    {0x3e2b0000}, {0x3e2b2000}, {0x3e2b4000}, {0x3e2b6000}, 
-    {0x3e2b8000}, {0x3e2ba000}, {0x3e2bc000}, {0x3e2be000}, 
-    {0x3e2c0000}, {0x3e2c2000}, {0x3e2c4000}, {0x3e2c6000}, 
-    {0x3e2c8000}, {0x3e2ca000}, {0x3e2cc000}, {0x3e2ce000}, 
-    {0x3e2d0000}, {0x3e2d2000}, {0x3e2d4000}, {0x3e2d6000}, 
-    {0x3e2d8000}, {0x3e2da000}, {0x3e2dc000}, {0x3e2de000}, 
-    {0x3e2e0000}, {0x3e2e2000}, {0x3e2e4000}, {0x3e2e6000}, 
-    {0x3e2e8000}, {0x3e2ea000}, {0x3e2ec000}, {0x3e2ee000}, 
-    {0x3e2f0000}, {0x3e2f2000}, {0x3e2f4000}, {0x3e2f6000}, 
-    {0x3e2f8000}, {0x3e2fa000}, {0x3e2fc000}, {0x3e2fe000}, 
-    {0x3e300000}, {0x3e302000}, {0x3e304000}, {0x3e306000}, 
-    {0x3e308000}, {0x3e30a000}, {0x3e30c000}, {0x3e30e000}, 
-    {0x3e310000}, {0x3e312000}, {0x3e314000}, {0x3e316000}, 
-    {0x3e318000}, {0x3e31a000}, {0x3e31c000}, {0x3e31e000}, 
-    {0x3e320000}, {0x3e322000}, {0x3e324000}, {0x3e326000}, 
-    {0x3e328000}, {0x3e32a000}, {0x3e32c000}, {0x3e32e000}, 
-    {0x3e330000}, {0x3e332000}, {0x3e334000}, {0x3e336000}, 
-    {0x3e338000}, {0x3e33a000}, {0x3e33c000}, {0x3e33e000}, 
-    {0x3e340000}, {0x3e342000}, {0x3e344000}, {0x3e346000}, 
-    {0x3e348000}, {0x3e34a000}, {0x3e34c000}, {0x3e34e000}, 
-    {0x3e350000}, {0x3e352000}, {0x3e354000}, {0x3e356000}, 
-    {0x3e358000}, {0x3e35a000}, {0x3e35c000}, {0x3e35e000}, 
-    {0x3e360000}, {0x3e362000}, {0x3e364000}, {0x3e366000}, 
-    {0x3e368000}, {0x3e36a000}, {0x3e36c000}, {0x3e36e000}, 
-    {0x3e370000}, {0x3e372000}, {0x3e374000}, {0x3e376000}, 
-    {0x3e378000}, {0x3e37a000}, {0x3e37c000}, {0x3e37e000}, 
-    {0x3e380000}, {0x3e382000}, {0x3e384000}, {0x3e386000}, 
-    {0x3e388000}, {0x3e38a000}, {0x3e38c000}, {0x3e38e000}, 
-    {0x3e390000}, {0x3e392000}, {0x3e394000}, {0x3e396000}, 
-    {0x3e398000}, {0x3e39a000}, {0x3e39c000}, {0x3e39e000}, 
-    {0x3e3a0000}, {0x3e3a2000}, {0x3e3a4000}, {0x3e3a6000}, 
-    {0x3e3a8000}, {0x3e3aa000}, {0x3e3ac000}, {0x3e3ae000}, 
-    {0x3e3b0000}, {0x3e3b2000}, {0x3e3b4000}, {0x3e3b6000}, 
-    {0x3e3b8000}, {0x3e3ba000}, {0x3e3bc000}, {0x3e3be000}, 
-    {0x3e3c0000}, {0x3e3c2000}, {0x3e3c4000}, {0x3e3c6000}, 
-    {0x3e3c8000}, {0x3e3ca000}, {0x3e3cc000}, {0x3e3ce000}, 
-    {0x3e3d0000}, {0x3e3d2000}, {0x3e3d4000}, {0x3e3d6000}, 
-    {0x3e3d8000}, {0x3e3da000}, {0x3e3dc000}, {0x3e3de000}, 
-    {0x3e3e0000}, {0x3e3e2000}, {0x3e3e4000}, {0x3e3e6000}, 
-    {0x3e3e8000}, {0x3e3ea000}, {0x3e3ec000}, {0x3e3ee000}, 
-    {0x3e3f0000}, {0x3e3f2000}, {0x3e3f4000}, {0x3e3f6000}, 
-    {0x3e3f8000}, {0x3e3fa000}, {0x3e3fc000}, {0x3e3fe000}, 
-    {0x3e400000}, {0x3e402000}, {0x3e404000}, {0x3e406000}, 
-    {0x3e408000}, {0x3e40a000}, {0x3e40c000}, {0x3e40e000}, 
-    {0x3e410000}, {0x3e412000}, {0x3e414000}, {0x3e416000}, 
-    {0x3e418000}, {0x3e41a000}, {0x3e41c000}, {0x3e41e000}, 
-    {0x3e420000}, {0x3e422000}, {0x3e424000}, {0x3e426000}, 
-    {0x3e428000}, {0x3e42a000}, {0x3e42c000}, {0x3e42e000}, 
-    {0x3e430000}, {0x3e432000}, {0x3e434000}, {0x3e436000}, 
-    {0x3e438000}, {0x3e43a000}, {0x3e43c000}, {0x3e43e000}, 
-    {0x3e440000}, {0x3e442000}, {0x3e444000}, {0x3e446000}, 
-    {0x3e448000}, {0x3e44a000}, {0x3e44c000}, {0x3e44e000}, 
-    {0x3e450000}, {0x3e452000}, {0x3e454000}, {0x3e456000}, 
-    {0x3e458000}, {0x3e45a000}, {0x3e45c000}, {0x3e45e000}, 
-    {0x3e460000}, {0x3e462000}, {0x3e464000}, {0x3e466000}, 
-    {0x3e468000}, {0x3e46a000}, {0x3e46c000}, {0x3e46e000}, 
-    {0x3e470000}, {0x3e472000}, {0x3e474000}, {0x3e476000}, 
-    {0x3e478000}, {0x3e47a000}, {0x3e47c000}, {0x3e47e000}, 
-    {0x3e480000}, {0x3e482000}, {0x3e484000}, {0x3e486000}, 
-    {0x3e488000}, {0x3e48a000}, {0x3e48c000}, {0x3e48e000}, 
-    {0x3e490000}, {0x3e492000}, {0x3e494000}, {0x3e496000}, 
-    {0x3e498000}, {0x3e49a000}, {0x3e49c000}, {0x3e49e000}, 
-    {0x3e4a0000}, {0x3e4a2000}, {0x3e4a4000}, {0x3e4a6000}, 
-    {0x3e4a8000}, {0x3e4aa000}, {0x3e4ac000}, {0x3e4ae000}, 
-    {0x3e4b0000}, {0x3e4b2000}, {0x3e4b4000}, {0x3e4b6000}, 
-    {0x3e4b8000}, {0x3e4ba000}, {0x3e4bc000}, {0x3e4be000}, 
-    {0x3e4c0000}, {0x3e4c2000}, {0x3e4c4000}, {0x3e4c6000}, 
-    {0x3e4c8000}, {0x3e4ca000}, {0x3e4cc000}, {0x3e4ce000}, 
-    {0x3e4d0000}, {0x3e4d2000}, {0x3e4d4000}, {0x3e4d6000}, 
-    {0x3e4d8000}, {0x3e4da000}, {0x3e4dc000}, {0x3e4de000}, 
-    {0x3e4e0000}, {0x3e4e2000}, {0x3e4e4000}, {0x3e4e6000}, 
-    {0x3e4e8000}, {0x3e4ea000}, {0x3e4ec000}, {0x3e4ee000}, 
-    {0x3e4f0000}, {0x3e4f2000}, {0x3e4f4000}, {0x3e4f6000}, 
-    {0x3e4f8000}, {0x3e4fa000}, {0x3e4fc000}, {0x3e4fe000}, 
-    {0x3e500000}, {0x3e502000}, {0x3e504000}, {0x3e506000}, 
-    {0x3e508000}, {0x3e50a000}, {0x3e50c000}, {0x3e50e000}, 
-    {0x3e510000}, {0x3e512000}, {0x3e514000}, {0x3e516000}, 
-    {0x3e518000}, {0x3e51a000}, {0x3e51c000}, {0x3e51e000}, 
-    {0x3e520000}, {0x3e522000}, {0x3e524000}, {0x3e526000}, 
-    {0x3e528000}, {0x3e52a000}, {0x3e52c000}, {0x3e52e000}, 
-    {0x3e530000}, {0x3e532000}, {0x3e534000}, {0x3e536000}, 
-    {0x3e538000}, {0x3e53a000}, {0x3e53c000}, {0x3e53e000}, 
-    {0x3e540000}, {0x3e542000}, {0x3e544000}, {0x3e546000}, 
-    {0x3e548000}, {0x3e54a000}, {0x3e54c000}, {0x3e54e000}, 
-    {0x3e550000}, {0x3e552000}, {0x3e554000}, {0x3e556000}, 
-    {0x3e558000}, {0x3e55a000}, {0x3e55c000}, {0x3e55e000}, 
-    {0x3e560000}, {0x3e562000}, {0x3e564000}, {0x3e566000}, 
-    {0x3e568000}, {0x3e56a000}, {0x3e56c000}, {0x3e56e000}, 
-    {0x3e570000}, {0x3e572000}, {0x3e574000}, {0x3e576000}, 
-    {0x3e578000}, {0x3e57a000}, {0x3e57c000}, {0x3e57e000}, 
-    {0x3e580000}, {0x3e582000}, {0x3e584000}, {0x3e586000}, 
-    {0x3e588000}, {0x3e58a000}, {0x3e58c000}, {0x3e58e000}, 
-    {0x3e590000}, {0x3e592000}, {0x3e594000}, {0x3e596000}, 
-    {0x3e598000}, {0x3e59a000}, {0x3e59c000}, {0x3e59e000}, 
-    {0x3e5a0000}, {0x3e5a2000}, {0x3e5a4000}, {0x3e5a6000}, 
-    {0x3e5a8000}, {0x3e5aa000}, {0x3e5ac000}, {0x3e5ae000}, 
-    {0x3e5b0000}, {0x3e5b2000}, {0x3e5b4000}, {0x3e5b6000}, 
-    {0x3e5b8000}, {0x3e5ba000}, {0x3e5bc000}, {0x3e5be000}, 
-    {0x3e5c0000}, {0x3e5c2000}, {0x3e5c4000}, {0x3e5c6000}, 
-    {0x3e5c8000}, {0x3e5ca000}, {0x3e5cc000}, {0x3e5ce000}, 
-    {0x3e5d0000}, {0x3e5d2000}, {0x3e5d4000}, {0x3e5d6000}, 
-    {0x3e5d8000}, {0x3e5da000}, {0x3e5dc000}, {0x3e5de000}, 
-    {0x3e5e0000}, {0x3e5e2000}, {0x3e5e4000}, {0x3e5e6000}, 
-    {0x3e5e8000}, {0x3e5ea000}, {0x3e5ec000}, {0x3e5ee000}, 
-    {0x3e5f0000}, {0x3e5f2000}, {0x3e5f4000}, {0x3e5f6000}, 
-    {0x3e5f8000}, {0x3e5fa000}, {0x3e5fc000}, {0x3e5fe000}, 
-    {0x3e600000}, {0x3e602000}, {0x3e604000}, {0x3e606000}, 
-    {0x3e608000}, {0x3e60a000}, {0x3e60c000}, {0x3e60e000}, 
-    {0x3e610000}, {0x3e612000}, {0x3e614000}, {0x3e616000}, 
-    {0x3e618000}, {0x3e61a000}, {0x3e61c000}, {0x3e61e000}, 
-    {0x3e620000}, {0x3e622000}, {0x3e624000}, {0x3e626000}, 
-    {0x3e628000}, {0x3e62a000}, {0x3e62c000}, {0x3e62e000}, 
-    {0x3e630000}, {0x3e632000}, {0x3e634000}, {0x3e636000}, 
-    {0x3e638000}, {0x3e63a000}, {0x3e63c000}, {0x3e63e000}, 
-    {0x3e640000}, {0x3e642000}, {0x3e644000}, {0x3e646000}, 
-    {0x3e648000}, {0x3e64a000}, {0x3e64c000}, {0x3e64e000}, 
-    {0x3e650000}, {0x3e652000}, {0x3e654000}, {0x3e656000}, 
-    {0x3e658000}, {0x3e65a000}, {0x3e65c000}, {0x3e65e000}, 
-    {0x3e660000}, {0x3e662000}, {0x3e664000}, {0x3e666000}, 
-    {0x3e668000}, {0x3e66a000}, {0x3e66c000}, {0x3e66e000}, 
-    {0x3e670000}, {0x3e672000}, {0x3e674000}, {0x3e676000}, 
-    {0x3e678000}, {0x3e67a000}, {0x3e67c000}, {0x3e67e000}, 
-    {0x3e680000}, {0x3e682000}, {0x3e684000}, {0x3e686000}, 
-    {0x3e688000}, {0x3e68a000}, {0x3e68c000}, {0x3e68e000}, 
-    {0x3e690000}, {0x3e692000}, {0x3e694000}, {0x3e696000}, 
-    {0x3e698000}, {0x3e69a000}, {0x3e69c000}, {0x3e69e000}, 
-    {0x3e6a0000}, {0x3e6a2000}, {0x3e6a4000}, {0x3e6a6000}, 
-    {0x3e6a8000}, {0x3e6aa000}, {0x3e6ac000}, {0x3e6ae000}, 
-    {0x3e6b0000}, {0x3e6b2000}, {0x3e6b4000}, {0x3e6b6000}, 
-    {0x3e6b8000}, {0x3e6ba000}, {0x3e6bc000}, {0x3e6be000}, 
-    {0x3e6c0000}, {0x3e6c2000}, {0x3e6c4000}, {0x3e6c6000}, 
-    {0x3e6c8000}, {0x3e6ca000}, {0x3e6cc000}, {0x3e6ce000}, 
-    {0x3e6d0000}, {0x3e6d2000}, {0x3e6d4000}, {0x3e6d6000}, 
-    {0x3e6d8000}, {0x3e6da000}, {0x3e6dc000}, {0x3e6de000}, 
-    {0x3e6e0000}, {0x3e6e2000}, {0x3e6e4000}, {0x3e6e6000}, 
-    {0x3e6e8000}, {0x3e6ea000}, {0x3e6ec000}, {0x3e6ee000}, 
-    {0x3e6f0000}, {0x3e6f2000}, {0x3e6f4000}, {0x3e6f6000}, 
-    {0x3e6f8000}, {0x3e6fa000}, {0x3e6fc000}, {0x3e6fe000}, 
-    {0x3e700000}, {0x3e702000}, {0x3e704000}, {0x3e706000}, 
-    {0x3e708000}, {0x3e70a000}, {0x3e70c000}, {0x3e70e000}, 
-    {0x3e710000}, {0x3e712000}, {0x3e714000}, {0x3e716000}, 
-    {0x3e718000}, {0x3e71a000}, {0x3e71c000}, {0x3e71e000}, 
-    {0x3e720000}, {0x3e722000}, {0x3e724000}, {0x3e726000}, 
-    {0x3e728000}, {0x3e72a000}, {0x3e72c000}, {0x3e72e000}, 
-    {0x3e730000}, {0x3e732000}, {0x3e734000}, {0x3e736000}, 
-    {0x3e738000}, {0x3e73a000}, {0x3e73c000}, {0x3e73e000}, 
-    {0x3e740000}, {0x3e742000}, {0x3e744000}, {0x3e746000}, 
-    {0x3e748000}, {0x3e74a000}, {0x3e74c000}, {0x3e74e000}, 
-    {0x3e750000}, {0x3e752000}, {0x3e754000}, {0x3e756000}, 
-    {0x3e758000}, {0x3e75a000}, {0x3e75c000}, {0x3e75e000}, 
-    {0x3e760000}, {0x3e762000}, {0x3e764000}, {0x3e766000}, 
-    {0x3e768000}, {0x3e76a000}, {0x3e76c000}, {0x3e76e000}, 
-    {0x3e770000}, {0x3e772000}, {0x3e774000}, {0x3e776000}, 
-    {0x3e778000}, {0x3e77a000}, {0x3e77c000}, {0x3e77e000}, 
-    {0x3e780000}, {0x3e782000}, {0x3e784000}, {0x3e786000}, 
-    {0x3e788000}, {0x3e78a000}, {0x3e78c000}, {0x3e78e000}, 
-    {0x3e790000}, {0x3e792000}, {0x3e794000}, {0x3e796000}, 
-    {0x3e798000}, {0x3e79a000}, {0x3e79c000}, {0x3e79e000}, 
-    {0x3e7a0000}, {0x3e7a2000}, {0x3e7a4000}, {0x3e7a6000}, 
-    {0x3e7a8000}, {0x3e7aa000}, {0x3e7ac000}, {0x3e7ae000}, 
-    {0x3e7b0000}, {0x3e7b2000}, {0x3e7b4000}, {0x3e7b6000}, 
-    {0x3e7b8000}, {0x3e7ba000}, {0x3e7bc000}, {0x3e7be000}, 
-    {0x3e7c0000}, {0x3e7c2000}, {0x3e7c4000}, {0x3e7c6000}, 
-    {0x3e7c8000}, {0x3e7ca000}, {0x3e7cc000}, {0x3e7ce000}, 
-    {0x3e7d0000}, {0x3e7d2000}, {0x3e7d4000}, {0x3e7d6000}, 
-    {0x3e7d8000}, {0x3e7da000}, {0x3e7dc000}, {0x3e7de000}, 
-    {0x3e7e0000}, {0x3e7e2000}, {0x3e7e4000}, {0x3e7e6000}, 
-    {0x3e7e8000}, {0x3e7ea000}, {0x3e7ec000}, {0x3e7ee000}, 
-    {0x3e7f0000}, {0x3e7f2000}, {0x3e7f4000}, {0x3e7f6000}, 
-    {0x3e7f8000}, {0x3e7fa000}, {0x3e7fc000}, {0x3e7fe000}, 
-    {0x3e800000}, {0x3e802000}, {0x3e804000}, {0x3e806000}, 
-    {0x3e808000}, {0x3e80a000}, {0x3e80c000}, {0x3e80e000}, 
-    {0x3e810000}, {0x3e812000}, {0x3e814000}, {0x3e816000}, 
-    {0x3e818000}, {0x3e81a000}, {0x3e81c000}, {0x3e81e000}, 
-    {0x3e820000}, {0x3e822000}, {0x3e824000}, {0x3e826000}, 
-    {0x3e828000}, {0x3e82a000}, {0x3e82c000}, {0x3e82e000}, 
-    {0x3e830000}, {0x3e832000}, {0x3e834000}, {0x3e836000}, 
-    {0x3e838000}, {0x3e83a000}, {0x3e83c000}, {0x3e83e000}, 
-    {0x3e840000}, {0x3e842000}, {0x3e844000}, {0x3e846000}, 
-    {0x3e848000}, {0x3e84a000}, {0x3e84c000}, {0x3e84e000}, 
-    {0x3e850000}, {0x3e852000}, {0x3e854000}, {0x3e856000}, 
-    {0x3e858000}, {0x3e85a000}, {0x3e85c000}, {0x3e85e000}, 
-    {0x3e860000}, {0x3e862000}, {0x3e864000}, {0x3e866000}, 
-    {0x3e868000}, {0x3e86a000}, {0x3e86c000}, {0x3e86e000}, 
-    {0x3e870000}, {0x3e872000}, {0x3e874000}, {0x3e876000}, 
-    {0x3e878000}, {0x3e87a000}, {0x3e87c000}, {0x3e87e000}, 
-    {0x3e880000}, {0x3e882000}, {0x3e884000}, {0x3e886000}, 
-    {0x3e888000}, {0x3e88a000}, {0x3e88c000}, {0x3e88e000}, 
-    {0x3e890000}, {0x3e892000}, {0x3e894000}, {0x3e896000}, 
-    {0x3e898000}, {0x3e89a000}, {0x3e89c000}, {0x3e89e000}, 
-    {0x3e8a0000}, {0x3e8a2000}, {0x3e8a4000}, {0x3e8a6000}, 
-    {0x3e8a8000}, {0x3e8aa000}, {0x3e8ac000}, {0x3e8ae000}, 
-    {0x3e8b0000}, {0x3e8b2000}, {0x3e8b4000}, {0x3e8b6000}, 
-    {0x3e8b8000}, {0x3e8ba000}, {0x3e8bc000}, {0x3e8be000}, 
-    {0x3e8c0000}, {0x3e8c2000}, {0x3e8c4000}, {0x3e8c6000}, 
-    {0x3e8c8000}, {0x3e8ca000}, {0x3e8cc000}, {0x3e8ce000}, 
-    {0x3e8d0000}, {0x3e8d2000}, {0x3e8d4000}, {0x3e8d6000}, 
-    {0x3e8d8000}, {0x3e8da000}, {0x3e8dc000}, {0x3e8de000}, 
-    {0x3e8e0000}, {0x3e8e2000}, {0x3e8e4000}, {0x3e8e6000}, 
-    {0x3e8e8000}, {0x3e8ea000}, {0x3e8ec000}, {0x3e8ee000}, 
-    {0x3e8f0000}, {0x3e8f2000}, {0x3e8f4000}, {0x3e8f6000}, 
-    {0x3e8f8000}, {0x3e8fa000}, {0x3e8fc000}, {0x3e8fe000}, 
-    {0x3e900000}, {0x3e902000}, {0x3e904000}, {0x3e906000}, 
-    {0x3e908000}, {0x3e90a000}, {0x3e90c000}, {0x3e90e000}, 
-    {0x3e910000}, {0x3e912000}, {0x3e914000}, {0x3e916000}, 
-    {0x3e918000}, {0x3e91a000}, {0x3e91c000}, {0x3e91e000}, 
-    {0x3e920000}, {0x3e922000}, {0x3e924000}, {0x3e926000}, 
-    {0x3e928000}, {0x3e92a000}, {0x3e92c000}, {0x3e92e000}, 
-    {0x3e930000}, {0x3e932000}, {0x3e934000}, {0x3e936000}, 
-    {0x3e938000}, {0x3e93a000}, {0x3e93c000}, {0x3e93e000}, 
-    {0x3e940000}, {0x3e942000}, {0x3e944000}, {0x3e946000}, 
-    {0x3e948000}, {0x3e94a000}, {0x3e94c000}, {0x3e94e000}, 
-    {0x3e950000}, {0x3e952000}, {0x3e954000}, {0x3e956000}, 
-    {0x3e958000}, {0x3e95a000}, {0x3e95c000}, {0x3e95e000}, 
-    {0x3e960000}, {0x3e962000}, {0x3e964000}, {0x3e966000}, 
-    {0x3e968000}, {0x3e96a000}, {0x3e96c000}, {0x3e96e000}, 
-    {0x3e970000}, {0x3e972000}, {0x3e974000}, {0x3e976000}, 
-    {0x3e978000}, {0x3e97a000}, {0x3e97c000}, {0x3e97e000}, 
-    {0x3e980000}, {0x3e982000}, {0x3e984000}, {0x3e986000}, 
-    {0x3e988000}, {0x3e98a000}, {0x3e98c000}, {0x3e98e000}, 
-    {0x3e990000}, {0x3e992000}, {0x3e994000}, {0x3e996000}, 
-    {0x3e998000}, {0x3e99a000}, {0x3e99c000}, {0x3e99e000}, 
-    {0x3e9a0000}, {0x3e9a2000}, {0x3e9a4000}, {0x3e9a6000}, 
-    {0x3e9a8000}, {0x3e9aa000}, {0x3e9ac000}, {0x3e9ae000}, 
-    {0x3e9b0000}, {0x3e9b2000}, {0x3e9b4000}, {0x3e9b6000}, 
-    {0x3e9b8000}, {0x3e9ba000}, {0x3e9bc000}, {0x3e9be000}, 
-    {0x3e9c0000}, {0x3e9c2000}, {0x3e9c4000}, {0x3e9c6000}, 
-    {0x3e9c8000}, {0x3e9ca000}, {0x3e9cc000}, {0x3e9ce000}, 
-    {0x3e9d0000}, {0x3e9d2000}, {0x3e9d4000}, {0x3e9d6000}, 
-    {0x3e9d8000}, {0x3e9da000}, {0x3e9dc000}, {0x3e9de000}, 
-    {0x3e9e0000}, {0x3e9e2000}, {0x3e9e4000}, {0x3e9e6000}, 
-    {0x3e9e8000}, {0x3e9ea000}, {0x3e9ec000}, {0x3e9ee000}, 
-    {0x3e9f0000}, {0x3e9f2000}, {0x3e9f4000}, {0x3e9f6000}, 
-    {0x3e9f8000}, {0x3e9fa000}, {0x3e9fc000}, {0x3e9fe000}, 
-    {0x3ea00000}, {0x3ea02000}, {0x3ea04000}, {0x3ea06000}, 
-    {0x3ea08000}, {0x3ea0a000}, {0x3ea0c000}, {0x3ea0e000}, 
-    {0x3ea10000}, {0x3ea12000}, {0x3ea14000}, {0x3ea16000}, 
-    {0x3ea18000}, {0x3ea1a000}, {0x3ea1c000}, {0x3ea1e000}, 
-    {0x3ea20000}, {0x3ea22000}, {0x3ea24000}, {0x3ea26000}, 
-    {0x3ea28000}, {0x3ea2a000}, {0x3ea2c000}, {0x3ea2e000}, 
-    {0x3ea30000}, {0x3ea32000}, {0x3ea34000}, {0x3ea36000}, 
-    {0x3ea38000}, {0x3ea3a000}, {0x3ea3c000}, {0x3ea3e000}, 
-    {0x3ea40000}, {0x3ea42000}, {0x3ea44000}, {0x3ea46000}, 
-    {0x3ea48000}, {0x3ea4a000}, {0x3ea4c000}, {0x3ea4e000}, 
-    {0x3ea50000}, {0x3ea52000}, {0x3ea54000}, {0x3ea56000}, 
-    {0x3ea58000}, {0x3ea5a000}, {0x3ea5c000}, {0x3ea5e000}, 
-    {0x3ea60000}, {0x3ea62000}, {0x3ea64000}, {0x3ea66000}, 
-    {0x3ea68000}, {0x3ea6a000}, {0x3ea6c000}, {0x3ea6e000}, 
-    {0x3ea70000}, {0x3ea72000}, {0x3ea74000}, {0x3ea76000}, 
-    {0x3ea78000}, {0x3ea7a000}, {0x3ea7c000}, {0x3ea7e000}, 
-    {0x3ea80000}, {0x3ea82000}, {0x3ea84000}, {0x3ea86000}, 
-    {0x3ea88000}, {0x3ea8a000}, {0x3ea8c000}, {0x3ea8e000}, 
-    {0x3ea90000}, {0x3ea92000}, {0x3ea94000}, {0x3ea96000}, 
-    {0x3ea98000}, {0x3ea9a000}, {0x3ea9c000}, {0x3ea9e000}, 
-    {0x3eaa0000}, {0x3eaa2000}, {0x3eaa4000}, {0x3eaa6000}, 
-    {0x3eaa8000}, {0x3eaaa000}, {0x3eaac000}, {0x3eaae000}, 
-    {0x3eab0000}, {0x3eab2000}, {0x3eab4000}, {0x3eab6000}, 
-    {0x3eab8000}, {0x3eaba000}, {0x3eabc000}, {0x3eabe000}, 
-    {0x3eac0000}, {0x3eac2000}, {0x3eac4000}, {0x3eac6000}, 
-    {0x3eac8000}, {0x3eaca000}, {0x3eacc000}, {0x3eace000}, 
-    {0x3ead0000}, {0x3ead2000}, {0x3ead4000}, {0x3ead6000}, 
-    {0x3ead8000}, {0x3eada000}, {0x3eadc000}, {0x3eade000}, 
-    {0x3eae0000}, {0x3eae2000}, {0x3eae4000}, {0x3eae6000}, 
-    {0x3eae8000}, {0x3eaea000}, {0x3eaec000}, {0x3eaee000}, 
-    {0x3eaf0000}, {0x3eaf2000}, {0x3eaf4000}, {0x3eaf6000}, 
-    {0x3eaf8000}, {0x3eafa000}, {0x3eafc000}, {0x3eafe000}, 
-    {0x3eb00000}, {0x3eb02000}, {0x3eb04000}, {0x3eb06000}, 
-    {0x3eb08000}, {0x3eb0a000}, {0x3eb0c000}, {0x3eb0e000}, 
-    {0x3eb10000}, {0x3eb12000}, {0x3eb14000}, {0x3eb16000}, 
-    {0x3eb18000}, {0x3eb1a000}, {0x3eb1c000}, {0x3eb1e000}, 
-    {0x3eb20000}, {0x3eb22000}, {0x3eb24000}, {0x3eb26000}, 
-    {0x3eb28000}, {0x3eb2a000}, {0x3eb2c000}, {0x3eb2e000}, 
-    {0x3eb30000}, {0x3eb32000}, {0x3eb34000}, {0x3eb36000}, 
-    {0x3eb38000}, {0x3eb3a000}, {0x3eb3c000}, {0x3eb3e000}, 
-    {0x3eb40000}, {0x3eb42000}, {0x3eb44000}, {0x3eb46000}, 
-    {0x3eb48000}, {0x3eb4a000}, {0x3eb4c000}, {0x3eb4e000}, 
-    {0x3eb50000}, {0x3eb52000}, {0x3eb54000}, {0x3eb56000}, 
-    {0x3eb58000}, {0x3eb5a000}, {0x3eb5c000}, {0x3eb5e000}, 
-    {0x3eb60000}, {0x3eb62000}, {0x3eb64000}, {0x3eb66000}, 
-    {0x3eb68000}, {0x3eb6a000}, {0x3eb6c000}, {0x3eb6e000}, 
-    {0x3eb70000}, {0x3eb72000}, {0x3eb74000}, {0x3eb76000}, 
-    {0x3eb78000}, {0x3eb7a000}, {0x3eb7c000}, {0x3eb7e000}, 
-    {0x3eb80000}, {0x3eb82000}, {0x3eb84000}, {0x3eb86000}, 
-    {0x3eb88000}, {0x3eb8a000}, {0x3eb8c000}, {0x3eb8e000}, 
-    {0x3eb90000}, {0x3eb92000}, {0x3eb94000}, {0x3eb96000}, 
-    {0x3eb98000}, {0x3eb9a000}, {0x3eb9c000}, {0x3eb9e000}, 
-    {0x3eba0000}, {0x3eba2000}, {0x3eba4000}, {0x3eba6000}, 
-    {0x3eba8000}, {0x3ebaa000}, {0x3ebac000}, {0x3ebae000}, 
-    {0x3ebb0000}, {0x3ebb2000}, {0x3ebb4000}, {0x3ebb6000}, 
-    {0x3ebb8000}, {0x3ebba000}, {0x3ebbc000}, {0x3ebbe000}, 
-    {0x3ebc0000}, {0x3ebc2000}, {0x3ebc4000}, {0x3ebc6000}, 
-    {0x3ebc8000}, {0x3ebca000}, {0x3ebcc000}, {0x3ebce000}, 
-    {0x3ebd0000}, {0x3ebd2000}, {0x3ebd4000}, {0x3ebd6000}, 
-    {0x3ebd8000}, {0x3ebda000}, {0x3ebdc000}, {0x3ebde000}, 
-    {0x3ebe0000}, {0x3ebe2000}, {0x3ebe4000}, {0x3ebe6000}, 
-    {0x3ebe8000}, {0x3ebea000}, {0x3ebec000}, {0x3ebee000}, 
-    {0x3ebf0000}, {0x3ebf2000}, {0x3ebf4000}, {0x3ebf6000}, 
-    {0x3ebf8000}, {0x3ebfa000}, {0x3ebfc000}, {0x3ebfe000}, 
-    {0x3ec00000}, {0x3ec02000}, {0x3ec04000}, {0x3ec06000}, 
-    {0x3ec08000}, {0x3ec0a000}, {0x3ec0c000}, {0x3ec0e000}, 
-    {0x3ec10000}, {0x3ec12000}, {0x3ec14000}, {0x3ec16000}, 
-    {0x3ec18000}, {0x3ec1a000}, {0x3ec1c000}, {0x3ec1e000}, 
-    {0x3ec20000}, {0x3ec22000}, {0x3ec24000}, {0x3ec26000}, 
-    {0x3ec28000}, {0x3ec2a000}, {0x3ec2c000}, {0x3ec2e000}, 
-    {0x3ec30000}, {0x3ec32000}, {0x3ec34000}, {0x3ec36000}, 
-    {0x3ec38000}, {0x3ec3a000}, {0x3ec3c000}, {0x3ec3e000}, 
-    {0x3ec40000}, {0x3ec42000}, {0x3ec44000}, {0x3ec46000}, 
-    {0x3ec48000}, {0x3ec4a000}, {0x3ec4c000}, {0x3ec4e000}, 
-    {0x3ec50000}, {0x3ec52000}, {0x3ec54000}, {0x3ec56000}, 
-    {0x3ec58000}, {0x3ec5a000}, {0x3ec5c000}, {0x3ec5e000}, 
-    {0x3ec60000}, {0x3ec62000}, {0x3ec64000}, {0x3ec66000}, 
-    {0x3ec68000}, {0x3ec6a000}, {0x3ec6c000}, {0x3ec6e000}, 
-    {0x3ec70000}, {0x3ec72000}, {0x3ec74000}, {0x3ec76000}, 
-    {0x3ec78000}, {0x3ec7a000}, {0x3ec7c000}, {0x3ec7e000}, 
-    {0x3ec80000}, {0x3ec82000}, {0x3ec84000}, {0x3ec86000}, 
-    {0x3ec88000}, {0x3ec8a000}, {0x3ec8c000}, {0x3ec8e000}, 
-    {0x3ec90000}, {0x3ec92000}, {0x3ec94000}, {0x3ec96000}, 
-    {0x3ec98000}, {0x3ec9a000}, {0x3ec9c000}, {0x3ec9e000}, 
-    {0x3eca0000}, {0x3eca2000}, {0x3eca4000}, {0x3eca6000}, 
-    {0x3eca8000}, {0x3ecaa000}, {0x3ecac000}, {0x3ecae000}, 
-    {0x3ecb0000}, {0x3ecb2000}, {0x3ecb4000}, {0x3ecb6000}, 
-    {0x3ecb8000}, {0x3ecba000}, {0x3ecbc000}, {0x3ecbe000}, 
-    {0x3ecc0000}, {0x3ecc2000}, {0x3ecc4000}, {0x3ecc6000}, 
-    {0x3ecc8000}, {0x3ecca000}, {0x3eccc000}, {0x3ecce000}, 
-    {0x3ecd0000}, {0x3ecd2000}, {0x3ecd4000}, {0x3ecd6000}, 
-    {0x3ecd8000}, {0x3ecda000}, {0x3ecdc000}, {0x3ecde000}, 
-    {0x3ece0000}, {0x3ece2000}, {0x3ece4000}, {0x3ece6000}, 
-    {0x3ece8000}, {0x3ecea000}, {0x3ecec000}, {0x3ecee000}, 
-    {0x3ecf0000}, {0x3ecf2000}, {0x3ecf4000}, {0x3ecf6000}, 
-    {0x3ecf8000}, {0x3ecfa000}, {0x3ecfc000}, {0x3ecfe000}, 
-    {0x3ed00000}, {0x3ed02000}, {0x3ed04000}, {0x3ed06000}, 
-    {0x3ed08000}, {0x3ed0a000}, {0x3ed0c000}, {0x3ed0e000}, 
-    {0x3ed10000}, {0x3ed12000}, {0x3ed14000}, {0x3ed16000}, 
-    {0x3ed18000}, {0x3ed1a000}, {0x3ed1c000}, {0x3ed1e000}, 
-    {0x3ed20000}, {0x3ed22000}, {0x3ed24000}, {0x3ed26000}, 
-    {0x3ed28000}, {0x3ed2a000}, {0x3ed2c000}, {0x3ed2e000}, 
-    {0x3ed30000}, {0x3ed32000}, {0x3ed34000}, {0x3ed36000}, 
-    {0x3ed38000}, {0x3ed3a000}, {0x3ed3c000}, {0x3ed3e000}, 
-    {0x3ed40000}, {0x3ed42000}, {0x3ed44000}, {0x3ed46000}, 
-    {0x3ed48000}, {0x3ed4a000}, {0x3ed4c000}, {0x3ed4e000}, 
-    {0x3ed50000}, {0x3ed52000}, {0x3ed54000}, {0x3ed56000}, 
-    {0x3ed58000}, {0x3ed5a000}, {0x3ed5c000}, {0x3ed5e000}, 
-    {0x3ed60000}, {0x3ed62000}, {0x3ed64000}, {0x3ed66000}, 
-    {0x3ed68000}, {0x3ed6a000}, {0x3ed6c000}, {0x3ed6e000}, 
-    {0x3ed70000}, {0x3ed72000}, {0x3ed74000}, {0x3ed76000}, 
-    {0x3ed78000}, {0x3ed7a000}, {0x3ed7c000}, {0x3ed7e000}, 
-    {0x3ed80000}, {0x3ed82000}, {0x3ed84000}, {0x3ed86000}, 
-    {0x3ed88000}, {0x3ed8a000}, {0x3ed8c000}, {0x3ed8e000}, 
-    {0x3ed90000}, {0x3ed92000}, {0x3ed94000}, {0x3ed96000}, 
-    {0x3ed98000}, {0x3ed9a000}, {0x3ed9c000}, {0x3ed9e000}, 
-    {0x3eda0000}, {0x3eda2000}, {0x3eda4000}, {0x3eda6000}, 
-    {0x3eda8000}, {0x3edaa000}, {0x3edac000}, {0x3edae000}, 
-    {0x3edb0000}, {0x3edb2000}, {0x3edb4000}, {0x3edb6000}, 
-    {0x3edb8000}, {0x3edba000}, {0x3edbc000}, {0x3edbe000}, 
-    {0x3edc0000}, {0x3edc2000}, {0x3edc4000}, {0x3edc6000}, 
-    {0x3edc8000}, {0x3edca000}, {0x3edcc000}, {0x3edce000}, 
-    {0x3edd0000}, {0x3edd2000}, {0x3edd4000}, {0x3edd6000}, 
-    {0x3edd8000}, {0x3edda000}, {0x3eddc000}, {0x3edde000}, 
-    {0x3ede0000}, {0x3ede2000}, {0x3ede4000}, {0x3ede6000}, 
-    {0x3ede8000}, {0x3edea000}, {0x3edec000}, {0x3edee000}, 
-    {0x3edf0000}, {0x3edf2000}, {0x3edf4000}, {0x3edf6000}, 
-    {0x3edf8000}, {0x3edfa000}, {0x3edfc000}, {0x3edfe000}, 
-    {0x3ee00000}, {0x3ee02000}, {0x3ee04000}, {0x3ee06000}, 
-    {0x3ee08000}, {0x3ee0a000}, {0x3ee0c000}, {0x3ee0e000}, 
-    {0x3ee10000}, {0x3ee12000}, {0x3ee14000}, {0x3ee16000}, 
-    {0x3ee18000}, {0x3ee1a000}, {0x3ee1c000}, {0x3ee1e000}, 
-    {0x3ee20000}, {0x3ee22000}, {0x3ee24000}, {0x3ee26000}, 
-    {0x3ee28000}, {0x3ee2a000}, {0x3ee2c000}, {0x3ee2e000}, 
-    {0x3ee30000}, {0x3ee32000}, {0x3ee34000}, {0x3ee36000}, 
-    {0x3ee38000}, {0x3ee3a000}, {0x3ee3c000}, {0x3ee3e000}, 
-    {0x3ee40000}, {0x3ee42000}, {0x3ee44000}, {0x3ee46000}, 
-    {0x3ee48000}, {0x3ee4a000}, {0x3ee4c000}, {0x3ee4e000}, 
-    {0x3ee50000}, {0x3ee52000}, {0x3ee54000}, {0x3ee56000}, 
-    {0x3ee58000}, {0x3ee5a000}, {0x3ee5c000}, {0x3ee5e000}, 
-    {0x3ee60000}, {0x3ee62000}, {0x3ee64000}, {0x3ee66000}, 
-    {0x3ee68000}, {0x3ee6a000}, {0x3ee6c000}, {0x3ee6e000}, 
-    {0x3ee70000}, {0x3ee72000}, {0x3ee74000}, {0x3ee76000}, 
-    {0x3ee78000}, {0x3ee7a000}, {0x3ee7c000}, {0x3ee7e000}, 
-    {0x3ee80000}, {0x3ee82000}, {0x3ee84000}, {0x3ee86000}, 
-    {0x3ee88000}, {0x3ee8a000}, {0x3ee8c000}, {0x3ee8e000}, 
-    {0x3ee90000}, {0x3ee92000}, {0x3ee94000}, {0x3ee96000}, 
-    {0x3ee98000}, {0x3ee9a000}, {0x3ee9c000}, {0x3ee9e000}, 
-    {0x3eea0000}, {0x3eea2000}, {0x3eea4000}, {0x3eea6000}, 
-    {0x3eea8000}, {0x3eeaa000}, {0x3eeac000}, {0x3eeae000}, 
-    {0x3eeb0000}, {0x3eeb2000}, {0x3eeb4000}, {0x3eeb6000}, 
-    {0x3eeb8000}, {0x3eeba000}, {0x3eebc000}, {0x3eebe000}, 
-    {0x3eec0000}, {0x3eec2000}, {0x3eec4000}, {0x3eec6000}, 
-    {0x3eec8000}, {0x3eeca000}, {0x3eecc000}, {0x3eece000}, 
-    {0x3eed0000}, {0x3eed2000}, {0x3eed4000}, {0x3eed6000}, 
-    {0x3eed8000}, {0x3eeda000}, {0x3eedc000}, {0x3eede000}, 
-    {0x3eee0000}, {0x3eee2000}, {0x3eee4000}, {0x3eee6000}, 
-    {0x3eee8000}, {0x3eeea000}, {0x3eeec000}, {0x3eeee000}, 
-    {0x3eef0000}, {0x3eef2000}, {0x3eef4000}, {0x3eef6000}, 
-    {0x3eef8000}, {0x3eefa000}, {0x3eefc000}, {0x3eefe000}, 
-    {0x3ef00000}, {0x3ef02000}, {0x3ef04000}, {0x3ef06000}, 
-    {0x3ef08000}, {0x3ef0a000}, {0x3ef0c000}, {0x3ef0e000}, 
-    {0x3ef10000}, {0x3ef12000}, {0x3ef14000}, {0x3ef16000}, 
-    {0x3ef18000}, {0x3ef1a000}, {0x3ef1c000}, {0x3ef1e000}, 
-    {0x3ef20000}, {0x3ef22000}, {0x3ef24000}, {0x3ef26000}, 
-    {0x3ef28000}, {0x3ef2a000}, {0x3ef2c000}, {0x3ef2e000}, 
-    {0x3ef30000}, {0x3ef32000}, {0x3ef34000}, {0x3ef36000}, 
-    {0x3ef38000}, {0x3ef3a000}, {0x3ef3c000}, {0x3ef3e000}, 
-    {0x3ef40000}, {0x3ef42000}, {0x3ef44000}, {0x3ef46000}, 
-    {0x3ef48000}, {0x3ef4a000}, {0x3ef4c000}, {0x3ef4e000}, 
-    {0x3ef50000}, {0x3ef52000}, {0x3ef54000}, {0x3ef56000}, 
-    {0x3ef58000}, {0x3ef5a000}, {0x3ef5c000}, {0x3ef5e000}, 
-    {0x3ef60000}, {0x3ef62000}, {0x3ef64000}, {0x3ef66000}, 
-    {0x3ef68000}, {0x3ef6a000}, {0x3ef6c000}, {0x3ef6e000}, 
-    {0x3ef70000}, {0x3ef72000}, {0x3ef74000}, {0x3ef76000}, 
-    {0x3ef78000}, {0x3ef7a000}, {0x3ef7c000}, {0x3ef7e000}, 
-    {0x3ef80000}, {0x3ef82000}, {0x3ef84000}, {0x3ef86000}, 
-    {0x3ef88000}, {0x3ef8a000}, {0x3ef8c000}, {0x3ef8e000}, 
-    {0x3ef90000}, {0x3ef92000}, {0x3ef94000}, {0x3ef96000}, 
-    {0x3ef98000}, {0x3ef9a000}, {0x3ef9c000}, {0x3ef9e000}, 
-    {0x3efa0000}, {0x3efa2000}, {0x3efa4000}, {0x3efa6000}, 
-    {0x3efa8000}, {0x3efaa000}, {0x3efac000}, {0x3efae000}, 
-    {0x3efb0000}, {0x3efb2000}, {0x3efb4000}, {0x3efb6000}, 
-    {0x3efb8000}, {0x3efba000}, {0x3efbc000}, {0x3efbe000}, 
-    {0x3efc0000}, {0x3efc2000}, {0x3efc4000}, {0x3efc6000}, 
-    {0x3efc8000}, {0x3efca000}, {0x3efcc000}, {0x3efce000}, 
-    {0x3efd0000}, {0x3efd2000}, {0x3efd4000}, {0x3efd6000}, 
-    {0x3efd8000}, {0x3efda000}, {0x3efdc000}, {0x3efde000}, 
-    {0x3efe0000}, {0x3efe2000}, {0x3efe4000}, {0x3efe6000}, 
-    {0x3efe8000}, {0x3efea000}, {0x3efec000}, {0x3efee000}, 
-    {0x3eff0000}, {0x3eff2000}, {0x3eff4000}, {0x3eff6000}, 
-    {0x3eff8000}, {0x3effa000}, {0x3effc000}, {0x3effe000}, 
-    {0x3f000000}, {0x3f002000}, {0x3f004000}, {0x3f006000}, 
-    {0x3f008000}, {0x3f00a000}, {0x3f00c000}, {0x3f00e000}, 
-    {0x3f010000}, {0x3f012000}, {0x3f014000}, {0x3f016000}, 
-    {0x3f018000}, {0x3f01a000}, {0x3f01c000}, {0x3f01e000}, 
-    {0x3f020000}, {0x3f022000}, {0x3f024000}, {0x3f026000}, 
-    {0x3f028000}, {0x3f02a000}, {0x3f02c000}, {0x3f02e000}, 
-    {0x3f030000}, {0x3f032000}, {0x3f034000}, {0x3f036000}, 
-    {0x3f038000}, {0x3f03a000}, {0x3f03c000}, {0x3f03e000}, 
-    {0x3f040000}, {0x3f042000}, {0x3f044000}, {0x3f046000}, 
-    {0x3f048000}, {0x3f04a000}, {0x3f04c000}, {0x3f04e000}, 
-    {0x3f050000}, {0x3f052000}, {0x3f054000}, {0x3f056000}, 
-    {0x3f058000}, {0x3f05a000}, {0x3f05c000}, {0x3f05e000}, 
-    {0x3f060000}, {0x3f062000}, {0x3f064000}, {0x3f066000}, 
-    {0x3f068000}, {0x3f06a000}, {0x3f06c000}, {0x3f06e000}, 
-    {0x3f070000}, {0x3f072000}, {0x3f074000}, {0x3f076000}, 
-    {0x3f078000}, {0x3f07a000}, {0x3f07c000}, {0x3f07e000}, 
-    {0x3f080000}, {0x3f082000}, {0x3f084000}, {0x3f086000}, 
-    {0x3f088000}, {0x3f08a000}, {0x3f08c000}, {0x3f08e000}, 
-    {0x3f090000}, {0x3f092000}, {0x3f094000}, {0x3f096000}, 
-    {0x3f098000}, {0x3f09a000}, {0x3f09c000}, {0x3f09e000}, 
-    {0x3f0a0000}, {0x3f0a2000}, {0x3f0a4000}, {0x3f0a6000}, 
-    {0x3f0a8000}, {0x3f0aa000}, {0x3f0ac000}, {0x3f0ae000}, 
-    {0x3f0b0000}, {0x3f0b2000}, {0x3f0b4000}, {0x3f0b6000}, 
-    {0x3f0b8000}, {0x3f0ba000}, {0x3f0bc000}, {0x3f0be000}, 
-    {0x3f0c0000}, {0x3f0c2000}, {0x3f0c4000}, {0x3f0c6000}, 
-    {0x3f0c8000}, {0x3f0ca000}, {0x3f0cc000}, {0x3f0ce000}, 
-    {0x3f0d0000}, {0x3f0d2000}, {0x3f0d4000}, {0x3f0d6000}, 
-    {0x3f0d8000}, {0x3f0da000}, {0x3f0dc000}, {0x3f0de000}, 
-    {0x3f0e0000}, {0x3f0e2000}, {0x3f0e4000}, {0x3f0e6000}, 
-    {0x3f0e8000}, {0x3f0ea000}, {0x3f0ec000}, {0x3f0ee000}, 
-    {0x3f0f0000}, {0x3f0f2000}, {0x3f0f4000}, {0x3f0f6000}, 
-    {0x3f0f8000}, {0x3f0fa000}, {0x3f0fc000}, {0x3f0fe000}, 
-    {0x3f100000}, {0x3f102000}, {0x3f104000}, {0x3f106000}, 
-    {0x3f108000}, {0x3f10a000}, {0x3f10c000}, {0x3f10e000}, 
-    {0x3f110000}, {0x3f112000}, {0x3f114000}, {0x3f116000}, 
-    {0x3f118000}, {0x3f11a000}, {0x3f11c000}, {0x3f11e000}, 
-    {0x3f120000}, {0x3f122000}, {0x3f124000}, {0x3f126000}, 
-    {0x3f128000}, {0x3f12a000}, {0x3f12c000}, {0x3f12e000}, 
-    {0x3f130000}, {0x3f132000}, {0x3f134000}, {0x3f136000}, 
-    {0x3f138000}, {0x3f13a000}, {0x3f13c000}, {0x3f13e000}, 
-    {0x3f140000}, {0x3f142000}, {0x3f144000}, {0x3f146000}, 
-    {0x3f148000}, {0x3f14a000}, {0x3f14c000}, {0x3f14e000}, 
-    {0x3f150000}, {0x3f152000}, {0x3f154000}, {0x3f156000}, 
-    {0x3f158000}, {0x3f15a000}, {0x3f15c000}, {0x3f15e000}, 
-    {0x3f160000}, {0x3f162000}, {0x3f164000}, {0x3f166000}, 
-    {0x3f168000}, {0x3f16a000}, {0x3f16c000}, {0x3f16e000}, 
-    {0x3f170000}, {0x3f172000}, {0x3f174000}, {0x3f176000}, 
-    {0x3f178000}, {0x3f17a000}, {0x3f17c000}, {0x3f17e000}, 
-    {0x3f180000}, {0x3f182000}, {0x3f184000}, {0x3f186000}, 
-    {0x3f188000}, {0x3f18a000}, {0x3f18c000}, {0x3f18e000}, 
-    {0x3f190000}, {0x3f192000}, {0x3f194000}, {0x3f196000}, 
-    {0x3f198000}, {0x3f19a000}, {0x3f19c000}, {0x3f19e000}, 
-    {0x3f1a0000}, {0x3f1a2000}, {0x3f1a4000}, {0x3f1a6000}, 
-    {0x3f1a8000}, {0x3f1aa000}, {0x3f1ac000}, {0x3f1ae000}, 
-    {0x3f1b0000}, {0x3f1b2000}, {0x3f1b4000}, {0x3f1b6000}, 
-    {0x3f1b8000}, {0x3f1ba000}, {0x3f1bc000}, {0x3f1be000}, 
-    {0x3f1c0000}, {0x3f1c2000}, {0x3f1c4000}, {0x3f1c6000}, 
-    {0x3f1c8000}, {0x3f1ca000}, {0x3f1cc000}, {0x3f1ce000}, 
-    {0x3f1d0000}, {0x3f1d2000}, {0x3f1d4000}, {0x3f1d6000}, 
-    {0x3f1d8000}, {0x3f1da000}, {0x3f1dc000}, {0x3f1de000}, 
-    {0x3f1e0000}, {0x3f1e2000}, {0x3f1e4000}, {0x3f1e6000}, 
-    {0x3f1e8000}, {0x3f1ea000}, {0x3f1ec000}, {0x3f1ee000}, 
-    {0x3f1f0000}, {0x3f1f2000}, {0x3f1f4000}, {0x3f1f6000}, 
-    {0x3f1f8000}, {0x3f1fa000}, {0x3f1fc000}, {0x3f1fe000}, 
-    {0x3f200000}, {0x3f202000}, {0x3f204000}, {0x3f206000}, 
-    {0x3f208000}, {0x3f20a000}, {0x3f20c000}, {0x3f20e000}, 
-    {0x3f210000}, {0x3f212000}, {0x3f214000}, {0x3f216000}, 
-    {0x3f218000}, {0x3f21a000}, {0x3f21c000}, {0x3f21e000}, 
-    {0x3f220000}, {0x3f222000}, {0x3f224000}, {0x3f226000}, 
-    {0x3f228000}, {0x3f22a000}, {0x3f22c000}, {0x3f22e000}, 
-    {0x3f230000}, {0x3f232000}, {0x3f234000}, {0x3f236000}, 
-    {0x3f238000}, {0x3f23a000}, {0x3f23c000}, {0x3f23e000}, 
-    {0x3f240000}, {0x3f242000}, {0x3f244000}, {0x3f246000}, 
-    {0x3f248000}, {0x3f24a000}, {0x3f24c000}, {0x3f24e000}, 
-    {0x3f250000}, {0x3f252000}, {0x3f254000}, {0x3f256000}, 
-    {0x3f258000}, {0x3f25a000}, {0x3f25c000}, {0x3f25e000}, 
-    {0x3f260000}, {0x3f262000}, {0x3f264000}, {0x3f266000}, 
-    {0x3f268000}, {0x3f26a000}, {0x3f26c000}, {0x3f26e000}, 
-    {0x3f270000}, {0x3f272000}, {0x3f274000}, {0x3f276000}, 
-    {0x3f278000}, {0x3f27a000}, {0x3f27c000}, {0x3f27e000}, 
-    {0x3f280000}, {0x3f282000}, {0x3f284000}, {0x3f286000}, 
-    {0x3f288000}, {0x3f28a000}, {0x3f28c000}, {0x3f28e000}, 
-    {0x3f290000}, {0x3f292000}, {0x3f294000}, {0x3f296000}, 
-    {0x3f298000}, {0x3f29a000}, {0x3f29c000}, {0x3f29e000}, 
-    {0x3f2a0000}, {0x3f2a2000}, {0x3f2a4000}, {0x3f2a6000}, 
-    {0x3f2a8000}, {0x3f2aa000}, {0x3f2ac000}, {0x3f2ae000}, 
-    {0x3f2b0000}, {0x3f2b2000}, {0x3f2b4000}, {0x3f2b6000}, 
-    {0x3f2b8000}, {0x3f2ba000}, {0x3f2bc000}, {0x3f2be000}, 
-    {0x3f2c0000}, {0x3f2c2000}, {0x3f2c4000}, {0x3f2c6000}, 
-    {0x3f2c8000}, {0x3f2ca000}, {0x3f2cc000}, {0x3f2ce000}, 
-    {0x3f2d0000}, {0x3f2d2000}, {0x3f2d4000}, {0x3f2d6000}, 
-    {0x3f2d8000}, {0x3f2da000}, {0x3f2dc000}, {0x3f2de000}, 
-    {0x3f2e0000}, {0x3f2e2000}, {0x3f2e4000}, {0x3f2e6000}, 
-    {0x3f2e8000}, {0x3f2ea000}, {0x3f2ec000}, {0x3f2ee000}, 
-    {0x3f2f0000}, {0x3f2f2000}, {0x3f2f4000}, {0x3f2f6000}, 
-    {0x3f2f8000}, {0x3f2fa000}, {0x3f2fc000}, {0x3f2fe000}, 
-    {0x3f300000}, {0x3f302000}, {0x3f304000}, {0x3f306000}, 
-    {0x3f308000}, {0x3f30a000}, {0x3f30c000}, {0x3f30e000}, 
-    {0x3f310000}, {0x3f312000}, {0x3f314000}, {0x3f316000}, 
-    {0x3f318000}, {0x3f31a000}, {0x3f31c000}, {0x3f31e000}, 
-    {0x3f320000}, {0x3f322000}, {0x3f324000}, {0x3f326000}, 
-    {0x3f328000}, {0x3f32a000}, {0x3f32c000}, {0x3f32e000}, 
-    {0x3f330000}, {0x3f332000}, {0x3f334000}, {0x3f336000}, 
-    {0x3f338000}, {0x3f33a000}, {0x3f33c000}, {0x3f33e000}, 
-    {0x3f340000}, {0x3f342000}, {0x3f344000}, {0x3f346000}, 
-    {0x3f348000}, {0x3f34a000}, {0x3f34c000}, {0x3f34e000}, 
-    {0x3f350000}, {0x3f352000}, {0x3f354000}, {0x3f356000}, 
-    {0x3f358000}, {0x3f35a000}, {0x3f35c000}, {0x3f35e000}, 
-    {0x3f360000}, {0x3f362000}, {0x3f364000}, {0x3f366000}, 
-    {0x3f368000}, {0x3f36a000}, {0x3f36c000}, {0x3f36e000}, 
-    {0x3f370000}, {0x3f372000}, {0x3f374000}, {0x3f376000}, 
-    {0x3f378000}, {0x3f37a000}, {0x3f37c000}, {0x3f37e000}, 
-    {0x3f380000}, {0x3f382000}, {0x3f384000}, {0x3f386000}, 
-    {0x3f388000}, {0x3f38a000}, {0x3f38c000}, {0x3f38e000}, 
-    {0x3f390000}, {0x3f392000}, {0x3f394000}, {0x3f396000}, 
-    {0x3f398000}, {0x3f39a000}, {0x3f39c000}, {0x3f39e000}, 
-    {0x3f3a0000}, {0x3f3a2000}, {0x3f3a4000}, {0x3f3a6000}, 
-    {0x3f3a8000}, {0x3f3aa000}, {0x3f3ac000}, {0x3f3ae000}, 
-    {0x3f3b0000}, {0x3f3b2000}, {0x3f3b4000}, {0x3f3b6000}, 
-    {0x3f3b8000}, {0x3f3ba000}, {0x3f3bc000}, {0x3f3be000}, 
-    {0x3f3c0000}, {0x3f3c2000}, {0x3f3c4000}, {0x3f3c6000}, 
-    {0x3f3c8000}, {0x3f3ca000}, {0x3f3cc000}, {0x3f3ce000}, 
-    {0x3f3d0000}, {0x3f3d2000}, {0x3f3d4000}, {0x3f3d6000}, 
-    {0x3f3d8000}, {0x3f3da000}, {0x3f3dc000}, {0x3f3de000}, 
-    {0x3f3e0000}, {0x3f3e2000}, {0x3f3e4000}, {0x3f3e6000}, 
-    {0x3f3e8000}, {0x3f3ea000}, {0x3f3ec000}, {0x3f3ee000}, 
-    {0x3f3f0000}, {0x3f3f2000}, {0x3f3f4000}, {0x3f3f6000}, 
-    {0x3f3f8000}, {0x3f3fa000}, {0x3f3fc000}, {0x3f3fe000}, 
-    {0x3f400000}, {0x3f402000}, {0x3f404000}, {0x3f406000}, 
-    {0x3f408000}, {0x3f40a000}, {0x3f40c000}, {0x3f40e000}, 
-    {0x3f410000}, {0x3f412000}, {0x3f414000}, {0x3f416000}, 
-    {0x3f418000}, {0x3f41a000}, {0x3f41c000}, {0x3f41e000}, 
-    {0x3f420000}, {0x3f422000}, {0x3f424000}, {0x3f426000}, 
-    {0x3f428000}, {0x3f42a000}, {0x3f42c000}, {0x3f42e000}, 
-    {0x3f430000}, {0x3f432000}, {0x3f434000}, {0x3f436000}, 
-    {0x3f438000}, {0x3f43a000}, {0x3f43c000}, {0x3f43e000}, 
-    {0x3f440000}, {0x3f442000}, {0x3f444000}, {0x3f446000}, 
-    {0x3f448000}, {0x3f44a000}, {0x3f44c000}, {0x3f44e000}, 
-    {0x3f450000}, {0x3f452000}, {0x3f454000}, {0x3f456000}, 
-    {0x3f458000}, {0x3f45a000}, {0x3f45c000}, {0x3f45e000}, 
-    {0x3f460000}, {0x3f462000}, {0x3f464000}, {0x3f466000}, 
-    {0x3f468000}, {0x3f46a000}, {0x3f46c000}, {0x3f46e000}, 
-    {0x3f470000}, {0x3f472000}, {0x3f474000}, {0x3f476000}, 
-    {0x3f478000}, {0x3f47a000}, {0x3f47c000}, {0x3f47e000}, 
-    {0x3f480000}, {0x3f482000}, {0x3f484000}, {0x3f486000}, 
-    {0x3f488000}, {0x3f48a000}, {0x3f48c000}, {0x3f48e000}, 
-    {0x3f490000}, {0x3f492000}, {0x3f494000}, {0x3f496000}, 
-    {0x3f498000}, {0x3f49a000}, {0x3f49c000}, {0x3f49e000}, 
-    {0x3f4a0000}, {0x3f4a2000}, {0x3f4a4000}, {0x3f4a6000}, 
-    {0x3f4a8000}, {0x3f4aa000}, {0x3f4ac000}, {0x3f4ae000}, 
-    {0x3f4b0000}, {0x3f4b2000}, {0x3f4b4000}, {0x3f4b6000}, 
-    {0x3f4b8000}, {0x3f4ba000}, {0x3f4bc000}, {0x3f4be000}, 
-    {0x3f4c0000}, {0x3f4c2000}, {0x3f4c4000}, {0x3f4c6000}, 
-    {0x3f4c8000}, {0x3f4ca000}, {0x3f4cc000}, {0x3f4ce000}, 
-    {0x3f4d0000}, {0x3f4d2000}, {0x3f4d4000}, {0x3f4d6000}, 
-    {0x3f4d8000}, {0x3f4da000}, {0x3f4dc000}, {0x3f4de000}, 
-    {0x3f4e0000}, {0x3f4e2000}, {0x3f4e4000}, {0x3f4e6000}, 
-    {0x3f4e8000}, {0x3f4ea000}, {0x3f4ec000}, {0x3f4ee000}, 
-    {0x3f4f0000}, {0x3f4f2000}, {0x3f4f4000}, {0x3f4f6000}, 
-    {0x3f4f8000}, {0x3f4fa000}, {0x3f4fc000}, {0x3f4fe000}, 
-    {0x3f500000}, {0x3f502000}, {0x3f504000}, {0x3f506000}, 
-    {0x3f508000}, {0x3f50a000}, {0x3f50c000}, {0x3f50e000}, 
-    {0x3f510000}, {0x3f512000}, {0x3f514000}, {0x3f516000}, 
-    {0x3f518000}, {0x3f51a000}, {0x3f51c000}, {0x3f51e000}, 
-    {0x3f520000}, {0x3f522000}, {0x3f524000}, {0x3f526000}, 
-    {0x3f528000}, {0x3f52a000}, {0x3f52c000}, {0x3f52e000}, 
-    {0x3f530000}, {0x3f532000}, {0x3f534000}, {0x3f536000}, 
-    {0x3f538000}, {0x3f53a000}, {0x3f53c000}, {0x3f53e000}, 
-    {0x3f540000}, {0x3f542000}, {0x3f544000}, {0x3f546000}, 
-    {0x3f548000}, {0x3f54a000}, {0x3f54c000}, {0x3f54e000}, 
-    {0x3f550000}, {0x3f552000}, {0x3f554000}, {0x3f556000}, 
-    {0x3f558000}, {0x3f55a000}, {0x3f55c000}, {0x3f55e000}, 
-    {0x3f560000}, {0x3f562000}, {0x3f564000}, {0x3f566000}, 
-    {0x3f568000}, {0x3f56a000}, {0x3f56c000}, {0x3f56e000}, 
-    {0x3f570000}, {0x3f572000}, {0x3f574000}, {0x3f576000}, 
-    {0x3f578000}, {0x3f57a000}, {0x3f57c000}, {0x3f57e000}, 
-    {0x3f580000}, {0x3f582000}, {0x3f584000}, {0x3f586000}, 
-    {0x3f588000}, {0x3f58a000}, {0x3f58c000}, {0x3f58e000}, 
-    {0x3f590000}, {0x3f592000}, {0x3f594000}, {0x3f596000}, 
-    {0x3f598000}, {0x3f59a000}, {0x3f59c000}, {0x3f59e000}, 
-    {0x3f5a0000}, {0x3f5a2000}, {0x3f5a4000}, {0x3f5a6000}, 
-    {0x3f5a8000}, {0x3f5aa000}, {0x3f5ac000}, {0x3f5ae000}, 
-    {0x3f5b0000}, {0x3f5b2000}, {0x3f5b4000}, {0x3f5b6000}, 
-    {0x3f5b8000}, {0x3f5ba000}, {0x3f5bc000}, {0x3f5be000}, 
-    {0x3f5c0000}, {0x3f5c2000}, {0x3f5c4000}, {0x3f5c6000}, 
-    {0x3f5c8000}, {0x3f5ca000}, {0x3f5cc000}, {0x3f5ce000}, 
-    {0x3f5d0000}, {0x3f5d2000}, {0x3f5d4000}, {0x3f5d6000}, 
-    {0x3f5d8000}, {0x3f5da000}, {0x3f5dc000}, {0x3f5de000}, 
-    {0x3f5e0000}, {0x3f5e2000}, {0x3f5e4000}, {0x3f5e6000}, 
-    {0x3f5e8000}, {0x3f5ea000}, {0x3f5ec000}, {0x3f5ee000}, 
-    {0x3f5f0000}, {0x3f5f2000}, {0x3f5f4000}, {0x3f5f6000}, 
-    {0x3f5f8000}, {0x3f5fa000}, {0x3f5fc000}, {0x3f5fe000}, 
-    {0x3f600000}, {0x3f602000}, {0x3f604000}, {0x3f606000}, 
-    {0x3f608000}, {0x3f60a000}, {0x3f60c000}, {0x3f60e000}, 
-    {0x3f610000}, {0x3f612000}, {0x3f614000}, {0x3f616000}, 
-    {0x3f618000}, {0x3f61a000}, {0x3f61c000}, {0x3f61e000}, 
-    {0x3f620000}, {0x3f622000}, {0x3f624000}, {0x3f626000}, 
-    {0x3f628000}, {0x3f62a000}, {0x3f62c000}, {0x3f62e000}, 
-    {0x3f630000}, {0x3f632000}, {0x3f634000}, {0x3f636000}, 
-    {0x3f638000}, {0x3f63a000}, {0x3f63c000}, {0x3f63e000}, 
-    {0x3f640000}, {0x3f642000}, {0x3f644000}, {0x3f646000}, 
-    {0x3f648000}, {0x3f64a000}, {0x3f64c000}, {0x3f64e000}, 
-    {0x3f650000}, {0x3f652000}, {0x3f654000}, {0x3f656000}, 
-    {0x3f658000}, {0x3f65a000}, {0x3f65c000}, {0x3f65e000}, 
-    {0x3f660000}, {0x3f662000}, {0x3f664000}, {0x3f666000}, 
-    {0x3f668000}, {0x3f66a000}, {0x3f66c000}, {0x3f66e000}, 
-    {0x3f670000}, {0x3f672000}, {0x3f674000}, {0x3f676000}, 
-    {0x3f678000}, {0x3f67a000}, {0x3f67c000}, {0x3f67e000}, 
-    {0x3f680000}, {0x3f682000}, {0x3f684000}, {0x3f686000}, 
-    {0x3f688000}, {0x3f68a000}, {0x3f68c000}, {0x3f68e000}, 
-    {0x3f690000}, {0x3f692000}, {0x3f694000}, {0x3f696000}, 
-    {0x3f698000}, {0x3f69a000}, {0x3f69c000}, {0x3f69e000}, 
-    {0x3f6a0000}, {0x3f6a2000}, {0x3f6a4000}, {0x3f6a6000}, 
-    {0x3f6a8000}, {0x3f6aa000}, {0x3f6ac000}, {0x3f6ae000}, 
-    {0x3f6b0000}, {0x3f6b2000}, {0x3f6b4000}, {0x3f6b6000}, 
-    {0x3f6b8000}, {0x3f6ba000}, {0x3f6bc000}, {0x3f6be000}, 
-    {0x3f6c0000}, {0x3f6c2000}, {0x3f6c4000}, {0x3f6c6000}, 
-    {0x3f6c8000}, {0x3f6ca000}, {0x3f6cc000}, {0x3f6ce000}, 
-    {0x3f6d0000}, {0x3f6d2000}, {0x3f6d4000}, {0x3f6d6000}, 
-    {0x3f6d8000}, {0x3f6da000}, {0x3f6dc000}, {0x3f6de000}, 
-    {0x3f6e0000}, {0x3f6e2000}, {0x3f6e4000}, {0x3f6e6000}, 
-    {0x3f6e8000}, {0x3f6ea000}, {0x3f6ec000}, {0x3f6ee000}, 
-    {0x3f6f0000}, {0x3f6f2000}, {0x3f6f4000}, {0x3f6f6000}, 
-    {0x3f6f8000}, {0x3f6fa000}, {0x3f6fc000}, {0x3f6fe000}, 
-    {0x3f700000}, {0x3f702000}, {0x3f704000}, {0x3f706000}, 
-    {0x3f708000}, {0x3f70a000}, {0x3f70c000}, {0x3f70e000}, 
-    {0x3f710000}, {0x3f712000}, {0x3f714000}, {0x3f716000}, 
-    {0x3f718000}, {0x3f71a000}, {0x3f71c000}, {0x3f71e000}, 
-    {0x3f720000}, {0x3f722000}, {0x3f724000}, {0x3f726000}, 
-    {0x3f728000}, {0x3f72a000}, {0x3f72c000}, {0x3f72e000}, 
-    {0x3f730000}, {0x3f732000}, {0x3f734000}, {0x3f736000}, 
-    {0x3f738000}, {0x3f73a000}, {0x3f73c000}, {0x3f73e000}, 
-    {0x3f740000}, {0x3f742000}, {0x3f744000}, {0x3f746000}, 
-    {0x3f748000}, {0x3f74a000}, {0x3f74c000}, {0x3f74e000}, 
-    {0x3f750000}, {0x3f752000}, {0x3f754000}, {0x3f756000}, 
-    {0x3f758000}, {0x3f75a000}, {0x3f75c000}, {0x3f75e000}, 
-    {0x3f760000}, {0x3f762000}, {0x3f764000}, {0x3f766000}, 
-    {0x3f768000}, {0x3f76a000}, {0x3f76c000}, {0x3f76e000}, 
-    {0x3f770000}, {0x3f772000}, {0x3f774000}, {0x3f776000}, 
-    {0x3f778000}, {0x3f77a000}, {0x3f77c000}, {0x3f77e000}, 
-    {0x3f780000}, {0x3f782000}, {0x3f784000}, {0x3f786000}, 
-    {0x3f788000}, {0x3f78a000}, {0x3f78c000}, {0x3f78e000}, 
-    {0x3f790000}, {0x3f792000}, {0x3f794000}, {0x3f796000}, 
-    {0x3f798000}, {0x3f79a000}, {0x3f79c000}, {0x3f79e000}, 
-    {0x3f7a0000}, {0x3f7a2000}, {0x3f7a4000}, {0x3f7a6000}, 
-    {0x3f7a8000}, {0x3f7aa000}, {0x3f7ac000}, {0x3f7ae000}, 
-    {0x3f7b0000}, {0x3f7b2000}, {0x3f7b4000}, {0x3f7b6000}, 
-    {0x3f7b8000}, {0x3f7ba000}, {0x3f7bc000}, {0x3f7be000}, 
-    {0x3f7c0000}, {0x3f7c2000}, {0x3f7c4000}, {0x3f7c6000}, 
-    {0x3f7c8000}, {0x3f7ca000}, {0x3f7cc000}, {0x3f7ce000}, 
-    {0x3f7d0000}, {0x3f7d2000}, {0x3f7d4000}, {0x3f7d6000}, 
-    {0x3f7d8000}, {0x3f7da000}, {0x3f7dc000}, {0x3f7de000}, 
-    {0x3f7e0000}, {0x3f7e2000}, {0x3f7e4000}, {0x3f7e6000}, 
-    {0x3f7e8000}, {0x3f7ea000}, {0x3f7ec000}, {0x3f7ee000}, 
-    {0x3f7f0000}, {0x3f7f2000}, {0x3f7f4000}, {0x3f7f6000}, 
-    {0x3f7f8000}, {0x3f7fa000}, {0x3f7fc000}, {0x3f7fe000}, 
-    {0x3f800000}, {0x3f802000}, {0x3f804000}, {0x3f806000}, 
-    {0x3f808000}, {0x3f80a000}, {0x3f80c000}, {0x3f80e000}, 
-    {0x3f810000}, {0x3f812000}, {0x3f814000}, {0x3f816000}, 
-    {0x3f818000}, {0x3f81a000}, {0x3f81c000}, {0x3f81e000}, 
-    {0x3f820000}, {0x3f822000}, {0x3f824000}, {0x3f826000}, 
-    {0x3f828000}, {0x3f82a000}, {0x3f82c000}, {0x3f82e000}, 
-    {0x3f830000}, {0x3f832000}, {0x3f834000}, {0x3f836000}, 
-    {0x3f838000}, {0x3f83a000}, {0x3f83c000}, {0x3f83e000}, 
-    {0x3f840000}, {0x3f842000}, {0x3f844000}, {0x3f846000}, 
-    {0x3f848000}, {0x3f84a000}, {0x3f84c000}, {0x3f84e000}, 
-    {0x3f850000}, {0x3f852000}, {0x3f854000}, {0x3f856000}, 
-    {0x3f858000}, {0x3f85a000}, {0x3f85c000}, {0x3f85e000}, 
-    {0x3f860000}, {0x3f862000}, {0x3f864000}, {0x3f866000}, 
-    {0x3f868000}, {0x3f86a000}, {0x3f86c000}, {0x3f86e000}, 
-    {0x3f870000}, {0x3f872000}, {0x3f874000}, {0x3f876000}, 
-    {0x3f878000}, {0x3f87a000}, {0x3f87c000}, {0x3f87e000}, 
-    {0x3f880000}, {0x3f882000}, {0x3f884000}, {0x3f886000}, 
-    {0x3f888000}, {0x3f88a000}, {0x3f88c000}, {0x3f88e000}, 
-    {0x3f890000}, {0x3f892000}, {0x3f894000}, {0x3f896000}, 
-    {0x3f898000}, {0x3f89a000}, {0x3f89c000}, {0x3f89e000}, 
-    {0x3f8a0000}, {0x3f8a2000}, {0x3f8a4000}, {0x3f8a6000}, 
-    {0x3f8a8000}, {0x3f8aa000}, {0x3f8ac000}, {0x3f8ae000}, 
-    {0x3f8b0000}, {0x3f8b2000}, {0x3f8b4000}, {0x3f8b6000}, 
-    {0x3f8b8000}, {0x3f8ba000}, {0x3f8bc000}, {0x3f8be000}, 
-    {0x3f8c0000}, {0x3f8c2000}, {0x3f8c4000}, {0x3f8c6000}, 
-    {0x3f8c8000}, {0x3f8ca000}, {0x3f8cc000}, {0x3f8ce000}, 
-    {0x3f8d0000}, {0x3f8d2000}, {0x3f8d4000}, {0x3f8d6000}, 
-    {0x3f8d8000}, {0x3f8da000}, {0x3f8dc000}, {0x3f8de000}, 
-    {0x3f8e0000}, {0x3f8e2000}, {0x3f8e4000}, {0x3f8e6000}, 
-    {0x3f8e8000}, {0x3f8ea000}, {0x3f8ec000}, {0x3f8ee000}, 
-    {0x3f8f0000}, {0x3f8f2000}, {0x3f8f4000}, {0x3f8f6000}, 
-    {0x3f8f8000}, {0x3f8fa000}, {0x3f8fc000}, {0x3f8fe000}, 
-    {0x3f900000}, {0x3f902000}, {0x3f904000}, {0x3f906000}, 
-    {0x3f908000}, {0x3f90a000}, {0x3f90c000}, {0x3f90e000}, 
-    {0x3f910000}, {0x3f912000}, {0x3f914000}, {0x3f916000}, 
-    {0x3f918000}, {0x3f91a000}, {0x3f91c000}, {0x3f91e000}, 
-    {0x3f920000}, {0x3f922000}, {0x3f924000}, {0x3f926000}, 
-    {0x3f928000}, {0x3f92a000}, {0x3f92c000}, {0x3f92e000}, 
-    {0x3f930000}, {0x3f932000}, {0x3f934000}, {0x3f936000}, 
-    {0x3f938000}, {0x3f93a000}, {0x3f93c000}, {0x3f93e000}, 
-    {0x3f940000}, {0x3f942000}, {0x3f944000}, {0x3f946000}, 
-    {0x3f948000}, {0x3f94a000}, {0x3f94c000}, {0x3f94e000}, 
-    {0x3f950000}, {0x3f952000}, {0x3f954000}, {0x3f956000}, 
-    {0x3f958000}, {0x3f95a000}, {0x3f95c000}, {0x3f95e000}, 
-    {0x3f960000}, {0x3f962000}, {0x3f964000}, {0x3f966000}, 
-    {0x3f968000}, {0x3f96a000}, {0x3f96c000}, {0x3f96e000}, 
-    {0x3f970000}, {0x3f972000}, {0x3f974000}, {0x3f976000}, 
-    {0x3f978000}, {0x3f97a000}, {0x3f97c000}, {0x3f97e000}, 
-    {0x3f980000}, {0x3f982000}, {0x3f984000}, {0x3f986000}, 
-    {0x3f988000}, {0x3f98a000}, {0x3f98c000}, {0x3f98e000}, 
-    {0x3f990000}, {0x3f992000}, {0x3f994000}, {0x3f996000}, 
-    {0x3f998000}, {0x3f99a000}, {0x3f99c000}, {0x3f99e000}, 
-    {0x3f9a0000}, {0x3f9a2000}, {0x3f9a4000}, {0x3f9a6000}, 
-    {0x3f9a8000}, {0x3f9aa000}, {0x3f9ac000}, {0x3f9ae000}, 
-    {0x3f9b0000}, {0x3f9b2000}, {0x3f9b4000}, {0x3f9b6000}, 
-    {0x3f9b8000}, {0x3f9ba000}, {0x3f9bc000}, {0x3f9be000}, 
-    {0x3f9c0000}, {0x3f9c2000}, {0x3f9c4000}, {0x3f9c6000}, 
-    {0x3f9c8000}, {0x3f9ca000}, {0x3f9cc000}, {0x3f9ce000}, 
-    {0x3f9d0000}, {0x3f9d2000}, {0x3f9d4000}, {0x3f9d6000}, 
-    {0x3f9d8000}, {0x3f9da000}, {0x3f9dc000}, {0x3f9de000}, 
-    {0x3f9e0000}, {0x3f9e2000}, {0x3f9e4000}, {0x3f9e6000}, 
-    {0x3f9e8000}, {0x3f9ea000}, {0x3f9ec000}, {0x3f9ee000}, 
-    {0x3f9f0000}, {0x3f9f2000}, {0x3f9f4000}, {0x3f9f6000}, 
-    {0x3f9f8000}, {0x3f9fa000}, {0x3f9fc000}, {0x3f9fe000}, 
-    {0x3fa00000}, {0x3fa02000}, {0x3fa04000}, {0x3fa06000}, 
-    {0x3fa08000}, {0x3fa0a000}, {0x3fa0c000}, {0x3fa0e000}, 
-    {0x3fa10000}, {0x3fa12000}, {0x3fa14000}, {0x3fa16000}, 
-    {0x3fa18000}, {0x3fa1a000}, {0x3fa1c000}, {0x3fa1e000}, 
-    {0x3fa20000}, {0x3fa22000}, {0x3fa24000}, {0x3fa26000}, 
-    {0x3fa28000}, {0x3fa2a000}, {0x3fa2c000}, {0x3fa2e000}, 
-    {0x3fa30000}, {0x3fa32000}, {0x3fa34000}, {0x3fa36000}, 
-    {0x3fa38000}, {0x3fa3a000}, {0x3fa3c000}, {0x3fa3e000}, 
-    {0x3fa40000}, {0x3fa42000}, {0x3fa44000}, {0x3fa46000}, 
-    {0x3fa48000}, {0x3fa4a000}, {0x3fa4c000}, {0x3fa4e000}, 
-    {0x3fa50000}, {0x3fa52000}, {0x3fa54000}, {0x3fa56000}, 
-    {0x3fa58000}, {0x3fa5a000}, {0x3fa5c000}, {0x3fa5e000}, 
-    {0x3fa60000}, {0x3fa62000}, {0x3fa64000}, {0x3fa66000}, 
-    {0x3fa68000}, {0x3fa6a000}, {0x3fa6c000}, {0x3fa6e000}, 
-    {0x3fa70000}, {0x3fa72000}, {0x3fa74000}, {0x3fa76000}, 
-    {0x3fa78000}, {0x3fa7a000}, {0x3fa7c000}, {0x3fa7e000}, 
-    {0x3fa80000}, {0x3fa82000}, {0x3fa84000}, {0x3fa86000}, 
-    {0x3fa88000}, {0x3fa8a000}, {0x3fa8c000}, {0x3fa8e000}, 
-    {0x3fa90000}, {0x3fa92000}, {0x3fa94000}, {0x3fa96000}, 
-    {0x3fa98000}, {0x3fa9a000}, {0x3fa9c000}, {0x3fa9e000}, 
-    {0x3faa0000}, {0x3faa2000}, {0x3faa4000}, {0x3faa6000}, 
-    {0x3faa8000}, {0x3faaa000}, {0x3faac000}, {0x3faae000}, 
-    {0x3fab0000}, {0x3fab2000}, {0x3fab4000}, {0x3fab6000}, 
-    {0x3fab8000}, {0x3faba000}, {0x3fabc000}, {0x3fabe000}, 
-    {0x3fac0000}, {0x3fac2000}, {0x3fac4000}, {0x3fac6000}, 
-    {0x3fac8000}, {0x3faca000}, {0x3facc000}, {0x3face000}, 
-    {0x3fad0000}, {0x3fad2000}, {0x3fad4000}, {0x3fad6000}, 
-    {0x3fad8000}, {0x3fada000}, {0x3fadc000}, {0x3fade000}, 
-    {0x3fae0000}, {0x3fae2000}, {0x3fae4000}, {0x3fae6000}, 
-    {0x3fae8000}, {0x3faea000}, {0x3faec000}, {0x3faee000}, 
-    {0x3faf0000}, {0x3faf2000}, {0x3faf4000}, {0x3faf6000}, 
-    {0x3faf8000}, {0x3fafa000}, {0x3fafc000}, {0x3fafe000}, 
-    {0x3fb00000}, {0x3fb02000}, {0x3fb04000}, {0x3fb06000}, 
-    {0x3fb08000}, {0x3fb0a000}, {0x3fb0c000}, {0x3fb0e000}, 
-    {0x3fb10000}, {0x3fb12000}, {0x3fb14000}, {0x3fb16000}, 
-    {0x3fb18000}, {0x3fb1a000}, {0x3fb1c000}, {0x3fb1e000}, 
-    {0x3fb20000}, {0x3fb22000}, {0x3fb24000}, {0x3fb26000}, 
-    {0x3fb28000}, {0x3fb2a000}, {0x3fb2c000}, {0x3fb2e000}, 
-    {0x3fb30000}, {0x3fb32000}, {0x3fb34000}, {0x3fb36000}, 
-    {0x3fb38000}, {0x3fb3a000}, {0x3fb3c000}, {0x3fb3e000}, 
-    {0x3fb40000}, {0x3fb42000}, {0x3fb44000}, {0x3fb46000}, 
-    {0x3fb48000}, {0x3fb4a000}, {0x3fb4c000}, {0x3fb4e000}, 
-    {0x3fb50000}, {0x3fb52000}, {0x3fb54000}, {0x3fb56000}, 
-    {0x3fb58000}, {0x3fb5a000}, {0x3fb5c000}, {0x3fb5e000}, 
-    {0x3fb60000}, {0x3fb62000}, {0x3fb64000}, {0x3fb66000}, 
-    {0x3fb68000}, {0x3fb6a000}, {0x3fb6c000}, {0x3fb6e000}, 
-    {0x3fb70000}, {0x3fb72000}, {0x3fb74000}, {0x3fb76000}, 
-    {0x3fb78000}, {0x3fb7a000}, {0x3fb7c000}, {0x3fb7e000}, 
-    {0x3fb80000}, {0x3fb82000}, {0x3fb84000}, {0x3fb86000}, 
-    {0x3fb88000}, {0x3fb8a000}, {0x3fb8c000}, {0x3fb8e000}, 
-    {0x3fb90000}, {0x3fb92000}, {0x3fb94000}, {0x3fb96000}, 
-    {0x3fb98000}, {0x3fb9a000}, {0x3fb9c000}, {0x3fb9e000}, 
-    {0x3fba0000}, {0x3fba2000}, {0x3fba4000}, {0x3fba6000}, 
-    {0x3fba8000}, {0x3fbaa000}, {0x3fbac000}, {0x3fbae000}, 
-    {0x3fbb0000}, {0x3fbb2000}, {0x3fbb4000}, {0x3fbb6000}, 
-    {0x3fbb8000}, {0x3fbba000}, {0x3fbbc000}, {0x3fbbe000}, 
-    {0x3fbc0000}, {0x3fbc2000}, {0x3fbc4000}, {0x3fbc6000}, 
-    {0x3fbc8000}, {0x3fbca000}, {0x3fbcc000}, {0x3fbce000}, 
-    {0x3fbd0000}, {0x3fbd2000}, {0x3fbd4000}, {0x3fbd6000}, 
-    {0x3fbd8000}, {0x3fbda000}, {0x3fbdc000}, {0x3fbde000}, 
-    {0x3fbe0000}, {0x3fbe2000}, {0x3fbe4000}, {0x3fbe6000}, 
-    {0x3fbe8000}, {0x3fbea000}, {0x3fbec000}, {0x3fbee000}, 
-    {0x3fbf0000}, {0x3fbf2000}, {0x3fbf4000}, {0x3fbf6000}, 
-    {0x3fbf8000}, {0x3fbfa000}, {0x3fbfc000}, {0x3fbfe000}, 
-    {0x3fc00000}, {0x3fc02000}, {0x3fc04000}, {0x3fc06000}, 
-    {0x3fc08000}, {0x3fc0a000}, {0x3fc0c000}, {0x3fc0e000}, 
-    {0x3fc10000}, {0x3fc12000}, {0x3fc14000}, {0x3fc16000}, 
-    {0x3fc18000}, {0x3fc1a000}, {0x3fc1c000}, {0x3fc1e000}, 
-    {0x3fc20000}, {0x3fc22000}, {0x3fc24000}, {0x3fc26000}, 
-    {0x3fc28000}, {0x3fc2a000}, {0x3fc2c000}, {0x3fc2e000}, 
-    {0x3fc30000}, {0x3fc32000}, {0x3fc34000}, {0x3fc36000}, 
-    {0x3fc38000}, {0x3fc3a000}, {0x3fc3c000}, {0x3fc3e000}, 
-    {0x3fc40000}, {0x3fc42000}, {0x3fc44000}, {0x3fc46000}, 
-    {0x3fc48000}, {0x3fc4a000}, {0x3fc4c000}, {0x3fc4e000}, 
-    {0x3fc50000}, {0x3fc52000}, {0x3fc54000}, {0x3fc56000}, 
-    {0x3fc58000}, {0x3fc5a000}, {0x3fc5c000}, {0x3fc5e000}, 
-    {0x3fc60000}, {0x3fc62000}, {0x3fc64000}, {0x3fc66000}, 
-    {0x3fc68000}, {0x3fc6a000}, {0x3fc6c000}, {0x3fc6e000}, 
-    {0x3fc70000}, {0x3fc72000}, {0x3fc74000}, {0x3fc76000}, 
-    {0x3fc78000}, {0x3fc7a000}, {0x3fc7c000}, {0x3fc7e000}, 
-    {0x3fc80000}, {0x3fc82000}, {0x3fc84000}, {0x3fc86000}, 
-    {0x3fc88000}, {0x3fc8a000}, {0x3fc8c000}, {0x3fc8e000}, 
-    {0x3fc90000}, {0x3fc92000}, {0x3fc94000}, {0x3fc96000}, 
-    {0x3fc98000}, {0x3fc9a000}, {0x3fc9c000}, {0x3fc9e000}, 
-    {0x3fca0000}, {0x3fca2000}, {0x3fca4000}, {0x3fca6000}, 
-    {0x3fca8000}, {0x3fcaa000}, {0x3fcac000}, {0x3fcae000}, 
-    {0x3fcb0000}, {0x3fcb2000}, {0x3fcb4000}, {0x3fcb6000}, 
-    {0x3fcb8000}, {0x3fcba000}, {0x3fcbc000}, {0x3fcbe000}, 
-    {0x3fcc0000}, {0x3fcc2000}, {0x3fcc4000}, {0x3fcc6000}, 
-    {0x3fcc8000}, {0x3fcca000}, {0x3fccc000}, {0x3fcce000}, 
-    {0x3fcd0000}, {0x3fcd2000}, {0x3fcd4000}, {0x3fcd6000}, 
-    {0x3fcd8000}, {0x3fcda000}, {0x3fcdc000}, {0x3fcde000}, 
-    {0x3fce0000}, {0x3fce2000}, {0x3fce4000}, {0x3fce6000}, 
-    {0x3fce8000}, {0x3fcea000}, {0x3fcec000}, {0x3fcee000}, 
-    {0x3fcf0000}, {0x3fcf2000}, {0x3fcf4000}, {0x3fcf6000}, 
-    {0x3fcf8000}, {0x3fcfa000}, {0x3fcfc000}, {0x3fcfe000}, 
-    {0x3fd00000}, {0x3fd02000}, {0x3fd04000}, {0x3fd06000}, 
-    {0x3fd08000}, {0x3fd0a000}, {0x3fd0c000}, {0x3fd0e000}, 
-    {0x3fd10000}, {0x3fd12000}, {0x3fd14000}, {0x3fd16000}, 
-    {0x3fd18000}, {0x3fd1a000}, {0x3fd1c000}, {0x3fd1e000}, 
-    {0x3fd20000}, {0x3fd22000}, {0x3fd24000}, {0x3fd26000}, 
-    {0x3fd28000}, {0x3fd2a000}, {0x3fd2c000}, {0x3fd2e000}, 
-    {0x3fd30000}, {0x3fd32000}, {0x3fd34000}, {0x3fd36000}, 
-    {0x3fd38000}, {0x3fd3a000}, {0x3fd3c000}, {0x3fd3e000}, 
-    {0x3fd40000}, {0x3fd42000}, {0x3fd44000}, {0x3fd46000}, 
-    {0x3fd48000}, {0x3fd4a000}, {0x3fd4c000}, {0x3fd4e000}, 
-    {0x3fd50000}, {0x3fd52000}, {0x3fd54000}, {0x3fd56000}, 
-    {0x3fd58000}, {0x3fd5a000}, {0x3fd5c000}, {0x3fd5e000}, 
-    {0x3fd60000}, {0x3fd62000}, {0x3fd64000}, {0x3fd66000}, 
-    {0x3fd68000}, {0x3fd6a000}, {0x3fd6c000}, {0x3fd6e000}, 
-    {0x3fd70000}, {0x3fd72000}, {0x3fd74000}, {0x3fd76000}, 
-    {0x3fd78000}, {0x3fd7a000}, {0x3fd7c000}, {0x3fd7e000}, 
-    {0x3fd80000}, {0x3fd82000}, {0x3fd84000}, {0x3fd86000}, 
-    {0x3fd88000}, {0x3fd8a000}, {0x3fd8c000}, {0x3fd8e000}, 
-    {0x3fd90000}, {0x3fd92000}, {0x3fd94000}, {0x3fd96000}, 
-    {0x3fd98000}, {0x3fd9a000}, {0x3fd9c000}, {0x3fd9e000}, 
-    {0x3fda0000}, {0x3fda2000}, {0x3fda4000}, {0x3fda6000}, 
-    {0x3fda8000}, {0x3fdaa000}, {0x3fdac000}, {0x3fdae000}, 
-    {0x3fdb0000}, {0x3fdb2000}, {0x3fdb4000}, {0x3fdb6000}, 
-    {0x3fdb8000}, {0x3fdba000}, {0x3fdbc000}, {0x3fdbe000}, 
-    {0x3fdc0000}, {0x3fdc2000}, {0x3fdc4000}, {0x3fdc6000}, 
-    {0x3fdc8000}, {0x3fdca000}, {0x3fdcc000}, {0x3fdce000}, 
-    {0x3fdd0000}, {0x3fdd2000}, {0x3fdd4000}, {0x3fdd6000}, 
-    {0x3fdd8000}, {0x3fdda000}, {0x3fddc000}, {0x3fdde000}, 
-    {0x3fde0000}, {0x3fde2000}, {0x3fde4000}, {0x3fde6000}, 
-    {0x3fde8000}, {0x3fdea000}, {0x3fdec000}, {0x3fdee000}, 
-    {0x3fdf0000}, {0x3fdf2000}, {0x3fdf4000}, {0x3fdf6000}, 
-    {0x3fdf8000}, {0x3fdfa000}, {0x3fdfc000}, {0x3fdfe000}, 
-    {0x3fe00000}, {0x3fe02000}, {0x3fe04000}, {0x3fe06000}, 
-    {0x3fe08000}, {0x3fe0a000}, {0x3fe0c000}, {0x3fe0e000}, 
-    {0x3fe10000}, {0x3fe12000}, {0x3fe14000}, {0x3fe16000}, 
-    {0x3fe18000}, {0x3fe1a000}, {0x3fe1c000}, {0x3fe1e000}, 
-    {0x3fe20000}, {0x3fe22000}, {0x3fe24000}, {0x3fe26000}, 
-    {0x3fe28000}, {0x3fe2a000}, {0x3fe2c000}, {0x3fe2e000}, 
-    {0x3fe30000}, {0x3fe32000}, {0x3fe34000}, {0x3fe36000}, 
-    {0x3fe38000}, {0x3fe3a000}, {0x3fe3c000}, {0x3fe3e000}, 
-    {0x3fe40000}, {0x3fe42000}, {0x3fe44000}, {0x3fe46000}, 
-    {0x3fe48000}, {0x3fe4a000}, {0x3fe4c000}, {0x3fe4e000}, 
-    {0x3fe50000}, {0x3fe52000}, {0x3fe54000}, {0x3fe56000}, 
-    {0x3fe58000}, {0x3fe5a000}, {0x3fe5c000}, {0x3fe5e000}, 
-    {0x3fe60000}, {0x3fe62000}, {0x3fe64000}, {0x3fe66000}, 
-    {0x3fe68000}, {0x3fe6a000}, {0x3fe6c000}, {0x3fe6e000}, 
-    {0x3fe70000}, {0x3fe72000}, {0x3fe74000}, {0x3fe76000}, 
-    {0x3fe78000}, {0x3fe7a000}, {0x3fe7c000}, {0x3fe7e000}, 
-    {0x3fe80000}, {0x3fe82000}, {0x3fe84000}, {0x3fe86000}, 
-    {0x3fe88000}, {0x3fe8a000}, {0x3fe8c000}, {0x3fe8e000}, 
-    {0x3fe90000}, {0x3fe92000}, {0x3fe94000}, {0x3fe96000}, 
-    {0x3fe98000}, {0x3fe9a000}, {0x3fe9c000}, {0x3fe9e000}, 
-    {0x3fea0000}, {0x3fea2000}, {0x3fea4000}, {0x3fea6000}, 
-    {0x3fea8000}, {0x3feaa000}, {0x3feac000}, {0x3feae000}, 
-    {0x3feb0000}, {0x3feb2000}, {0x3feb4000}, {0x3feb6000}, 
-    {0x3feb8000}, {0x3feba000}, {0x3febc000}, {0x3febe000}, 
-    {0x3fec0000}, {0x3fec2000}, {0x3fec4000}, {0x3fec6000}, 
-    {0x3fec8000}, {0x3feca000}, {0x3fecc000}, {0x3fece000}, 
-    {0x3fed0000}, {0x3fed2000}, {0x3fed4000}, {0x3fed6000}, 
-    {0x3fed8000}, {0x3feda000}, {0x3fedc000}, {0x3fede000}, 
-    {0x3fee0000}, {0x3fee2000}, {0x3fee4000}, {0x3fee6000}, 
-    {0x3fee8000}, {0x3feea000}, {0x3feec000}, {0x3feee000}, 
-    {0x3fef0000}, {0x3fef2000}, {0x3fef4000}, {0x3fef6000}, 
-    {0x3fef8000}, {0x3fefa000}, {0x3fefc000}, {0x3fefe000}, 
-    {0x3ff00000}, {0x3ff02000}, {0x3ff04000}, {0x3ff06000}, 
-    {0x3ff08000}, {0x3ff0a000}, {0x3ff0c000}, {0x3ff0e000}, 
-    {0x3ff10000}, {0x3ff12000}, {0x3ff14000}, {0x3ff16000}, 
-    {0x3ff18000}, {0x3ff1a000}, {0x3ff1c000}, {0x3ff1e000}, 
-    {0x3ff20000}, {0x3ff22000}, {0x3ff24000}, {0x3ff26000}, 
-    {0x3ff28000}, {0x3ff2a000}, {0x3ff2c000}, {0x3ff2e000}, 
-    {0x3ff30000}, {0x3ff32000}, {0x3ff34000}, {0x3ff36000}, 
-    {0x3ff38000}, {0x3ff3a000}, {0x3ff3c000}, {0x3ff3e000}, 
-    {0x3ff40000}, {0x3ff42000}, {0x3ff44000}, {0x3ff46000}, 
-    {0x3ff48000}, {0x3ff4a000}, {0x3ff4c000}, {0x3ff4e000}, 
-    {0x3ff50000}, {0x3ff52000}, {0x3ff54000}, {0x3ff56000}, 
-    {0x3ff58000}, {0x3ff5a000}, {0x3ff5c000}, {0x3ff5e000}, 
-    {0x3ff60000}, {0x3ff62000}, {0x3ff64000}, {0x3ff66000}, 
-    {0x3ff68000}, {0x3ff6a000}, {0x3ff6c000}, {0x3ff6e000}, 
-    {0x3ff70000}, {0x3ff72000}, {0x3ff74000}, {0x3ff76000}, 
-    {0x3ff78000}, {0x3ff7a000}, {0x3ff7c000}, {0x3ff7e000}, 
-    {0x3ff80000}, {0x3ff82000}, {0x3ff84000}, {0x3ff86000}, 
-    {0x3ff88000}, {0x3ff8a000}, {0x3ff8c000}, {0x3ff8e000}, 
-    {0x3ff90000}, {0x3ff92000}, {0x3ff94000}, {0x3ff96000}, 
-    {0x3ff98000}, {0x3ff9a000}, {0x3ff9c000}, {0x3ff9e000}, 
-    {0x3ffa0000}, {0x3ffa2000}, {0x3ffa4000}, {0x3ffa6000}, 
-    {0x3ffa8000}, {0x3ffaa000}, {0x3ffac000}, {0x3ffae000}, 
-    {0x3ffb0000}, {0x3ffb2000}, {0x3ffb4000}, {0x3ffb6000}, 
-    {0x3ffb8000}, {0x3ffba000}, {0x3ffbc000}, {0x3ffbe000}, 
-    {0x3ffc0000}, {0x3ffc2000}, {0x3ffc4000}, {0x3ffc6000}, 
-    {0x3ffc8000}, {0x3ffca000}, {0x3ffcc000}, {0x3ffce000}, 
-    {0x3ffd0000}, {0x3ffd2000}, {0x3ffd4000}, {0x3ffd6000}, 
-    {0x3ffd8000}, {0x3ffda000}, {0x3ffdc000}, {0x3ffde000}, 
-    {0x3ffe0000}, {0x3ffe2000}, {0x3ffe4000}, {0x3ffe6000}, 
-    {0x3ffe8000}, {0x3ffea000}, {0x3ffec000}, {0x3ffee000}, 
-    {0x3fff0000}, {0x3fff2000}, {0x3fff4000}, {0x3fff6000}, 
-    {0x3fff8000}, {0x3fffa000}, {0x3fffc000}, {0x3fffe000}, 
-    {0x40000000}, {0x40002000}, {0x40004000}, {0x40006000}, 
-    {0x40008000}, {0x4000a000}, {0x4000c000}, {0x4000e000}, 
-    {0x40010000}, {0x40012000}, {0x40014000}, {0x40016000}, 
-    {0x40018000}, {0x4001a000}, {0x4001c000}, {0x4001e000}, 
-    {0x40020000}, {0x40022000}, {0x40024000}, {0x40026000}, 
-    {0x40028000}, {0x4002a000}, {0x4002c000}, {0x4002e000}, 
-    {0x40030000}, {0x40032000}, {0x40034000}, {0x40036000}, 
-    {0x40038000}, {0x4003a000}, {0x4003c000}, {0x4003e000}, 
-    {0x40040000}, {0x40042000}, {0x40044000}, {0x40046000}, 
-    {0x40048000}, {0x4004a000}, {0x4004c000}, {0x4004e000}, 
-    {0x40050000}, {0x40052000}, {0x40054000}, {0x40056000}, 
-    {0x40058000}, {0x4005a000}, {0x4005c000}, {0x4005e000}, 
-    {0x40060000}, {0x40062000}, {0x40064000}, {0x40066000}, 
-    {0x40068000}, {0x4006a000}, {0x4006c000}, {0x4006e000}, 
-    {0x40070000}, {0x40072000}, {0x40074000}, {0x40076000}, 
-    {0x40078000}, {0x4007a000}, {0x4007c000}, {0x4007e000}, 
-    {0x40080000}, {0x40082000}, {0x40084000}, {0x40086000}, 
-    {0x40088000}, {0x4008a000}, {0x4008c000}, {0x4008e000}, 
-    {0x40090000}, {0x40092000}, {0x40094000}, {0x40096000}, 
-    {0x40098000}, {0x4009a000}, {0x4009c000}, {0x4009e000}, 
-    {0x400a0000}, {0x400a2000}, {0x400a4000}, {0x400a6000}, 
-    {0x400a8000}, {0x400aa000}, {0x400ac000}, {0x400ae000}, 
-    {0x400b0000}, {0x400b2000}, {0x400b4000}, {0x400b6000}, 
-    {0x400b8000}, {0x400ba000}, {0x400bc000}, {0x400be000}, 
-    {0x400c0000}, {0x400c2000}, {0x400c4000}, {0x400c6000}, 
-    {0x400c8000}, {0x400ca000}, {0x400cc000}, {0x400ce000}, 
-    {0x400d0000}, {0x400d2000}, {0x400d4000}, {0x400d6000}, 
-    {0x400d8000}, {0x400da000}, {0x400dc000}, {0x400de000}, 
-    {0x400e0000}, {0x400e2000}, {0x400e4000}, {0x400e6000}, 
-    {0x400e8000}, {0x400ea000}, {0x400ec000}, {0x400ee000}, 
-    {0x400f0000}, {0x400f2000}, {0x400f4000}, {0x400f6000}, 
-    {0x400f8000}, {0x400fa000}, {0x400fc000}, {0x400fe000}, 
-    {0x40100000}, {0x40102000}, {0x40104000}, {0x40106000}, 
-    {0x40108000}, {0x4010a000}, {0x4010c000}, {0x4010e000}, 
-    {0x40110000}, {0x40112000}, {0x40114000}, {0x40116000}, 
-    {0x40118000}, {0x4011a000}, {0x4011c000}, {0x4011e000}, 
-    {0x40120000}, {0x40122000}, {0x40124000}, {0x40126000}, 
-    {0x40128000}, {0x4012a000}, {0x4012c000}, {0x4012e000}, 
-    {0x40130000}, {0x40132000}, {0x40134000}, {0x40136000}, 
-    {0x40138000}, {0x4013a000}, {0x4013c000}, {0x4013e000}, 
-    {0x40140000}, {0x40142000}, {0x40144000}, {0x40146000}, 
-    {0x40148000}, {0x4014a000}, {0x4014c000}, {0x4014e000}, 
-    {0x40150000}, {0x40152000}, {0x40154000}, {0x40156000}, 
-    {0x40158000}, {0x4015a000}, {0x4015c000}, {0x4015e000}, 
-    {0x40160000}, {0x40162000}, {0x40164000}, {0x40166000}, 
-    {0x40168000}, {0x4016a000}, {0x4016c000}, {0x4016e000}, 
-    {0x40170000}, {0x40172000}, {0x40174000}, {0x40176000}, 
-    {0x40178000}, {0x4017a000}, {0x4017c000}, {0x4017e000}, 
-    {0x40180000}, {0x40182000}, {0x40184000}, {0x40186000}, 
-    {0x40188000}, {0x4018a000}, {0x4018c000}, {0x4018e000}, 
-    {0x40190000}, {0x40192000}, {0x40194000}, {0x40196000}, 
-    {0x40198000}, {0x4019a000}, {0x4019c000}, {0x4019e000}, 
-    {0x401a0000}, {0x401a2000}, {0x401a4000}, {0x401a6000}, 
-    {0x401a8000}, {0x401aa000}, {0x401ac000}, {0x401ae000}, 
-    {0x401b0000}, {0x401b2000}, {0x401b4000}, {0x401b6000}, 
-    {0x401b8000}, {0x401ba000}, {0x401bc000}, {0x401be000}, 
-    {0x401c0000}, {0x401c2000}, {0x401c4000}, {0x401c6000}, 
-    {0x401c8000}, {0x401ca000}, {0x401cc000}, {0x401ce000}, 
-    {0x401d0000}, {0x401d2000}, {0x401d4000}, {0x401d6000}, 
-    {0x401d8000}, {0x401da000}, {0x401dc000}, {0x401de000}, 
-    {0x401e0000}, {0x401e2000}, {0x401e4000}, {0x401e6000}, 
-    {0x401e8000}, {0x401ea000}, {0x401ec000}, {0x401ee000}, 
-    {0x401f0000}, {0x401f2000}, {0x401f4000}, {0x401f6000}, 
-    {0x401f8000}, {0x401fa000}, {0x401fc000}, {0x401fe000}, 
-    {0x40200000}, {0x40202000}, {0x40204000}, {0x40206000}, 
-    {0x40208000}, {0x4020a000}, {0x4020c000}, {0x4020e000}, 
-    {0x40210000}, {0x40212000}, {0x40214000}, {0x40216000}, 
-    {0x40218000}, {0x4021a000}, {0x4021c000}, {0x4021e000}, 
-    {0x40220000}, {0x40222000}, {0x40224000}, {0x40226000}, 
-    {0x40228000}, {0x4022a000}, {0x4022c000}, {0x4022e000}, 
-    {0x40230000}, {0x40232000}, {0x40234000}, {0x40236000}, 
-    {0x40238000}, {0x4023a000}, {0x4023c000}, {0x4023e000}, 
-    {0x40240000}, {0x40242000}, {0x40244000}, {0x40246000}, 
-    {0x40248000}, {0x4024a000}, {0x4024c000}, {0x4024e000}, 
-    {0x40250000}, {0x40252000}, {0x40254000}, {0x40256000}, 
-    {0x40258000}, {0x4025a000}, {0x4025c000}, {0x4025e000}, 
-    {0x40260000}, {0x40262000}, {0x40264000}, {0x40266000}, 
-    {0x40268000}, {0x4026a000}, {0x4026c000}, {0x4026e000}, 
-    {0x40270000}, {0x40272000}, {0x40274000}, {0x40276000}, 
-    {0x40278000}, {0x4027a000}, {0x4027c000}, {0x4027e000}, 
-    {0x40280000}, {0x40282000}, {0x40284000}, {0x40286000}, 
-    {0x40288000}, {0x4028a000}, {0x4028c000}, {0x4028e000}, 
-    {0x40290000}, {0x40292000}, {0x40294000}, {0x40296000}, 
-    {0x40298000}, {0x4029a000}, {0x4029c000}, {0x4029e000}, 
-    {0x402a0000}, {0x402a2000}, {0x402a4000}, {0x402a6000}, 
-    {0x402a8000}, {0x402aa000}, {0x402ac000}, {0x402ae000}, 
-    {0x402b0000}, {0x402b2000}, {0x402b4000}, {0x402b6000}, 
-    {0x402b8000}, {0x402ba000}, {0x402bc000}, {0x402be000}, 
-    {0x402c0000}, {0x402c2000}, {0x402c4000}, {0x402c6000}, 
-    {0x402c8000}, {0x402ca000}, {0x402cc000}, {0x402ce000}, 
-    {0x402d0000}, {0x402d2000}, {0x402d4000}, {0x402d6000}, 
-    {0x402d8000}, {0x402da000}, {0x402dc000}, {0x402de000}, 
-    {0x402e0000}, {0x402e2000}, {0x402e4000}, {0x402e6000}, 
-    {0x402e8000}, {0x402ea000}, {0x402ec000}, {0x402ee000}, 
-    {0x402f0000}, {0x402f2000}, {0x402f4000}, {0x402f6000}, 
-    {0x402f8000}, {0x402fa000}, {0x402fc000}, {0x402fe000}, 
-    {0x40300000}, {0x40302000}, {0x40304000}, {0x40306000}, 
-    {0x40308000}, {0x4030a000}, {0x4030c000}, {0x4030e000}, 
-    {0x40310000}, {0x40312000}, {0x40314000}, {0x40316000}, 
-    {0x40318000}, {0x4031a000}, {0x4031c000}, {0x4031e000}, 
-    {0x40320000}, {0x40322000}, {0x40324000}, {0x40326000}, 
-    {0x40328000}, {0x4032a000}, {0x4032c000}, {0x4032e000}, 
-    {0x40330000}, {0x40332000}, {0x40334000}, {0x40336000}, 
-    {0x40338000}, {0x4033a000}, {0x4033c000}, {0x4033e000}, 
-    {0x40340000}, {0x40342000}, {0x40344000}, {0x40346000}, 
-    {0x40348000}, {0x4034a000}, {0x4034c000}, {0x4034e000}, 
-    {0x40350000}, {0x40352000}, {0x40354000}, {0x40356000}, 
-    {0x40358000}, {0x4035a000}, {0x4035c000}, {0x4035e000}, 
-    {0x40360000}, {0x40362000}, {0x40364000}, {0x40366000}, 
-    {0x40368000}, {0x4036a000}, {0x4036c000}, {0x4036e000}, 
-    {0x40370000}, {0x40372000}, {0x40374000}, {0x40376000}, 
-    {0x40378000}, {0x4037a000}, {0x4037c000}, {0x4037e000}, 
-    {0x40380000}, {0x40382000}, {0x40384000}, {0x40386000}, 
-    {0x40388000}, {0x4038a000}, {0x4038c000}, {0x4038e000}, 
-    {0x40390000}, {0x40392000}, {0x40394000}, {0x40396000}, 
-    {0x40398000}, {0x4039a000}, {0x4039c000}, {0x4039e000}, 
-    {0x403a0000}, {0x403a2000}, {0x403a4000}, {0x403a6000}, 
-    {0x403a8000}, {0x403aa000}, {0x403ac000}, {0x403ae000}, 
-    {0x403b0000}, {0x403b2000}, {0x403b4000}, {0x403b6000}, 
-    {0x403b8000}, {0x403ba000}, {0x403bc000}, {0x403be000}, 
-    {0x403c0000}, {0x403c2000}, {0x403c4000}, {0x403c6000}, 
-    {0x403c8000}, {0x403ca000}, {0x403cc000}, {0x403ce000}, 
-    {0x403d0000}, {0x403d2000}, {0x403d4000}, {0x403d6000}, 
-    {0x403d8000}, {0x403da000}, {0x403dc000}, {0x403de000}, 
-    {0x403e0000}, {0x403e2000}, {0x403e4000}, {0x403e6000}, 
-    {0x403e8000}, {0x403ea000}, {0x403ec000}, {0x403ee000}, 
-    {0x403f0000}, {0x403f2000}, {0x403f4000}, {0x403f6000}, 
-    {0x403f8000}, {0x403fa000}, {0x403fc000}, {0x403fe000}, 
-    {0x40400000}, {0x40402000}, {0x40404000}, {0x40406000}, 
-    {0x40408000}, {0x4040a000}, {0x4040c000}, {0x4040e000}, 
-    {0x40410000}, {0x40412000}, {0x40414000}, {0x40416000}, 
-    {0x40418000}, {0x4041a000}, {0x4041c000}, {0x4041e000}, 
-    {0x40420000}, {0x40422000}, {0x40424000}, {0x40426000}, 
-    {0x40428000}, {0x4042a000}, {0x4042c000}, {0x4042e000}, 
-    {0x40430000}, {0x40432000}, {0x40434000}, {0x40436000}, 
-    {0x40438000}, {0x4043a000}, {0x4043c000}, {0x4043e000}, 
-    {0x40440000}, {0x40442000}, {0x40444000}, {0x40446000}, 
-    {0x40448000}, {0x4044a000}, {0x4044c000}, {0x4044e000}, 
-    {0x40450000}, {0x40452000}, {0x40454000}, {0x40456000}, 
-    {0x40458000}, {0x4045a000}, {0x4045c000}, {0x4045e000}, 
-    {0x40460000}, {0x40462000}, {0x40464000}, {0x40466000}, 
-    {0x40468000}, {0x4046a000}, {0x4046c000}, {0x4046e000}, 
-    {0x40470000}, {0x40472000}, {0x40474000}, {0x40476000}, 
-    {0x40478000}, {0x4047a000}, {0x4047c000}, {0x4047e000}, 
-    {0x40480000}, {0x40482000}, {0x40484000}, {0x40486000}, 
-    {0x40488000}, {0x4048a000}, {0x4048c000}, {0x4048e000}, 
-    {0x40490000}, {0x40492000}, {0x40494000}, {0x40496000}, 
-    {0x40498000}, {0x4049a000}, {0x4049c000}, {0x4049e000}, 
-    {0x404a0000}, {0x404a2000}, {0x404a4000}, {0x404a6000}, 
-    {0x404a8000}, {0x404aa000}, {0x404ac000}, {0x404ae000}, 
-    {0x404b0000}, {0x404b2000}, {0x404b4000}, {0x404b6000}, 
-    {0x404b8000}, {0x404ba000}, {0x404bc000}, {0x404be000}, 
-    {0x404c0000}, {0x404c2000}, {0x404c4000}, {0x404c6000}, 
-    {0x404c8000}, {0x404ca000}, {0x404cc000}, {0x404ce000}, 
-    {0x404d0000}, {0x404d2000}, {0x404d4000}, {0x404d6000}, 
-    {0x404d8000}, {0x404da000}, {0x404dc000}, {0x404de000}, 
-    {0x404e0000}, {0x404e2000}, {0x404e4000}, {0x404e6000}, 
-    {0x404e8000}, {0x404ea000}, {0x404ec000}, {0x404ee000}, 
-    {0x404f0000}, {0x404f2000}, {0x404f4000}, {0x404f6000}, 
-    {0x404f8000}, {0x404fa000}, {0x404fc000}, {0x404fe000}, 
-    {0x40500000}, {0x40502000}, {0x40504000}, {0x40506000}, 
-    {0x40508000}, {0x4050a000}, {0x4050c000}, {0x4050e000}, 
-    {0x40510000}, {0x40512000}, {0x40514000}, {0x40516000}, 
-    {0x40518000}, {0x4051a000}, {0x4051c000}, {0x4051e000}, 
-    {0x40520000}, {0x40522000}, {0x40524000}, {0x40526000}, 
-    {0x40528000}, {0x4052a000}, {0x4052c000}, {0x4052e000}, 
-    {0x40530000}, {0x40532000}, {0x40534000}, {0x40536000}, 
-    {0x40538000}, {0x4053a000}, {0x4053c000}, {0x4053e000}, 
-    {0x40540000}, {0x40542000}, {0x40544000}, {0x40546000}, 
-    {0x40548000}, {0x4054a000}, {0x4054c000}, {0x4054e000}, 
-    {0x40550000}, {0x40552000}, {0x40554000}, {0x40556000}, 
-    {0x40558000}, {0x4055a000}, {0x4055c000}, {0x4055e000}, 
-    {0x40560000}, {0x40562000}, {0x40564000}, {0x40566000}, 
-    {0x40568000}, {0x4056a000}, {0x4056c000}, {0x4056e000}, 
-    {0x40570000}, {0x40572000}, {0x40574000}, {0x40576000}, 
-    {0x40578000}, {0x4057a000}, {0x4057c000}, {0x4057e000}, 
-    {0x40580000}, {0x40582000}, {0x40584000}, {0x40586000}, 
-    {0x40588000}, {0x4058a000}, {0x4058c000}, {0x4058e000}, 
-    {0x40590000}, {0x40592000}, {0x40594000}, {0x40596000}, 
-    {0x40598000}, {0x4059a000}, {0x4059c000}, {0x4059e000}, 
-    {0x405a0000}, {0x405a2000}, {0x405a4000}, {0x405a6000}, 
-    {0x405a8000}, {0x405aa000}, {0x405ac000}, {0x405ae000}, 
-    {0x405b0000}, {0x405b2000}, {0x405b4000}, {0x405b6000}, 
-    {0x405b8000}, {0x405ba000}, {0x405bc000}, {0x405be000}, 
-    {0x405c0000}, {0x405c2000}, {0x405c4000}, {0x405c6000}, 
-    {0x405c8000}, {0x405ca000}, {0x405cc000}, {0x405ce000}, 
-    {0x405d0000}, {0x405d2000}, {0x405d4000}, {0x405d6000}, 
-    {0x405d8000}, {0x405da000}, {0x405dc000}, {0x405de000}, 
-    {0x405e0000}, {0x405e2000}, {0x405e4000}, {0x405e6000}, 
-    {0x405e8000}, {0x405ea000}, {0x405ec000}, {0x405ee000}, 
-    {0x405f0000}, {0x405f2000}, {0x405f4000}, {0x405f6000}, 
-    {0x405f8000}, {0x405fa000}, {0x405fc000}, {0x405fe000}, 
-    {0x40600000}, {0x40602000}, {0x40604000}, {0x40606000}, 
-    {0x40608000}, {0x4060a000}, {0x4060c000}, {0x4060e000}, 
-    {0x40610000}, {0x40612000}, {0x40614000}, {0x40616000}, 
-    {0x40618000}, {0x4061a000}, {0x4061c000}, {0x4061e000}, 
-    {0x40620000}, {0x40622000}, {0x40624000}, {0x40626000}, 
-    {0x40628000}, {0x4062a000}, {0x4062c000}, {0x4062e000}, 
-    {0x40630000}, {0x40632000}, {0x40634000}, {0x40636000}, 
-    {0x40638000}, {0x4063a000}, {0x4063c000}, {0x4063e000}, 
-    {0x40640000}, {0x40642000}, {0x40644000}, {0x40646000}, 
-    {0x40648000}, {0x4064a000}, {0x4064c000}, {0x4064e000}, 
-    {0x40650000}, {0x40652000}, {0x40654000}, {0x40656000}, 
-    {0x40658000}, {0x4065a000}, {0x4065c000}, {0x4065e000}, 
-    {0x40660000}, {0x40662000}, {0x40664000}, {0x40666000}, 
-    {0x40668000}, {0x4066a000}, {0x4066c000}, {0x4066e000}, 
-    {0x40670000}, {0x40672000}, {0x40674000}, {0x40676000}, 
-    {0x40678000}, {0x4067a000}, {0x4067c000}, {0x4067e000}, 
-    {0x40680000}, {0x40682000}, {0x40684000}, {0x40686000}, 
-    {0x40688000}, {0x4068a000}, {0x4068c000}, {0x4068e000}, 
-    {0x40690000}, {0x40692000}, {0x40694000}, {0x40696000}, 
-    {0x40698000}, {0x4069a000}, {0x4069c000}, {0x4069e000}, 
-    {0x406a0000}, {0x406a2000}, {0x406a4000}, {0x406a6000}, 
-    {0x406a8000}, {0x406aa000}, {0x406ac000}, {0x406ae000}, 
-    {0x406b0000}, {0x406b2000}, {0x406b4000}, {0x406b6000}, 
-    {0x406b8000}, {0x406ba000}, {0x406bc000}, {0x406be000}, 
-    {0x406c0000}, {0x406c2000}, {0x406c4000}, {0x406c6000}, 
-    {0x406c8000}, {0x406ca000}, {0x406cc000}, {0x406ce000}, 
-    {0x406d0000}, {0x406d2000}, {0x406d4000}, {0x406d6000}, 
-    {0x406d8000}, {0x406da000}, {0x406dc000}, {0x406de000}, 
-    {0x406e0000}, {0x406e2000}, {0x406e4000}, {0x406e6000}, 
-    {0x406e8000}, {0x406ea000}, {0x406ec000}, {0x406ee000}, 
-    {0x406f0000}, {0x406f2000}, {0x406f4000}, {0x406f6000}, 
-    {0x406f8000}, {0x406fa000}, {0x406fc000}, {0x406fe000}, 
-    {0x40700000}, {0x40702000}, {0x40704000}, {0x40706000}, 
-    {0x40708000}, {0x4070a000}, {0x4070c000}, {0x4070e000}, 
-    {0x40710000}, {0x40712000}, {0x40714000}, {0x40716000}, 
-    {0x40718000}, {0x4071a000}, {0x4071c000}, {0x4071e000}, 
-    {0x40720000}, {0x40722000}, {0x40724000}, {0x40726000}, 
-    {0x40728000}, {0x4072a000}, {0x4072c000}, {0x4072e000}, 
-    {0x40730000}, {0x40732000}, {0x40734000}, {0x40736000}, 
-    {0x40738000}, {0x4073a000}, {0x4073c000}, {0x4073e000}, 
-    {0x40740000}, {0x40742000}, {0x40744000}, {0x40746000}, 
-    {0x40748000}, {0x4074a000}, {0x4074c000}, {0x4074e000}, 
-    {0x40750000}, {0x40752000}, {0x40754000}, {0x40756000}, 
-    {0x40758000}, {0x4075a000}, {0x4075c000}, {0x4075e000}, 
-    {0x40760000}, {0x40762000}, {0x40764000}, {0x40766000}, 
-    {0x40768000}, {0x4076a000}, {0x4076c000}, {0x4076e000}, 
-    {0x40770000}, {0x40772000}, {0x40774000}, {0x40776000}, 
-    {0x40778000}, {0x4077a000}, {0x4077c000}, {0x4077e000}, 
-    {0x40780000}, {0x40782000}, {0x40784000}, {0x40786000}, 
-    {0x40788000}, {0x4078a000}, {0x4078c000}, {0x4078e000}, 
-    {0x40790000}, {0x40792000}, {0x40794000}, {0x40796000}, 
-    {0x40798000}, {0x4079a000}, {0x4079c000}, {0x4079e000}, 
-    {0x407a0000}, {0x407a2000}, {0x407a4000}, {0x407a6000}, 
-    {0x407a8000}, {0x407aa000}, {0x407ac000}, {0x407ae000}, 
-    {0x407b0000}, {0x407b2000}, {0x407b4000}, {0x407b6000}, 
-    {0x407b8000}, {0x407ba000}, {0x407bc000}, {0x407be000}, 
-    {0x407c0000}, {0x407c2000}, {0x407c4000}, {0x407c6000}, 
-    {0x407c8000}, {0x407ca000}, {0x407cc000}, {0x407ce000}, 
-    {0x407d0000}, {0x407d2000}, {0x407d4000}, {0x407d6000}, 
-    {0x407d8000}, {0x407da000}, {0x407dc000}, {0x407de000}, 
-    {0x407e0000}, {0x407e2000}, {0x407e4000}, {0x407e6000}, 
-    {0x407e8000}, {0x407ea000}, {0x407ec000}, {0x407ee000}, 
-    {0x407f0000}, {0x407f2000}, {0x407f4000}, {0x407f6000}, 
-    {0x407f8000}, {0x407fa000}, {0x407fc000}, {0x407fe000}, 
-    {0x40800000}, {0x40802000}, {0x40804000}, {0x40806000}, 
-    {0x40808000}, {0x4080a000}, {0x4080c000}, {0x4080e000}, 
-    {0x40810000}, {0x40812000}, {0x40814000}, {0x40816000}, 
-    {0x40818000}, {0x4081a000}, {0x4081c000}, {0x4081e000}, 
-    {0x40820000}, {0x40822000}, {0x40824000}, {0x40826000}, 
-    {0x40828000}, {0x4082a000}, {0x4082c000}, {0x4082e000}, 
-    {0x40830000}, {0x40832000}, {0x40834000}, {0x40836000}, 
-    {0x40838000}, {0x4083a000}, {0x4083c000}, {0x4083e000}, 
-    {0x40840000}, {0x40842000}, {0x40844000}, {0x40846000}, 
-    {0x40848000}, {0x4084a000}, {0x4084c000}, {0x4084e000}, 
-    {0x40850000}, {0x40852000}, {0x40854000}, {0x40856000}, 
-    {0x40858000}, {0x4085a000}, {0x4085c000}, {0x4085e000}, 
-    {0x40860000}, {0x40862000}, {0x40864000}, {0x40866000}, 
-    {0x40868000}, {0x4086a000}, {0x4086c000}, {0x4086e000}, 
-    {0x40870000}, {0x40872000}, {0x40874000}, {0x40876000}, 
-    {0x40878000}, {0x4087a000}, {0x4087c000}, {0x4087e000}, 
-    {0x40880000}, {0x40882000}, {0x40884000}, {0x40886000}, 
-    {0x40888000}, {0x4088a000}, {0x4088c000}, {0x4088e000}, 
-    {0x40890000}, {0x40892000}, {0x40894000}, {0x40896000}, 
-    {0x40898000}, {0x4089a000}, {0x4089c000}, {0x4089e000}, 
-    {0x408a0000}, {0x408a2000}, {0x408a4000}, {0x408a6000}, 
-    {0x408a8000}, {0x408aa000}, {0x408ac000}, {0x408ae000}, 
-    {0x408b0000}, {0x408b2000}, {0x408b4000}, {0x408b6000}, 
-    {0x408b8000}, {0x408ba000}, {0x408bc000}, {0x408be000}, 
-    {0x408c0000}, {0x408c2000}, {0x408c4000}, {0x408c6000}, 
-    {0x408c8000}, {0x408ca000}, {0x408cc000}, {0x408ce000}, 
-    {0x408d0000}, {0x408d2000}, {0x408d4000}, {0x408d6000}, 
-    {0x408d8000}, {0x408da000}, {0x408dc000}, {0x408de000}, 
-    {0x408e0000}, {0x408e2000}, {0x408e4000}, {0x408e6000}, 
-    {0x408e8000}, {0x408ea000}, {0x408ec000}, {0x408ee000}, 
-    {0x408f0000}, {0x408f2000}, {0x408f4000}, {0x408f6000}, 
-    {0x408f8000}, {0x408fa000}, {0x408fc000}, {0x408fe000}, 
-    {0x40900000}, {0x40902000}, {0x40904000}, {0x40906000}, 
-    {0x40908000}, {0x4090a000}, {0x4090c000}, {0x4090e000}, 
-    {0x40910000}, {0x40912000}, {0x40914000}, {0x40916000}, 
-    {0x40918000}, {0x4091a000}, {0x4091c000}, {0x4091e000}, 
-    {0x40920000}, {0x40922000}, {0x40924000}, {0x40926000}, 
-    {0x40928000}, {0x4092a000}, {0x4092c000}, {0x4092e000}, 
-    {0x40930000}, {0x40932000}, {0x40934000}, {0x40936000}, 
-    {0x40938000}, {0x4093a000}, {0x4093c000}, {0x4093e000}, 
-    {0x40940000}, {0x40942000}, {0x40944000}, {0x40946000}, 
-    {0x40948000}, {0x4094a000}, {0x4094c000}, {0x4094e000}, 
-    {0x40950000}, {0x40952000}, {0x40954000}, {0x40956000}, 
-    {0x40958000}, {0x4095a000}, {0x4095c000}, {0x4095e000}, 
-    {0x40960000}, {0x40962000}, {0x40964000}, {0x40966000}, 
-    {0x40968000}, {0x4096a000}, {0x4096c000}, {0x4096e000}, 
-    {0x40970000}, {0x40972000}, {0x40974000}, {0x40976000}, 
-    {0x40978000}, {0x4097a000}, {0x4097c000}, {0x4097e000}, 
-    {0x40980000}, {0x40982000}, {0x40984000}, {0x40986000}, 
-    {0x40988000}, {0x4098a000}, {0x4098c000}, {0x4098e000}, 
-    {0x40990000}, {0x40992000}, {0x40994000}, {0x40996000}, 
-    {0x40998000}, {0x4099a000}, {0x4099c000}, {0x4099e000}, 
-    {0x409a0000}, {0x409a2000}, {0x409a4000}, {0x409a6000}, 
-    {0x409a8000}, {0x409aa000}, {0x409ac000}, {0x409ae000}, 
-    {0x409b0000}, {0x409b2000}, {0x409b4000}, {0x409b6000}, 
-    {0x409b8000}, {0x409ba000}, {0x409bc000}, {0x409be000}, 
-    {0x409c0000}, {0x409c2000}, {0x409c4000}, {0x409c6000}, 
-    {0x409c8000}, {0x409ca000}, {0x409cc000}, {0x409ce000}, 
-    {0x409d0000}, {0x409d2000}, {0x409d4000}, {0x409d6000}, 
-    {0x409d8000}, {0x409da000}, {0x409dc000}, {0x409de000}, 
-    {0x409e0000}, {0x409e2000}, {0x409e4000}, {0x409e6000}, 
-    {0x409e8000}, {0x409ea000}, {0x409ec000}, {0x409ee000}, 
-    {0x409f0000}, {0x409f2000}, {0x409f4000}, {0x409f6000}, 
-    {0x409f8000}, {0x409fa000}, {0x409fc000}, {0x409fe000}, 
-    {0x40a00000}, {0x40a02000}, {0x40a04000}, {0x40a06000}, 
-    {0x40a08000}, {0x40a0a000}, {0x40a0c000}, {0x40a0e000}, 
-    {0x40a10000}, {0x40a12000}, {0x40a14000}, {0x40a16000}, 
-    {0x40a18000}, {0x40a1a000}, {0x40a1c000}, {0x40a1e000}, 
-    {0x40a20000}, {0x40a22000}, {0x40a24000}, {0x40a26000}, 
-    {0x40a28000}, {0x40a2a000}, {0x40a2c000}, {0x40a2e000}, 
-    {0x40a30000}, {0x40a32000}, {0x40a34000}, {0x40a36000}, 
-    {0x40a38000}, {0x40a3a000}, {0x40a3c000}, {0x40a3e000}, 
-    {0x40a40000}, {0x40a42000}, {0x40a44000}, {0x40a46000}, 
-    {0x40a48000}, {0x40a4a000}, {0x40a4c000}, {0x40a4e000}, 
-    {0x40a50000}, {0x40a52000}, {0x40a54000}, {0x40a56000}, 
-    {0x40a58000}, {0x40a5a000}, {0x40a5c000}, {0x40a5e000}, 
-    {0x40a60000}, {0x40a62000}, {0x40a64000}, {0x40a66000}, 
-    {0x40a68000}, {0x40a6a000}, {0x40a6c000}, {0x40a6e000}, 
-    {0x40a70000}, {0x40a72000}, {0x40a74000}, {0x40a76000}, 
-    {0x40a78000}, {0x40a7a000}, {0x40a7c000}, {0x40a7e000}, 
-    {0x40a80000}, {0x40a82000}, {0x40a84000}, {0x40a86000}, 
-    {0x40a88000}, {0x40a8a000}, {0x40a8c000}, {0x40a8e000}, 
-    {0x40a90000}, {0x40a92000}, {0x40a94000}, {0x40a96000}, 
-    {0x40a98000}, {0x40a9a000}, {0x40a9c000}, {0x40a9e000}, 
-    {0x40aa0000}, {0x40aa2000}, {0x40aa4000}, {0x40aa6000}, 
-    {0x40aa8000}, {0x40aaa000}, {0x40aac000}, {0x40aae000}, 
-    {0x40ab0000}, {0x40ab2000}, {0x40ab4000}, {0x40ab6000}, 
-    {0x40ab8000}, {0x40aba000}, {0x40abc000}, {0x40abe000}, 
-    {0x40ac0000}, {0x40ac2000}, {0x40ac4000}, {0x40ac6000}, 
-    {0x40ac8000}, {0x40aca000}, {0x40acc000}, {0x40ace000}, 
-    {0x40ad0000}, {0x40ad2000}, {0x40ad4000}, {0x40ad6000}, 
-    {0x40ad8000}, {0x40ada000}, {0x40adc000}, {0x40ade000}, 
-    {0x40ae0000}, {0x40ae2000}, {0x40ae4000}, {0x40ae6000}, 
-    {0x40ae8000}, {0x40aea000}, {0x40aec000}, {0x40aee000}, 
-    {0x40af0000}, {0x40af2000}, {0x40af4000}, {0x40af6000}, 
-    {0x40af8000}, {0x40afa000}, {0x40afc000}, {0x40afe000}, 
-    {0x40b00000}, {0x40b02000}, {0x40b04000}, {0x40b06000}, 
-    {0x40b08000}, {0x40b0a000}, {0x40b0c000}, {0x40b0e000}, 
-    {0x40b10000}, {0x40b12000}, {0x40b14000}, {0x40b16000}, 
-    {0x40b18000}, {0x40b1a000}, {0x40b1c000}, {0x40b1e000}, 
-    {0x40b20000}, {0x40b22000}, {0x40b24000}, {0x40b26000}, 
-    {0x40b28000}, {0x40b2a000}, {0x40b2c000}, {0x40b2e000}, 
-    {0x40b30000}, {0x40b32000}, {0x40b34000}, {0x40b36000}, 
-    {0x40b38000}, {0x40b3a000}, {0x40b3c000}, {0x40b3e000}, 
-    {0x40b40000}, {0x40b42000}, {0x40b44000}, {0x40b46000}, 
-    {0x40b48000}, {0x40b4a000}, {0x40b4c000}, {0x40b4e000}, 
-    {0x40b50000}, {0x40b52000}, {0x40b54000}, {0x40b56000}, 
-    {0x40b58000}, {0x40b5a000}, {0x40b5c000}, {0x40b5e000}, 
-    {0x40b60000}, {0x40b62000}, {0x40b64000}, {0x40b66000}, 
-    {0x40b68000}, {0x40b6a000}, {0x40b6c000}, {0x40b6e000}, 
-    {0x40b70000}, {0x40b72000}, {0x40b74000}, {0x40b76000}, 
-    {0x40b78000}, {0x40b7a000}, {0x40b7c000}, {0x40b7e000}, 
-    {0x40b80000}, {0x40b82000}, {0x40b84000}, {0x40b86000}, 
-    {0x40b88000}, {0x40b8a000}, {0x40b8c000}, {0x40b8e000}, 
-    {0x40b90000}, {0x40b92000}, {0x40b94000}, {0x40b96000}, 
-    {0x40b98000}, {0x40b9a000}, {0x40b9c000}, {0x40b9e000}, 
-    {0x40ba0000}, {0x40ba2000}, {0x40ba4000}, {0x40ba6000}, 
-    {0x40ba8000}, {0x40baa000}, {0x40bac000}, {0x40bae000}, 
-    {0x40bb0000}, {0x40bb2000}, {0x40bb4000}, {0x40bb6000}, 
-    {0x40bb8000}, {0x40bba000}, {0x40bbc000}, {0x40bbe000}, 
-    {0x40bc0000}, {0x40bc2000}, {0x40bc4000}, {0x40bc6000}, 
-    {0x40bc8000}, {0x40bca000}, {0x40bcc000}, {0x40bce000}, 
-    {0x40bd0000}, {0x40bd2000}, {0x40bd4000}, {0x40bd6000}, 
-    {0x40bd8000}, {0x40bda000}, {0x40bdc000}, {0x40bde000}, 
-    {0x40be0000}, {0x40be2000}, {0x40be4000}, {0x40be6000}, 
-    {0x40be8000}, {0x40bea000}, {0x40bec000}, {0x40bee000}, 
-    {0x40bf0000}, {0x40bf2000}, {0x40bf4000}, {0x40bf6000}, 
-    {0x40bf8000}, {0x40bfa000}, {0x40bfc000}, {0x40bfe000}, 
-    {0x40c00000}, {0x40c02000}, {0x40c04000}, {0x40c06000}, 
-    {0x40c08000}, {0x40c0a000}, {0x40c0c000}, {0x40c0e000}, 
-    {0x40c10000}, {0x40c12000}, {0x40c14000}, {0x40c16000}, 
-    {0x40c18000}, {0x40c1a000}, {0x40c1c000}, {0x40c1e000}, 
-    {0x40c20000}, {0x40c22000}, {0x40c24000}, {0x40c26000}, 
-    {0x40c28000}, {0x40c2a000}, {0x40c2c000}, {0x40c2e000}, 
-    {0x40c30000}, {0x40c32000}, {0x40c34000}, {0x40c36000}, 
-    {0x40c38000}, {0x40c3a000}, {0x40c3c000}, {0x40c3e000}, 
-    {0x40c40000}, {0x40c42000}, {0x40c44000}, {0x40c46000}, 
-    {0x40c48000}, {0x40c4a000}, {0x40c4c000}, {0x40c4e000}, 
-    {0x40c50000}, {0x40c52000}, {0x40c54000}, {0x40c56000}, 
-    {0x40c58000}, {0x40c5a000}, {0x40c5c000}, {0x40c5e000}, 
-    {0x40c60000}, {0x40c62000}, {0x40c64000}, {0x40c66000}, 
-    {0x40c68000}, {0x40c6a000}, {0x40c6c000}, {0x40c6e000}, 
-    {0x40c70000}, {0x40c72000}, {0x40c74000}, {0x40c76000}, 
-    {0x40c78000}, {0x40c7a000}, {0x40c7c000}, {0x40c7e000}, 
-    {0x40c80000}, {0x40c82000}, {0x40c84000}, {0x40c86000}, 
-    {0x40c88000}, {0x40c8a000}, {0x40c8c000}, {0x40c8e000}, 
-    {0x40c90000}, {0x40c92000}, {0x40c94000}, {0x40c96000}, 
-    {0x40c98000}, {0x40c9a000}, {0x40c9c000}, {0x40c9e000}, 
-    {0x40ca0000}, {0x40ca2000}, {0x40ca4000}, {0x40ca6000}, 
-    {0x40ca8000}, {0x40caa000}, {0x40cac000}, {0x40cae000}, 
-    {0x40cb0000}, {0x40cb2000}, {0x40cb4000}, {0x40cb6000}, 
-    {0x40cb8000}, {0x40cba000}, {0x40cbc000}, {0x40cbe000}, 
-    {0x40cc0000}, {0x40cc2000}, {0x40cc4000}, {0x40cc6000}, 
-    {0x40cc8000}, {0x40cca000}, {0x40ccc000}, {0x40cce000}, 
-    {0x40cd0000}, {0x40cd2000}, {0x40cd4000}, {0x40cd6000}, 
-    {0x40cd8000}, {0x40cda000}, {0x40cdc000}, {0x40cde000}, 
-    {0x40ce0000}, {0x40ce2000}, {0x40ce4000}, {0x40ce6000}, 
-    {0x40ce8000}, {0x40cea000}, {0x40cec000}, {0x40cee000}, 
-    {0x40cf0000}, {0x40cf2000}, {0x40cf4000}, {0x40cf6000}, 
-    {0x40cf8000}, {0x40cfa000}, {0x40cfc000}, {0x40cfe000}, 
-    {0x40d00000}, {0x40d02000}, {0x40d04000}, {0x40d06000}, 
-    {0x40d08000}, {0x40d0a000}, {0x40d0c000}, {0x40d0e000}, 
-    {0x40d10000}, {0x40d12000}, {0x40d14000}, {0x40d16000}, 
-    {0x40d18000}, {0x40d1a000}, {0x40d1c000}, {0x40d1e000}, 
-    {0x40d20000}, {0x40d22000}, {0x40d24000}, {0x40d26000}, 
-    {0x40d28000}, {0x40d2a000}, {0x40d2c000}, {0x40d2e000}, 
-    {0x40d30000}, {0x40d32000}, {0x40d34000}, {0x40d36000}, 
-    {0x40d38000}, {0x40d3a000}, {0x40d3c000}, {0x40d3e000}, 
-    {0x40d40000}, {0x40d42000}, {0x40d44000}, {0x40d46000}, 
-    {0x40d48000}, {0x40d4a000}, {0x40d4c000}, {0x40d4e000}, 
-    {0x40d50000}, {0x40d52000}, {0x40d54000}, {0x40d56000}, 
-    {0x40d58000}, {0x40d5a000}, {0x40d5c000}, {0x40d5e000}, 
-    {0x40d60000}, {0x40d62000}, {0x40d64000}, {0x40d66000}, 
-    {0x40d68000}, {0x40d6a000}, {0x40d6c000}, {0x40d6e000}, 
-    {0x40d70000}, {0x40d72000}, {0x40d74000}, {0x40d76000}, 
-    {0x40d78000}, {0x40d7a000}, {0x40d7c000}, {0x40d7e000}, 
-    {0x40d80000}, {0x40d82000}, {0x40d84000}, {0x40d86000}, 
-    {0x40d88000}, {0x40d8a000}, {0x40d8c000}, {0x40d8e000}, 
-    {0x40d90000}, {0x40d92000}, {0x40d94000}, {0x40d96000}, 
-    {0x40d98000}, {0x40d9a000}, {0x40d9c000}, {0x40d9e000}, 
-    {0x40da0000}, {0x40da2000}, {0x40da4000}, {0x40da6000}, 
-    {0x40da8000}, {0x40daa000}, {0x40dac000}, {0x40dae000}, 
-    {0x40db0000}, {0x40db2000}, {0x40db4000}, {0x40db6000}, 
-    {0x40db8000}, {0x40dba000}, {0x40dbc000}, {0x40dbe000}, 
-    {0x40dc0000}, {0x40dc2000}, {0x40dc4000}, {0x40dc6000}, 
-    {0x40dc8000}, {0x40dca000}, {0x40dcc000}, {0x40dce000}, 
-    {0x40dd0000}, {0x40dd2000}, {0x40dd4000}, {0x40dd6000}, 
-    {0x40dd8000}, {0x40dda000}, {0x40ddc000}, {0x40dde000}, 
-    {0x40de0000}, {0x40de2000}, {0x40de4000}, {0x40de6000}, 
-    {0x40de8000}, {0x40dea000}, {0x40dec000}, {0x40dee000}, 
-    {0x40df0000}, {0x40df2000}, {0x40df4000}, {0x40df6000}, 
-    {0x40df8000}, {0x40dfa000}, {0x40dfc000}, {0x40dfe000}, 
-    {0x40e00000}, {0x40e02000}, {0x40e04000}, {0x40e06000}, 
-    {0x40e08000}, {0x40e0a000}, {0x40e0c000}, {0x40e0e000}, 
-    {0x40e10000}, {0x40e12000}, {0x40e14000}, {0x40e16000}, 
-    {0x40e18000}, {0x40e1a000}, {0x40e1c000}, {0x40e1e000}, 
-    {0x40e20000}, {0x40e22000}, {0x40e24000}, {0x40e26000}, 
-    {0x40e28000}, {0x40e2a000}, {0x40e2c000}, {0x40e2e000}, 
-    {0x40e30000}, {0x40e32000}, {0x40e34000}, {0x40e36000}, 
-    {0x40e38000}, {0x40e3a000}, {0x40e3c000}, {0x40e3e000}, 
-    {0x40e40000}, {0x40e42000}, {0x40e44000}, {0x40e46000}, 
-    {0x40e48000}, {0x40e4a000}, {0x40e4c000}, {0x40e4e000}, 
-    {0x40e50000}, {0x40e52000}, {0x40e54000}, {0x40e56000}, 
-    {0x40e58000}, {0x40e5a000}, {0x40e5c000}, {0x40e5e000}, 
-    {0x40e60000}, {0x40e62000}, {0x40e64000}, {0x40e66000}, 
-    {0x40e68000}, {0x40e6a000}, {0x40e6c000}, {0x40e6e000}, 
-    {0x40e70000}, {0x40e72000}, {0x40e74000}, {0x40e76000}, 
-    {0x40e78000}, {0x40e7a000}, {0x40e7c000}, {0x40e7e000}, 
-    {0x40e80000}, {0x40e82000}, {0x40e84000}, {0x40e86000}, 
-    {0x40e88000}, {0x40e8a000}, {0x40e8c000}, {0x40e8e000}, 
-    {0x40e90000}, {0x40e92000}, {0x40e94000}, {0x40e96000}, 
-    {0x40e98000}, {0x40e9a000}, {0x40e9c000}, {0x40e9e000}, 
-    {0x40ea0000}, {0x40ea2000}, {0x40ea4000}, {0x40ea6000}, 
-    {0x40ea8000}, {0x40eaa000}, {0x40eac000}, {0x40eae000}, 
-    {0x40eb0000}, {0x40eb2000}, {0x40eb4000}, {0x40eb6000}, 
-    {0x40eb8000}, {0x40eba000}, {0x40ebc000}, {0x40ebe000}, 
-    {0x40ec0000}, {0x40ec2000}, {0x40ec4000}, {0x40ec6000}, 
-    {0x40ec8000}, {0x40eca000}, {0x40ecc000}, {0x40ece000}, 
-    {0x40ed0000}, {0x40ed2000}, {0x40ed4000}, {0x40ed6000}, 
-    {0x40ed8000}, {0x40eda000}, {0x40edc000}, {0x40ede000}, 
-    {0x40ee0000}, {0x40ee2000}, {0x40ee4000}, {0x40ee6000}, 
-    {0x40ee8000}, {0x40eea000}, {0x40eec000}, {0x40eee000}, 
-    {0x40ef0000}, {0x40ef2000}, {0x40ef4000}, {0x40ef6000}, 
-    {0x40ef8000}, {0x40efa000}, {0x40efc000}, {0x40efe000}, 
-    {0x40f00000}, {0x40f02000}, {0x40f04000}, {0x40f06000}, 
-    {0x40f08000}, {0x40f0a000}, {0x40f0c000}, {0x40f0e000}, 
-    {0x40f10000}, {0x40f12000}, {0x40f14000}, {0x40f16000}, 
-    {0x40f18000}, {0x40f1a000}, {0x40f1c000}, {0x40f1e000}, 
-    {0x40f20000}, {0x40f22000}, {0x40f24000}, {0x40f26000}, 
-    {0x40f28000}, {0x40f2a000}, {0x40f2c000}, {0x40f2e000}, 
-    {0x40f30000}, {0x40f32000}, {0x40f34000}, {0x40f36000}, 
-    {0x40f38000}, {0x40f3a000}, {0x40f3c000}, {0x40f3e000}, 
-    {0x40f40000}, {0x40f42000}, {0x40f44000}, {0x40f46000}, 
-    {0x40f48000}, {0x40f4a000}, {0x40f4c000}, {0x40f4e000}, 
-    {0x40f50000}, {0x40f52000}, {0x40f54000}, {0x40f56000}, 
-    {0x40f58000}, {0x40f5a000}, {0x40f5c000}, {0x40f5e000}, 
-    {0x40f60000}, {0x40f62000}, {0x40f64000}, {0x40f66000}, 
-    {0x40f68000}, {0x40f6a000}, {0x40f6c000}, {0x40f6e000}, 
-    {0x40f70000}, {0x40f72000}, {0x40f74000}, {0x40f76000}, 
-    {0x40f78000}, {0x40f7a000}, {0x40f7c000}, {0x40f7e000}, 
-    {0x40f80000}, {0x40f82000}, {0x40f84000}, {0x40f86000}, 
-    {0x40f88000}, {0x40f8a000}, {0x40f8c000}, {0x40f8e000}, 
-    {0x40f90000}, {0x40f92000}, {0x40f94000}, {0x40f96000}, 
-    {0x40f98000}, {0x40f9a000}, {0x40f9c000}, {0x40f9e000}, 
-    {0x40fa0000}, {0x40fa2000}, {0x40fa4000}, {0x40fa6000}, 
-    {0x40fa8000}, {0x40faa000}, {0x40fac000}, {0x40fae000}, 
-    {0x40fb0000}, {0x40fb2000}, {0x40fb4000}, {0x40fb6000}, 
-    {0x40fb8000}, {0x40fba000}, {0x40fbc000}, {0x40fbe000}, 
-    {0x40fc0000}, {0x40fc2000}, {0x40fc4000}, {0x40fc6000}, 
-    {0x40fc8000}, {0x40fca000}, {0x40fcc000}, {0x40fce000}, 
-    {0x40fd0000}, {0x40fd2000}, {0x40fd4000}, {0x40fd6000}, 
-    {0x40fd8000}, {0x40fda000}, {0x40fdc000}, {0x40fde000}, 
-    {0x40fe0000}, {0x40fe2000}, {0x40fe4000}, {0x40fe6000}, 
-    {0x40fe8000}, {0x40fea000}, {0x40fec000}, {0x40fee000}, 
-    {0x40ff0000}, {0x40ff2000}, {0x40ff4000}, {0x40ff6000}, 
-    {0x40ff8000}, {0x40ffa000}, {0x40ffc000}, {0x40ffe000}, 
-    {0x41000000}, {0x41002000}, {0x41004000}, {0x41006000}, 
-    {0x41008000}, {0x4100a000}, {0x4100c000}, {0x4100e000}, 
-    {0x41010000}, {0x41012000}, {0x41014000}, {0x41016000}, 
-    {0x41018000}, {0x4101a000}, {0x4101c000}, {0x4101e000}, 
-    {0x41020000}, {0x41022000}, {0x41024000}, {0x41026000}, 
-    {0x41028000}, {0x4102a000}, {0x4102c000}, {0x4102e000}, 
-    {0x41030000}, {0x41032000}, {0x41034000}, {0x41036000}, 
-    {0x41038000}, {0x4103a000}, {0x4103c000}, {0x4103e000}, 
-    {0x41040000}, {0x41042000}, {0x41044000}, {0x41046000}, 
-    {0x41048000}, {0x4104a000}, {0x4104c000}, {0x4104e000}, 
-    {0x41050000}, {0x41052000}, {0x41054000}, {0x41056000}, 
-    {0x41058000}, {0x4105a000}, {0x4105c000}, {0x4105e000}, 
-    {0x41060000}, {0x41062000}, {0x41064000}, {0x41066000}, 
-    {0x41068000}, {0x4106a000}, {0x4106c000}, {0x4106e000}, 
-    {0x41070000}, {0x41072000}, {0x41074000}, {0x41076000}, 
-    {0x41078000}, {0x4107a000}, {0x4107c000}, {0x4107e000}, 
-    {0x41080000}, {0x41082000}, {0x41084000}, {0x41086000}, 
-    {0x41088000}, {0x4108a000}, {0x4108c000}, {0x4108e000}, 
-    {0x41090000}, {0x41092000}, {0x41094000}, {0x41096000}, 
-    {0x41098000}, {0x4109a000}, {0x4109c000}, {0x4109e000}, 
-    {0x410a0000}, {0x410a2000}, {0x410a4000}, {0x410a6000}, 
-    {0x410a8000}, {0x410aa000}, {0x410ac000}, {0x410ae000}, 
-    {0x410b0000}, {0x410b2000}, {0x410b4000}, {0x410b6000}, 
-    {0x410b8000}, {0x410ba000}, {0x410bc000}, {0x410be000}, 
-    {0x410c0000}, {0x410c2000}, {0x410c4000}, {0x410c6000}, 
-    {0x410c8000}, {0x410ca000}, {0x410cc000}, {0x410ce000}, 
-    {0x410d0000}, {0x410d2000}, {0x410d4000}, {0x410d6000}, 
-    {0x410d8000}, {0x410da000}, {0x410dc000}, {0x410de000}, 
-    {0x410e0000}, {0x410e2000}, {0x410e4000}, {0x410e6000}, 
-    {0x410e8000}, {0x410ea000}, {0x410ec000}, {0x410ee000}, 
-    {0x410f0000}, {0x410f2000}, {0x410f4000}, {0x410f6000}, 
-    {0x410f8000}, {0x410fa000}, {0x410fc000}, {0x410fe000}, 
-    {0x41100000}, {0x41102000}, {0x41104000}, {0x41106000}, 
-    {0x41108000}, {0x4110a000}, {0x4110c000}, {0x4110e000}, 
-    {0x41110000}, {0x41112000}, {0x41114000}, {0x41116000}, 
-    {0x41118000}, {0x4111a000}, {0x4111c000}, {0x4111e000}, 
-    {0x41120000}, {0x41122000}, {0x41124000}, {0x41126000}, 
-    {0x41128000}, {0x4112a000}, {0x4112c000}, {0x4112e000}, 
-    {0x41130000}, {0x41132000}, {0x41134000}, {0x41136000}, 
-    {0x41138000}, {0x4113a000}, {0x4113c000}, {0x4113e000}, 
-    {0x41140000}, {0x41142000}, {0x41144000}, {0x41146000}, 
-    {0x41148000}, {0x4114a000}, {0x4114c000}, {0x4114e000}, 
-    {0x41150000}, {0x41152000}, {0x41154000}, {0x41156000}, 
-    {0x41158000}, {0x4115a000}, {0x4115c000}, {0x4115e000}, 
-    {0x41160000}, {0x41162000}, {0x41164000}, {0x41166000}, 
-    {0x41168000}, {0x4116a000}, {0x4116c000}, {0x4116e000}, 
-    {0x41170000}, {0x41172000}, {0x41174000}, {0x41176000}, 
-    {0x41178000}, {0x4117a000}, {0x4117c000}, {0x4117e000}, 
-    {0x41180000}, {0x41182000}, {0x41184000}, {0x41186000}, 
-    {0x41188000}, {0x4118a000}, {0x4118c000}, {0x4118e000}, 
-    {0x41190000}, {0x41192000}, {0x41194000}, {0x41196000}, 
-    {0x41198000}, {0x4119a000}, {0x4119c000}, {0x4119e000}, 
-    {0x411a0000}, {0x411a2000}, {0x411a4000}, {0x411a6000}, 
-    {0x411a8000}, {0x411aa000}, {0x411ac000}, {0x411ae000}, 
-    {0x411b0000}, {0x411b2000}, {0x411b4000}, {0x411b6000}, 
-    {0x411b8000}, {0x411ba000}, {0x411bc000}, {0x411be000}, 
-    {0x411c0000}, {0x411c2000}, {0x411c4000}, {0x411c6000}, 
-    {0x411c8000}, {0x411ca000}, {0x411cc000}, {0x411ce000}, 
-    {0x411d0000}, {0x411d2000}, {0x411d4000}, {0x411d6000}, 
-    {0x411d8000}, {0x411da000}, {0x411dc000}, {0x411de000}, 
-    {0x411e0000}, {0x411e2000}, {0x411e4000}, {0x411e6000}, 
-    {0x411e8000}, {0x411ea000}, {0x411ec000}, {0x411ee000}, 
-    {0x411f0000}, {0x411f2000}, {0x411f4000}, {0x411f6000}, 
-    {0x411f8000}, {0x411fa000}, {0x411fc000}, {0x411fe000}, 
-    {0x41200000}, {0x41202000}, {0x41204000}, {0x41206000}, 
-    {0x41208000}, {0x4120a000}, {0x4120c000}, {0x4120e000}, 
-    {0x41210000}, {0x41212000}, {0x41214000}, {0x41216000}, 
-    {0x41218000}, {0x4121a000}, {0x4121c000}, {0x4121e000}, 
-    {0x41220000}, {0x41222000}, {0x41224000}, {0x41226000}, 
-    {0x41228000}, {0x4122a000}, {0x4122c000}, {0x4122e000}, 
-    {0x41230000}, {0x41232000}, {0x41234000}, {0x41236000}, 
-    {0x41238000}, {0x4123a000}, {0x4123c000}, {0x4123e000}, 
-    {0x41240000}, {0x41242000}, {0x41244000}, {0x41246000}, 
-    {0x41248000}, {0x4124a000}, {0x4124c000}, {0x4124e000}, 
-    {0x41250000}, {0x41252000}, {0x41254000}, {0x41256000}, 
-    {0x41258000}, {0x4125a000}, {0x4125c000}, {0x4125e000}, 
-    {0x41260000}, {0x41262000}, {0x41264000}, {0x41266000}, 
-    {0x41268000}, {0x4126a000}, {0x4126c000}, {0x4126e000}, 
-    {0x41270000}, {0x41272000}, {0x41274000}, {0x41276000}, 
-    {0x41278000}, {0x4127a000}, {0x4127c000}, {0x4127e000}, 
-    {0x41280000}, {0x41282000}, {0x41284000}, {0x41286000}, 
-    {0x41288000}, {0x4128a000}, {0x4128c000}, {0x4128e000}, 
-    {0x41290000}, {0x41292000}, {0x41294000}, {0x41296000}, 
-    {0x41298000}, {0x4129a000}, {0x4129c000}, {0x4129e000}, 
-    {0x412a0000}, {0x412a2000}, {0x412a4000}, {0x412a6000}, 
-    {0x412a8000}, {0x412aa000}, {0x412ac000}, {0x412ae000}, 
-    {0x412b0000}, {0x412b2000}, {0x412b4000}, {0x412b6000}, 
-    {0x412b8000}, {0x412ba000}, {0x412bc000}, {0x412be000}, 
-    {0x412c0000}, {0x412c2000}, {0x412c4000}, {0x412c6000}, 
-    {0x412c8000}, {0x412ca000}, {0x412cc000}, {0x412ce000}, 
-    {0x412d0000}, {0x412d2000}, {0x412d4000}, {0x412d6000}, 
-    {0x412d8000}, {0x412da000}, {0x412dc000}, {0x412de000}, 
-    {0x412e0000}, {0x412e2000}, {0x412e4000}, {0x412e6000}, 
-    {0x412e8000}, {0x412ea000}, {0x412ec000}, {0x412ee000}, 
-    {0x412f0000}, {0x412f2000}, {0x412f4000}, {0x412f6000}, 
-    {0x412f8000}, {0x412fa000}, {0x412fc000}, {0x412fe000}, 
-    {0x41300000}, {0x41302000}, {0x41304000}, {0x41306000}, 
-    {0x41308000}, {0x4130a000}, {0x4130c000}, {0x4130e000}, 
-    {0x41310000}, {0x41312000}, {0x41314000}, {0x41316000}, 
-    {0x41318000}, {0x4131a000}, {0x4131c000}, {0x4131e000}, 
-    {0x41320000}, {0x41322000}, {0x41324000}, {0x41326000}, 
-    {0x41328000}, {0x4132a000}, {0x4132c000}, {0x4132e000}, 
-    {0x41330000}, {0x41332000}, {0x41334000}, {0x41336000}, 
-    {0x41338000}, {0x4133a000}, {0x4133c000}, {0x4133e000}, 
-    {0x41340000}, {0x41342000}, {0x41344000}, {0x41346000}, 
-    {0x41348000}, {0x4134a000}, {0x4134c000}, {0x4134e000}, 
-    {0x41350000}, {0x41352000}, {0x41354000}, {0x41356000}, 
-    {0x41358000}, {0x4135a000}, {0x4135c000}, {0x4135e000}, 
-    {0x41360000}, {0x41362000}, {0x41364000}, {0x41366000}, 
-    {0x41368000}, {0x4136a000}, {0x4136c000}, {0x4136e000}, 
-    {0x41370000}, {0x41372000}, {0x41374000}, {0x41376000}, 
-    {0x41378000}, {0x4137a000}, {0x4137c000}, {0x4137e000}, 
-    {0x41380000}, {0x41382000}, {0x41384000}, {0x41386000}, 
-    {0x41388000}, {0x4138a000}, {0x4138c000}, {0x4138e000}, 
-    {0x41390000}, {0x41392000}, {0x41394000}, {0x41396000}, 
-    {0x41398000}, {0x4139a000}, {0x4139c000}, {0x4139e000}, 
-    {0x413a0000}, {0x413a2000}, {0x413a4000}, {0x413a6000}, 
-    {0x413a8000}, {0x413aa000}, {0x413ac000}, {0x413ae000}, 
-    {0x413b0000}, {0x413b2000}, {0x413b4000}, {0x413b6000}, 
-    {0x413b8000}, {0x413ba000}, {0x413bc000}, {0x413be000}, 
-    {0x413c0000}, {0x413c2000}, {0x413c4000}, {0x413c6000}, 
-    {0x413c8000}, {0x413ca000}, {0x413cc000}, {0x413ce000}, 
-    {0x413d0000}, {0x413d2000}, {0x413d4000}, {0x413d6000}, 
-    {0x413d8000}, {0x413da000}, {0x413dc000}, {0x413de000}, 
-    {0x413e0000}, {0x413e2000}, {0x413e4000}, {0x413e6000}, 
-    {0x413e8000}, {0x413ea000}, {0x413ec000}, {0x413ee000}, 
-    {0x413f0000}, {0x413f2000}, {0x413f4000}, {0x413f6000}, 
-    {0x413f8000}, {0x413fa000}, {0x413fc000}, {0x413fe000}, 
-    {0x41400000}, {0x41402000}, {0x41404000}, {0x41406000}, 
-    {0x41408000}, {0x4140a000}, {0x4140c000}, {0x4140e000}, 
-    {0x41410000}, {0x41412000}, {0x41414000}, {0x41416000}, 
-    {0x41418000}, {0x4141a000}, {0x4141c000}, {0x4141e000}, 
-    {0x41420000}, {0x41422000}, {0x41424000}, {0x41426000}, 
-    {0x41428000}, {0x4142a000}, {0x4142c000}, {0x4142e000}, 
-    {0x41430000}, {0x41432000}, {0x41434000}, {0x41436000}, 
-    {0x41438000}, {0x4143a000}, {0x4143c000}, {0x4143e000}, 
-    {0x41440000}, {0x41442000}, {0x41444000}, {0x41446000}, 
-    {0x41448000}, {0x4144a000}, {0x4144c000}, {0x4144e000}, 
-    {0x41450000}, {0x41452000}, {0x41454000}, {0x41456000}, 
-    {0x41458000}, {0x4145a000}, {0x4145c000}, {0x4145e000}, 
-    {0x41460000}, {0x41462000}, {0x41464000}, {0x41466000}, 
-    {0x41468000}, {0x4146a000}, {0x4146c000}, {0x4146e000}, 
-    {0x41470000}, {0x41472000}, {0x41474000}, {0x41476000}, 
-    {0x41478000}, {0x4147a000}, {0x4147c000}, {0x4147e000}, 
-    {0x41480000}, {0x41482000}, {0x41484000}, {0x41486000}, 
-    {0x41488000}, {0x4148a000}, {0x4148c000}, {0x4148e000}, 
-    {0x41490000}, {0x41492000}, {0x41494000}, {0x41496000}, 
-    {0x41498000}, {0x4149a000}, {0x4149c000}, {0x4149e000}, 
-    {0x414a0000}, {0x414a2000}, {0x414a4000}, {0x414a6000}, 
-    {0x414a8000}, {0x414aa000}, {0x414ac000}, {0x414ae000}, 
-    {0x414b0000}, {0x414b2000}, {0x414b4000}, {0x414b6000}, 
-    {0x414b8000}, {0x414ba000}, {0x414bc000}, {0x414be000}, 
-    {0x414c0000}, {0x414c2000}, {0x414c4000}, {0x414c6000}, 
-    {0x414c8000}, {0x414ca000}, {0x414cc000}, {0x414ce000}, 
-    {0x414d0000}, {0x414d2000}, {0x414d4000}, {0x414d6000}, 
-    {0x414d8000}, {0x414da000}, {0x414dc000}, {0x414de000}, 
-    {0x414e0000}, {0x414e2000}, {0x414e4000}, {0x414e6000}, 
-    {0x414e8000}, {0x414ea000}, {0x414ec000}, {0x414ee000}, 
-    {0x414f0000}, {0x414f2000}, {0x414f4000}, {0x414f6000}, 
-    {0x414f8000}, {0x414fa000}, {0x414fc000}, {0x414fe000}, 
-    {0x41500000}, {0x41502000}, {0x41504000}, {0x41506000}, 
-    {0x41508000}, {0x4150a000}, {0x4150c000}, {0x4150e000}, 
-    {0x41510000}, {0x41512000}, {0x41514000}, {0x41516000}, 
-    {0x41518000}, {0x4151a000}, {0x4151c000}, {0x4151e000}, 
-    {0x41520000}, {0x41522000}, {0x41524000}, {0x41526000}, 
-    {0x41528000}, {0x4152a000}, {0x4152c000}, {0x4152e000}, 
-    {0x41530000}, {0x41532000}, {0x41534000}, {0x41536000}, 
-    {0x41538000}, {0x4153a000}, {0x4153c000}, {0x4153e000}, 
-    {0x41540000}, {0x41542000}, {0x41544000}, {0x41546000}, 
-    {0x41548000}, {0x4154a000}, {0x4154c000}, {0x4154e000}, 
-    {0x41550000}, {0x41552000}, {0x41554000}, {0x41556000}, 
-    {0x41558000}, {0x4155a000}, {0x4155c000}, {0x4155e000}, 
-    {0x41560000}, {0x41562000}, {0x41564000}, {0x41566000}, 
-    {0x41568000}, {0x4156a000}, {0x4156c000}, {0x4156e000}, 
-    {0x41570000}, {0x41572000}, {0x41574000}, {0x41576000}, 
-    {0x41578000}, {0x4157a000}, {0x4157c000}, {0x4157e000}, 
-    {0x41580000}, {0x41582000}, {0x41584000}, {0x41586000}, 
-    {0x41588000}, {0x4158a000}, {0x4158c000}, {0x4158e000}, 
-    {0x41590000}, {0x41592000}, {0x41594000}, {0x41596000}, 
-    {0x41598000}, {0x4159a000}, {0x4159c000}, {0x4159e000}, 
-    {0x415a0000}, {0x415a2000}, {0x415a4000}, {0x415a6000}, 
-    {0x415a8000}, {0x415aa000}, {0x415ac000}, {0x415ae000}, 
-    {0x415b0000}, {0x415b2000}, {0x415b4000}, {0x415b6000}, 
-    {0x415b8000}, {0x415ba000}, {0x415bc000}, {0x415be000}, 
-    {0x415c0000}, {0x415c2000}, {0x415c4000}, {0x415c6000}, 
-    {0x415c8000}, {0x415ca000}, {0x415cc000}, {0x415ce000}, 
-    {0x415d0000}, {0x415d2000}, {0x415d4000}, {0x415d6000}, 
-    {0x415d8000}, {0x415da000}, {0x415dc000}, {0x415de000}, 
-    {0x415e0000}, {0x415e2000}, {0x415e4000}, {0x415e6000}, 
-    {0x415e8000}, {0x415ea000}, {0x415ec000}, {0x415ee000}, 
-    {0x415f0000}, {0x415f2000}, {0x415f4000}, {0x415f6000}, 
-    {0x415f8000}, {0x415fa000}, {0x415fc000}, {0x415fe000}, 
-    {0x41600000}, {0x41602000}, {0x41604000}, {0x41606000}, 
-    {0x41608000}, {0x4160a000}, {0x4160c000}, {0x4160e000}, 
-    {0x41610000}, {0x41612000}, {0x41614000}, {0x41616000}, 
-    {0x41618000}, {0x4161a000}, {0x4161c000}, {0x4161e000}, 
-    {0x41620000}, {0x41622000}, {0x41624000}, {0x41626000}, 
-    {0x41628000}, {0x4162a000}, {0x4162c000}, {0x4162e000}, 
-    {0x41630000}, {0x41632000}, {0x41634000}, {0x41636000}, 
-    {0x41638000}, {0x4163a000}, {0x4163c000}, {0x4163e000}, 
-    {0x41640000}, {0x41642000}, {0x41644000}, {0x41646000}, 
-    {0x41648000}, {0x4164a000}, {0x4164c000}, {0x4164e000}, 
-    {0x41650000}, {0x41652000}, {0x41654000}, {0x41656000}, 
-    {0x41658000}, {0x4165a000}, {0x4165c000}, {0x4165e000}, 
-    {0x41660000}, {0x41662000}, {0x41664000}, {0x41666000}, 
-    {0x41668000}, {0x4166a000}, {0x4166c000}, {0x4166e000}, 
-    {0x41670000}, {0x41672000}, {0x41674000}, {0x41676000}, 
-    {0x41678000}, {0x4167a000}, {0x4167c000}, {0x4167e000}, 
-    {0x41680000}, {0x41682000}, {0x41684000}, {0x41686000}, 
-    {0x41688000}, {0x4168a000}, {0x4168c000}, {0x4168e000}, 
-    {0x41690000}, {0x41692000}, {0x41694000}, {0x41696000}, 
-    {0x41698000}, {0x4169a000}, {0x4169c000}, {0x4169e000}, 
-    {0x416a0000}, {0x416a2000}, {0x416a4000}, {0x416a6000}, 
-    {0x416a8000}, {0x416aa000}, {0x416ac000}, {0x416ae000}, 
-    {0x416b0000}, {0x416b2000}, {0x416b4000}, {0x416b6000}, 
-    {0x416b8000}, {0x416ba000}, {0x416bc000}, {0x416be000}, 
-    {0x416c0000}, {0x416c2000}, {0x416c4000}, {0x416c6000}, 
-    {0x416c8000}, {0x416ca000}, {0x416cc000}, {0x416ce000}, 
-    {0x416d0000}, {0x416d2000}, {0x416d4000}, {0x416d6000}, 
-    {0x416d8000}, {0x416da000}, {0x416dc000}, {0x416de000}, 
-    {0x416e0000}, {0x416e2000}, {0x416e4000}, {0x416e6000}, 
-    {0x416e8000}, {0x416ea000}, {0x416ec000}, {0x416ee000}, 
-    {0x416f0000}, {0x416f2000}, {0x416f4000}, {0x416f6000}, 
-    {0x416f8000}, {0x416fa000}, {0x416fc000}, {0x416fe000}, 
-    {0x41700000}, {0x41702000}, {0x41704000}, {0x41706000}, 
-    {0x41708000}, {0x4170a000}, {0x4170c000}, {0x4170e000}, 
-    {0x41710000}, {0x41712000}, {0x41714000}, {0x41716000}, 
-    {0x41718000}, {0x4171a000}, {0x4171c000}, {0x4171e000}, 
-    {0x41720000}, {0x41722000}, {0x41724000}, {0x41726000}, 
-    {0x41728000}, {0x4172a000}, {0x4172c000}, {0x4172e000}, 
-    {0x41730000}, {0x41732000}, {0x41734000}, {0x41736000}, 
-    {0x41738000}, {0x4173a000}, {0x4173c000}, {0x4173e000}, 
-    {0x41740000}, {0x41742000}, {0x41744000}, {0x41746000}, 
-    {0x41748000}, {0x4174a000}, {0x4174c000}, {0x4174e000}, 
-    {0x41750000}, {0x41752000}, {0x41754000}, {0x41756000}, 
-    {0x41758000}, {0x4175a000}, {0x4175c000}, {0x4175e000}, 
-    {0x41760000}, {0x41762000}, {0x41764000}, {0x41766000}, 
-    {0x41768000}, {0x4176a000}, {0x4176c000}, {0x4176e000}, 
-    {0x41770000}, {0x41772000}, {0x41774000}, {0x41776000}, 
-    {0x41778000}, {0x4177a000}, {0x4177c000}, {0x4177e000}, 
-    {0x41780000}, {0x41782000}, {0x41784000}, {0x41786000}, 
-    {0x41788000}, {0x4178a000}, {0x4178c000}, {0x4178e000}, 
-    {0x41790000}, {0x41792000}, {0x41794000}, {0x41796000}, 
-    {0x41798000}, {0x4179a000}, {0x4179c000}, {0x4179e000}, 
-    {0x417a0000}, {0x417a2000}, {0x417a4000}, {0x417a6000}, 
-    {0x417a8000}, {0x417aa000}, {0x417ac000}, {0x417ae000}, 
-    {0x417b0000}, {0x417b2000}, {0x417b4000}, {0x417b6000}, 
-    {0x417b8000}, {0x417ba000}, {0x417bc000}, {0x417be000}, 
-    {0x417c0000}, {0x417c2000}, {0x417c4000}, {0x417c6000}, 
-    {0x417c8000}, {0x417ca000}, {0x417cc000}, {0x417ce000}, 
-    {0x417d0000}, {0x417d2000}, {0x417d4000}, {0x417d6000}, 
-    {0x417d8000}, {0x417da000}, {0x417dc000}, {0x417de000}, 
-    {0x417e0000}, {0x417e2000}, {0x417e4000}, {0x417e6000}, 
-    {0x417e8000}, {0x417ea000}, {0x417ec000}, {0x417ee000}, 
-    {0x417f0000}, {0x417f2000}, {0x417f4000}, {0x417f6000}, 
-    {0x417f8000}, {0x417fa000}, {0x417fc000}, {0x417fe000}, 
-    {0x41800000}, {0x41802000}, {0x41804000}, {0x41806000}, 
-    {0x41808000}, {0x4180a000}, {0x4180c000}, {0x4180e000}, 
-    {0x41810000}, {0x41812000}, {0x41814000}, {0x41816000}, 
-    {0x41818000}, {0x4181a000}, {0x4181c000}, {0x4181e000}, 
-    {0x41820000}, {0x41822000}, {0x41824000}, {0x41826000}, 
-    {0x41828000}, {0x4182a000}, {0x4182c000}, {0x4182e000}, 
-    {0x41830000}, {0x41832000}, {0x41834000}, {0x41836000}, 
-    {0x41838000}, {0x4183a000}, {0x4183c000}, {0x4183e000}, 
-    {0x41840000}, {0x41842000}, {0x41844000}, {0x41846000}, 
-    {0x41848000}, {0x4184a000}, {0x4184c000}, {0x4184e000}, 
-    {0x41850000}, {0x41852000}, {0x41854000}, {0x41856000}, 
-    {0x41858000}, {0x4185a000}, {0x4185c000}, {0x4185e000}, 
-    {0x41860000}, {0x41862000}, {0x41864000}, {0x41866000}, 
-    {0x41868000}, {0x4186a000}, {0x4186c000}, {0x4186e000}, 
-    {0x41870000}, {0x41872000}, {0x41874000}, {0x41876000}, 
-    {0x41878000}, {0x4187a000}, {0x4187c000}, {0x4187e000}, 
-    {0x41880000}, {0x41882000}, {0x41884000}, {0x41886000}, 
-    {0x41888000}, {0x4188a000}, {0x4188c000}, {0x4188e000}, 
-    {0x41890000}, {0x41892000}, {0x41894000}, {0x41896000}, 
-    {0x41898000}, {0x4189a000}, {0x4189c000}, {0x4189e000}, 
-    {0x418a0000}, {0x418a2000}, {0x418a4000}, {0x418a6000}, 
-    {0x418a8000}, {0x418aa000}, {0x418ac000}, {0x418ae000}, 
-    {0x418b0000}, {0x418b2000}, {0x418b4000}, {0x418b6000}, 
-    {0x418b8000}, {0x418ba000}, {0x418bc000}, {0x418be000}, 
-    {0x418c0000}, {0x418c2000}, {0x418c4000}, {0x418c6000}, 
-    {0x418c8000}, {0x418ca000}, {0x418cc000}, {0x418ce000}, 
-    {0x418d0000}, {0x418d2000}, {0x418d4000}, {0x418d6000}, 
-    {0x418d8000}, {0x418da000}, {0x418dc000}, {0x418de000}, 
-    {0x418e0000}, {0x418e2000}, {0x418e4000}, {0x418e6000}, 
-    {0x418e8000}, {0x418ea000}, {0x418ec000}, {0x418ee000}, 
-    {0x418f0000}, {0x418f2000}, {0x418f4000}, {0x418f6000}, 
-    {0x418f8000}, {0x418fa000}, {0x418fc000}, {0x418fe000}, 
-    {0x41900000}, {0x41902000}, {0x41904000}, {0x41906000}, 
-    {0x41908000}, {0x4190a000}, {0x4190c000}, {0x4190e000}, 
-    {0x41910000}, {0x41912000}, {0x41914000}, {0x41916000}, 
-    {0x41918000}, {0x4191a000}, {0x4191c000}, {0x4191e000}, 
-    {0x41920000}, {0x41922000}, {0x41924000}, {0x41926000}, 
-    {0x41928000}, {0x4192a000}, {0x4192c000}, {0x4192e000}, 
-    {0x41930000}, {0x41932000}, {0x41934000}, {0x41936000}, 
-    {0x41938000}, {0x4193a000}, {0x4193c000}, {0x4193e000}, 
-    {0x41940000}, {0x41942000}, {0x41944000}, {0x41946000}, 
-    {0x41948000}, {0x4194a000}, {0x4194c000}, {0x4194e000}, 
-    {0x41950000}, {0x41952000}, {0x41954000}, {0x41956000}, 
-    {0x41958000}, {0x4195a000}, {0x4195c000}, {0x4195e000}, 
-    {0x41960000}, {0x41962000}, {0x41964000}, {0x41966000}, 
-    {0x41968000}, {0x4196a000}, {0x4196c000}, {0x4196e000}, 
-    {0x41970000}, {0x41972000}, {0x41974000}, {0x41976000}, 
-    {0x41978000}, {0x4197a000}, {0x4197c000}, {0x4197e000}, 
-    {0x41980000}, {0x41982000}, {0x41984000}, {0x41986000}, 
-    {0x41988000}, {0x4198a000}, {0x4198c000}, {0x4198e000}, 
-    {0x41990000}, {0x41992000}, {0x41994000}, {0x41996000}, 
-    {0x41998000}, {0x4199a000}, {0x4199c000}, {0x4199e000}, 
-    {0x419a0000}, {0x419a2000}, {0x419a4000}, {0x419a6000}, 
-    {0x419a8000}, {0x419aa000}, {0x419ac000}, {0x419ae000}, 
-    {0x419b0000}, {0x419b2000}, {0x419b4000}, {0x419b6000}, 
-    {0x419b8000}, {0x419ba000}, {0x419bc000}, {0x419be000}, 
-    {0x419c0000}, {0x419c2000}, {0x419c4000}, {0x419c6000}, 
-    {0x419c8000}, {0x419ca000}, {0x419cc000}, {0x419ce000}, 
-    {0x419d0000}, {0x419d2000}, {0x419d4000}, {0x419d6000}, 
-    {0x419d8000}, {0x419da000}, {0x419dc000}, {0x419de000}, 
-    {0x419e0000}, {0x419e2000}, {0x419e4000}, {0x419e6000}, 
-    {0x419e8000}, {0x419ea000}, {0x419ec000}, {0x419ee000}, 
-    {0x419f0000}, {0x419f2000}, {0x419f4000}, {0x419f6000}, 
-    {0x419f8000}, {0x419fa000}, {0x419fc000}, {0x419fe000}, 
-    {0x41a00000}, {0x41a02000}, {0x41a04000}, {0x41a06000}, 
-    {0x41a08000}, {0x41a0a000}, {0x41a0c000}, {0x41a0e000}, 
-    {0x41a10000}, {0x41a12000}, {0x41a14000}, {0x41a16000}, 
-    {0x41a18000}, {0x41a1a000}, {0x41a1c000}, {0x41a1e000}, 
-    {0x41a20000}, {0x41a22000}, {0x41a24000}, {0x41a26000}, 
-    {0x41a28000}, {0x41a2a000}, {0x41a2c000}, {0x41a2e000}, 
-    {0x41a30000}, {0x41a32000}, {0x41a34000}, {0x41a36000}, 
-    {0x41a38000}, {0x41a3a000}, {0x41a3c000}, {0x41a3e000}, 
-    {0x41a40000}, {0x41a42000}, {0x41a44000}, {0x41a46000}, 
-    {0x41a48000}, {0x41a4a000}, {0x41a4c000}, {0x41a4e000}, 
-    {0x41a50000}, {0x41a52000}, {0x41a54000}, {0x41a56000}, 
-    {0x41a58000}, {0x41a5a000}, {0x41a5c000}, {0x41a5e000}, 
-    {0x41a60000}, {0x41a62000}, {0x41a64000}, {0x41a66000}, 
-    {0x41a68000}, {0x41a6a000}, {0x41a6c000}, {0x41a6e000}, 
-    {0x41a70000}, {0x41a72000}, {0x41a74000}, {0x41a76000}, 
-    {0x41a78000}, {0x41a7a000}, {0x41a7c000}, {0x41a7e000}, 
-    {0x41a80000}, {0x41a82000}, {0x41a84000}, {0x41a86000}, 
-    {0x41a88000}, {0x41a8a000}, {0x41a8c000}, {0x41a8e000}, 
-    {0x41a90000}, {0x41a92000}, {0x41a94000}, {0x41a96000}, 
-    {0x41a98000}, {0x41a9a000}, {0x41a9c000}, {0x41a9e000}, 
-    {0x41aa0000}, {0x41aa2000}, {0x41aa4000}, {0x41aa6000}, 
-    {0x41aa8000}, {0x41aaa000}, {0x41aac000}, {0x41aae000}, 
-    {0x41ab0000}, {0x41ab2000}, {0x41ab4000}, {0x41ab6000}, 
-    {0x41ab8000}, {0x41aba000}, {0x41abc000}, {0x41abe000}, 
-    {0x41ac0000}, {0x41ac2000}, {0x41ac4000}, {0x41ac6000}, 
-    {0x41ac8000}, {0x41aca000}, {0x41acc000}, {0x41ace000}, 
-    {0x41ad0000}, {0x41ad2000}, {0x41ad4000}, {0x41ad6000}, 
-    {0x41ad8000}, {0x41ada000}, {0x41adc000}, {0x41ade000}, 
-    {0x41ae0000}, {0x41ae2000}, {0x41ae4000}, {0x41ae6000}, 
-    {0x41ae8000}, {0x41aea000}, {0x41aec000}, {0x41aee000}, 
-    {0x41af0000}, {0x41af2000}, {0x41af4000}, {0x41af6000}, 
-    {0x41af8000}, {0x41afa000}, {0x41afc000}, {0x41afe000}, 
-    {0x41b00000}, {0x41b02000}, {0x41b04000}, {0x41b06000}, 
-    {0x41b08000}, {0x41b0a000}, {0x41b0c000}, {0x41b0e000}, 
-    {0x41b10000}, {0x41b12000}, {0x41b14000}, {0x41b16000}, 
-    {0x41b18000}, {0x41b1a000}, {0x41b1c000}, {0x41b1e000}, 
-    {0x41b20000}, {0x41b22000}, {0x41b24000}, {0x41b26000}, 
-    {0x41b28000}, {0x41b2a000}, {0x41b2c000}, {0x41b2e000}, 
-    {0x41b30000}, {0x41b32000}, {0x41b34000}, {0x41b36000}, 
-    {0x41b38000}, {0x41b3a000}, {0x41b3c000}, {0x41b3e000}, 
-    {0x41b40000}, {0x41b42000}, {0x41b44000}, {0x41b46000}, 
-    {0x41b48000}, {0x41b4a000}, {0x41b4c000}, {0x41b4e000}, 
-    {0x41b50000}, {0x41b52000}, {0x41b54000}, {0x41b56000}, 
-    {0x41b58000}, {0x41b5a000}, {0x41b5c000}, {0x41b5e000}, 
-    {0x41b60000}, {0x41b62000}, {0x41b64000}, {0x41b66000}, 
-    {0x41b68000}, {0x41b6a000}, {0x41b6c000}, {0x41b6e000}, 
-    {0x41b70000}, {0x41b72000}, {0x41b74000}, {0x41b76000}, 
-    {0x41b78000}, {0x41b7a000}, {0x41b7c000}, {0x41b7e000}, 
-    {0x41b80000}, {0x41b82000}, {0x41b84000}, {0x41b86000}, 
-    {0x41b88000}, {0x41b8a000}, {0x41b8c000}, {0x41b8e000}, 
-    {0x41b90000}, {0x41b92000}, {0x41b94000}, {0x41b96000}, 
-    {0x41b98000}, {0x41b9a000}, {0x41b9c000}, {0x41b9e000}, 
-    {0x41ba0000}, {0x41ba2000}, {0x41ba4000}, {0x41ba6000}, 
-    {0x41ba8000}, {0x41baa000}, {0x41bac000}, {0x41bae000}, 
-    {0x41bb0000}, {0x41bb2000}, {0x41bb4000}, {0x41bb6000}, 
-    {0x41bb8000}, {0x41bba000}, {0x41bbc000}, {0x41bbe000}, 
-    {0x41bc0000}, {0x41bc2000}, {0x41bc4000}, {0x41bc6000}, 
-    {0x41bc8000}, {0x41bca000}, {0x41bcc000}, {0x41bce000}, 
-    {0x41bd0000}, {0x41bd2000}, {0x41bd4000}, {0x41bd6000}, 
-    {0x41bd8000}, {0x41bda000}, {0x41bdc000}, {0x41bde000}, 
-    {0x41be0000}, {0x41be2000}, {0x41be4000}, {0x41be6000}, 
-    {0x41be8000}, {0x41bea000}, {0x41bec000}, {0x41bee000}, 
-    {0x41bf0000}, {0x41bf2000}, {0x41bf4000}, {0x41bf6000}, 
-    {0x41bf8000}, {0x41bfa000}, {0x41bfc000}, {0x41bfe000}, 
-    {0x41c00000}, {0x41c02000}, {0x41c04000}, {0x41c06000}, 
-    {0x41c08000}, {0x41c0a000}, {0x41c0c000}, {0x41c0e000}, 
-    {0x41c10000}, {0x41c12000}, {0x41c14000}, {0x41c16000}, 
-    {0x41c18000}, {0x41c1a000}, {0x41c1c000}, {0x41c1e000}, 
-    {0x41c20000}, {0x41c22000}, {0x41c24000}, {0x41c26000}, 
-    {0x41c28000}, {0x41c2a000}, {0x41c2c000}, {0x41c2e000}, 
-    {0x41c30000}, {0x41c32000}, {0x41c34000}, {0x41c36000}, 
-    {0x41c38000}, {0x41c3a000}, {0x41c3c000}, {0x41c3e000}, 
-    {0x41c40000}, {0x41c42000}, {0x41c44000}, {0x41c46000}, 
-    {0x41c48000}, {0x41c4a000}, {0x41c4c000}, {0x41c4e000}, 
-    {0x41c50000}, {0x41c52000}, {0x41c54000}, {0x41c56000}, 
-    {0x41c58000}, {0x41c5a000}, {0x41c5c000}, {0x41c5e000}, 
-    {0x41c60000}, {0x41c62000}, {0x41c64000}, {0x41c66000}, 
-    {0x41c68000}, {0x41c6a000}, {0x41c6c000}, {0x41c6e000}, 
-    {0x41c70000}, {0x41c72000}, {0x41c74000}, {0x41c76000}, 
-    {0x41c78000}, {0x41c7a000}, {0x41c7c000}, {0x41c7e000}, 
-    {0x41c80000}, {0x41c82000}, {0x41c84000}, {0x41c86000}, 
-    {0x41c88000}, {0x41c8a000}, {0x41c8c000}, {0x41c8e000}, 
-    {0x41c90000}, {0x41c92000}, {0x41c94000}, {0x41c96000}, 
-    {0x41c98000}, {0x41c9a000}, {0x41c9c000}, {0x41c9e000}, 
-    {0x41ca0000}, {0x41ca2000}, {0x41ca4000}, {0x41ca6000}, 
-    {0x41ca8000}, {0x41caa000}, {0x41cac000}, {0x41cae000}, 
-    {0x41cb0000}, {0x41cb2000}, {0x41cb4000}, {0x41cb6000}, 
-    {0x41cb8000}, {0x41cba000}, {0x41cbc000}, {0x41cbe000}, 
-    {0x41cc0000}, {0x41cc2000}, {0x41cc4000}, {0x41cc6000}, 
-    {0x41cc8000}, {0x41cca000}, {0x41ccc000}, {0x41cce000}, 
-    {0x41cd0000}, {0x41cd2000}, {0x41cd4000}, {0x41cd6000}, 
-    {0x41cd8000}, {0x41cda000}, {0x41cdc000}, {0x41cde000}, 
-    {0x41ce0000}, {0x41ce2000}, {0x41ce4000}, {0x41ce6000}, 
-    {0x41ce8000}, {0x41cea000}, {0x41cec000}, {0x41cee000}, 
-    {0x41cf0000}, {0x41cf2000}, {0x41cf4000}, {0x41cf6000}, 
-    {0x41cf8000}, {0x41cfa000}, {0x41cfc000}, {0x41cfe000}, 
-    {0x41d00000}, {0x41d02000}, {0x41d04000}, {0x41d06000}, 
-    {0x41d08000}, {0x41d0a000}, {0x41d0c000}, {0x41d0e000}, 
-    {0x41d10000}, {0x41d12000}, {0x41d14000}, {0x41d16000}, 
-    {0x41d18000}, {0x41d1a000}, {0x41d1c000}, {0x41d1e000}, 
-    {0x41d20000}, {0x41d22000}, {0x41d24000}, {0x41d26000}, 
-    {0x41d28000}, {0x41d2a000}, {0x41d2c000}, {0x41d2e000}, 
-    {0x41d30000}, {0x41d32000}, {0x41d34000}, {0x41d36000}, 
-    {0x41d38000}, {0x41d3a000}, {0x41d3c000}, {0x41d3e000}, 
-    {0x41d40000}, {0x41d42000}, {0x41d44000}, {0x41d46000}, 
-    {0x41d48000}, {0x41d4a000}, {0x41d4c000}, {0x41d4e000}, 
-    {0x41d50000}, {0x41d52000}, {0x41d54000}, {0x41d56000}, 
-    {0x41d58000}, {0x41d5a000}, {0x41d5c000}, {0x41d5e000}, 
-    {0x41d60000}, {0x41d62000}, {0x41d64000}, {0x41d66000}, 
-    {0x41d68000}, {0x41d6a000}, {0x41d6c000}, {0x41d6e000}, 
-    {0x41d70000}, {0x41d72000}, {0x41d74000}, {0x41d76000}, 
-    {0x41d78000}, {0x41d7a000}, {0x41d7c000}, {0x41d7e000}, 
-    {0x41d80000}, {0x41d82000}, {0x41d84000}, {0x41d86000}, 
-    {0x41d88000}, {0x41d8a000}, {0x41d8c000}, {0x41d8e000}, 
-    {0x41d90000}, {0x41d92000}, {0x41d94000}, {0x41d96000}, 
-    {0x41d98000}, {0x41d9a000}, {0x41d9c000}, {0x41d9e000}, 
-    {0x41da0000}, {0x41da2000}, {0x41da4000}, {0x41da6000}, 
-    {0x41da8000}, {0x41daa000}, {0x41dac000}, {0x41dae000}, 
-    {0x41db0000}, {0x41db2000}, {0x41db4000}, {0x41db6000}, 
-    {0x41db8000}, {0x41dba000}, {0x41dbc000}, {0x41dbe000}, 
-    {0x41dc0000}, {0x41dc2000}, {0x41dc4000}, {0x41dc6000}, 
-    {0x41dc8000}, {0x41dca000}, {0x41dcc000}, {0x41dce000}, 
-    {0x41dd0000}, {0x41dd2000}, {0x41dd4000}, {0x41dd6000}, 
-    {0x41dd8000}, {0x41dda000}, {0x41ddc000}, {0x41dde000}, 
-    {0x41de0000}, {0x41de2000}, {0x41de4000}, {0x41de6000}, 
-    {0x41de8000}, {0x41dea000}, {0x41dec000}, {0x41dee000}, 
-    {0x41df0000}, {0x41df2000}, {0x41df4000}, {0x41df6000}, 
-    {0x41df8000}, {0x41dfa000}, {0x41dfc000}, {0x41dfe000}, 
-    {0x41e00000}, {0x41e02000}, {0x41e04000}, {0x41e06000}, 
-    {0x41e08000}, {0x41e0a000}, {0x41e0c000}, {0x41e0e000}, 
-    {0x41e10000}, {0x41e12000}, {0x41e14000}, {0x41e16000}, 
-    {0x41e18000}, {0x41e1a000}, {0x41e1c000}, {0x41e1e000}, 
-    {0x41e20000}, {0x41e22000}, {0x41e24000}, {0x41e26000}, 
-    {0x41e28000}, {0x41e2a000}, {0x41e2c000}, {0x41e2e000}, 
-    {0x41e30000}, {0x41e32000}, {0x41e34000}, {0x41e36000}, 
-    {0x41e38000}, {0x41e3a000}, {0x41e3c000}, {0x41e3e000}, 
-    {0x41e40000}, {0x41e42000}, {0x41e44000}, {0x41e46000}, 
-    {0x41e48000}, {0x41e4a000}, {0x41e4c000}, {0x41e4e000}, 
-    {0x41e50000}, {0x41e52000}, {0x41e54000}, {0x41e56000}, 
-    {0x41e58000}, {0x41e5a000}, {0x41e5c000}, {0x41e5e000}, 
-    {0x41e60000}, {0x41e62000}, {0x41e64000}, {0x41e66000}, 
-    {0x41e68000}, {0x41e6a000}, {0x41e6c000}, {0x41e6e000}, 
-    {0x41e70000}, {0x41e72000}, {0x41e74000}, {0x41e76000}, 
-    {0x41e78000}, {0x41e7a000}, {0x41e7c000}, {0x41e7e000}, 
-    {0x41e80000}, {0x41e82000}, {0x41e84000}, {0x41e86000}, 
-    {0x41e88000}, {0x41e8a000}, {0x41e8c000}, {0x41e8e000}, 
-    {0x41e90000}, {0x41e92000}, {0x41e94000}, {0x41e96000}, 
-    {0x41e98000}, {0x41e9a000}, {0x41e9c000}, {0x41e9e000}, 
-    {0x41ea0000}, {0x41ea2000}, {0x41ea4000}, {0x41ea6000}, 
-    {0x41ea8000}, {0x41eaa000}, {0x41eac000}, {0x41eae000}, 
-    {0x41eb0000}, {0x41eb2000}, {0x41eb4000}, {0x41eb6000}, 
-    {0x41eb8000}, {0x41eba000}, {0x41ebc000}, {0x41ebe000}, 
-    {0x41ec0000}, {0x41ec2000}, {0x41ec4000}, {0x41ec6000}, 
-    {0x41ec8000}, {0x41eca000}, {0x41ecc000}, {0x41ece000}, 
-    {0x41ed0000}, {0x41ed2000}, {0x41ed4000}, {0x41ed6000}, 
-    {0x41ed8000}, {0x41eda000}, {0x41edc000}, {0x41ede000}, 
-    {0x41ee0000}, {0x41ee2000}, {0x41ee4000}, {0x41ee6000}, 
-    {0x41ee8000}, {0x41eea000}, {0x41eec000}, {0x41eee000}, 
-    {0x41ef0000}, {0x41ef2000}, {0x41ef4000}, {0x41ef6000}, 
-    {0x41ef8000}, {0x41efa000}, {0x41efc000}, {0x41efe000}, 
-    {0x41f00000}, {0x41f02000}, {0x41f04000}, {0x41f06000}, 
-    {0x41f08000}, {0x41f0a000}, {0x41f0c000}, {0x41f0e000}, 
-    {0x41f10000}, {0x41f12000}, {0x41f14000}, {0x41f16000}, 
-    {0x41f18000}, {0x41f1a000}, {0x41f1c000}, {0x41f1e000}, 
-    {0x41f20000}, {0x41f22000}, {0x41f24000}, {0x41f26000}, 
-    {0x41f28000}, {0x41f2a000}, {0x41f2c000}, {0x41f2e000}, 
-    {0x41f30000}, {0x41f32000}, {0x41f34000}, {0x41f36000}, 
-    {0x41f38000}, {0x41f3a000}, {0x41f3c000}, {0x41f3e000}, 
-    {0x41f40000}, {0x41f42000}, {0x41f44000}, {0x41f46000}, 
-    {0x41f48000}, {0x41f4a000}, {0x41f4c000}, {0x41f4e000}, 
-    {0x41f50000}, {0x41f52000}, {0x41f54000}, {0x41f56000}, 
-    {0x41f58000}, {0x41f5a000}, {0x41f5c000}, {0x41f5e000}, 
-    {0x41f60000}, {0x41f62000}, {0x41f64000}, {0x41f66000}, 
-    {0x41f68000}, {0x41f6a000}, {0x41f6c000}, {0x41f6e000}, 
-    {0x41f70000}, {0x41f72000}, {0x41f74000}, {0x41f76000}, 
-    {0x41f78000}, {0x41f7a000}, {0x41f7c000}, {0x41f7e000}, 
-    {0x41f80000}, {0x41f82000}, {0x41f84000}, {0x41f86000}, 
-    {0x41f88000}, {0x41f8a000}, {0x41f8c000}, {0x41f8e000}, 
-    {0x41f90000}, {0x41f92000}, {0x41f94000}, {0x41f96000}, 
-    {0x41f98000}, {0x41f9a000}, {0x41f9c000}, {0x41f9e000}, 
-    {0x41fa0000}, {0x41fa2000}, {0x41fa4000}, {0x41fa6000}, 
-    {0x41fa8000}, {0x41faa000}, {0x41fac000}, {0x41fae000}, 
-    {0x41fb0000}, {0x41fb2000}, {0x41fb4000}, {0x41fb6000}, 
-    {0x41fb8000}, {0x41fba000}, {0x41fbc000}, {0x41fbe000}, 
-    {0x41fc0000}, {0x41fc2000}, {0x41fc4000}, {0x41fc6000}, 
-    {0x41fc8000}, {0x41fca000}, {0x41fcc000}, {0x41fce000}, 
-    {0x41fd0000}, {0x41fd2000}, {0x41fd4000}, {0x41fd6000}, 
-    {0x41fd8000}, {0x41fda000}, {0x41fdc000}, {0x41fde000}, 
-    {0x41fe0000}, {0x41fe2000}, {0x41fe4000}, {0x41fe6000}, 
-    {0x41fe8000}, {0x41fea000}, {0x41fec000}, {0x41fee000}, 
-    {0x41ff0000}, {0x41ff2000}, {0x41ff4000}, {0x41ff6000}, 
-    {0x41ff8000}, {0x41ffa000}, {0x41ffc000}, {0x41ffe000}, 
-    {0x42000000}, {0x42002000}, {0x42004000}, {0x42006000}, 
-    {0x42008000}, {0x4200a000}, {0x4200c000}, {0x4200e000}, 
-    {0x42010000}, {0x42012000}, {0x42014000}, {0x42016000}, 
-    {0x42018000}, {0x4201a000}, {0x4201c000}, {0x4201e000}, 
-    {0x42020000}, {0x42022000}, {0x42024000}, {0x42026000}, 
-    {0x42028000}, {0x4202a000}, {0x4202c000}, {0x4202e000}, 
-    {0x42030000}, {0x42032000}, {0x42034000}, {0x42036000}, 
-    {0x42038000}, {0x4203a000}, {0x4203c000}, {0x4203e000}, 
-    {0x42040000}, {0x42042000}, {0x42044000}, {0x42046000}, 
-    {0x42048000}, {0x4204a000}, {0x4204c000}, {0x4204e000}, 
-    {0x42050000}, {0x42052000}, {0x42054000}, {0x42056000}, 
-    {0x42058000}, {0x4205a000}, {0x4205c000}, {0x4205e000}, 
-    {0x42060000}, {0x42062000}, {0x42064000}, {0x42066000}, 
-    {0x42068000}, {0x4206a000}, {0x4206c000}, {0x4206e000}, 
-    {0x42070000}, {0x42072000}, {0x42074000}, {0x42076000}, 
-    {0x42078000}, {0x4207a000}, {0x4207c000}, {0x4207e000}, 
-    {0x42080000}, {0x42082000}, {0x42084000}, {0x42086000}, 
-    {0x42088000}, {0x4208a000}, {0x4208c000}, {0x4208e000}, 
-    {0x42090000}, {0x42092000}, {0x42094000}, {0x42096000}, 
-    {0x42098000}, {0x4209a000}, {0x4209c000}, {0x4209e000}, 
-    {0x420a0000}, {0x420a2000}, {0x420a4000}, {0x420a6000}, 
-    {0x420a8000}, {0x420aa000}, {0x420ac000}, {0x420ae000}, 
-    {0x420b0000}, {0x420b2000}, {0x420b4000}, {0x420b6000}, 
-    {0x420b8000}, {0x420ba000}, {0x420bc000}, {0x420be000}, 
-    {0x420c0000}, {0x420c2000}, {0x420c4000}, {0x420c6000}, 
-    {0x420c8000}, {0x420ca000}, {0x420cc000}, {0x420ce000}, 
-    {0x420d0000}, {0x420d2000}, {0x420d4000}, {0x420d6000}, 
-    {0x420d8000}, {0x420da000}, {0x420dc000}, {0x420de000}, 
-    {0x420e0000}, {0x420e2000}, {0x420e4000}, {0x420e6000}, 
-    {0x420e8000}, {0x420ea000}, {0x420ec000}, {0x420ee000}, 
-    {0x420f0000}, {0x420f2000}, {0x420f4000}, {0x420f6000}, 
-    {0x420f8000}, {0x420fa000}, {0x420fc000}, {0x420fe000}, 
-    {0x42100000}, {0x42102000}, {0x42104000}, {0x42106000}, 
-    {0x42108000}, {0x4210a000}, {0x4210c000}, {0x4210e000}, 
-    {0x42110000}, {0x42112000}, {0x42114000}, {0x42116000}, 
-    {0x42118000}, {0x4211a000}, {0x4211c000}, {0x4211e000}, 
-    {0x42120000}, {0x42122000}, {0x42124000}, {0x42126000}, 
-    {0x42128000}, {0x4212a000}, {0x4212c000}, {0x4212e000}, 
-    {0x42130000}, {0x42132000}, {0x42134000}, {0x42136000}, 
-    {0x42138000}, {0x4213a000}, {0x4213c000}, {0x4213e000}, 
-    {0x42140000}, {0x42142000}, {0x42144000}, {0x42146000}, 
-    {0x42148000}, {0x4214a000}, {0x4214c000}, {0x4214e000}, 
-    {0x42150000}, {0x42152000}, {0x42154000}, {0x42156000}, 
-    {0x42158000}, {0x4215a000}, {0x4215c000}, {0x4215e000}, 
-    {0x42160000}, {0x42162000}, {0x42164000}, {0x42166000}, 
-    {0x42168000}, {0x4216a000}, {0x4216c000}, {0x4216e000}, 
-    {0x42170000}, {0x42172000}, {0x42174000}, {0x42176000}, 
-    {0x42178000}, {0x4217a000}, {0x4217c000}, {0x4217e000}, 
-    {0x42180000}, {0x42182000}, {0x42184000}, {0x42186000}, 
-    {0x42188000}, {0x4218a000}, {0x4218c000}, {0x4218e000}, 
-    {0x42190000}, {0x42192000}, {0x42194000}, {0x42196000}, 
-    {0x42198000}, {0x4219a000}, {0x4219c000}, {0x4219e000}, 
-    {0x421a0000}, {0x421a2000}, {0x421a4000}, {0x421a6000}, 
-    {0x421a8000}, {0x421aa000}, {0x421ac000}, {0x421ae000}, 
-    {0x421b0000}, {0x421b2000}, {0x421b4000}, {0x421b6000}, 
-    {0x421b8000}, {0x421ba000}, {0x421bc000}, {0x421be000}, 
-    {0x421c0000}, {0x421c2000}, {0x421c4000}, {0x421c6000}, 
-    {0x421c8000}, {0x421ca000}, {0x421cc000}, {0x421ce000}, 
-    {0x421d0000}, {0x421d2000}, {0x421d4000}, {0x421d6000}, 
-    {0x421d8000}, {0x421da000}, {0x421dc000}, {0x421de000}, 
-    {0x421e0000}, {0x421e2000}, {0x421e4000}, {0x421e6000}, 
-    {0x421e8000}, {0x421ea000}, {0x421ec000}, {0x421ee000}, 
-    {0x421f0000}, {0x421f2000}, {0x421f4000}, {0x421f6000}, 
-    {0x421f8000}, {0x421fa000}, {0x421fc000}, {0x421fe000}, 
-    {0x42200000}, {0x42202000}, {0x42204000}, {0x42206000}, 
-    {0x42208000}, {0x4220a000}, {0x4220c000}, {0x4220e000}, 
-    {0x42210000}, {0x42212000}, {0x42214000}, {0x42216000}, 
-    {0x42218000}, {0x4221a000}, {0x4221c000}, {0x4221e000}, 
-    {0x42220000}, {0x42222000}, {0x42224000}, {0x42226000}, 
-    {0x42228000}, {0x4222a000}, {0x4222c000}, {0x4222e000}, 
-    {0x42230000}, {0x42232000}, {0x42234000}, {0x42236000}, 
-    {0x42238000}, {0x4223a000}, {0x4223c000}, {0x4223e000}, 
-    {0x42240000}, {0x42242000}, {0x42244000}, {0x42246000}, 
-    {0x42248000}, {0x4224a000}, {0x4224c000}, {0x4224e000}, 
-    {0x42250000}, {0x42252000}, {0x42254000}, {0x42256000}, 
-    {0x42258000}, {0x4225a000}, {0x4225c000}, {0x4225e000}, 
-    {0x42260000}, {0x42262000}, {0x42264000}, {0x42266000}, 
-    {0x42268000}, {0x4226a000}, {0x4226c000}, {0x4226e000}, 
-    {0x42270000}, {0x42272000}, {0x42274000}, {0x42276000}, 
-    {0x42278000}, {0x4227a000}, {0x4227c000}, {0x4227e000}, 
-    {0x42280000}, {0x42282000}, {0x42284000}, {0x42286000}, 
-    {0x42288000}, {0x4228a000}, {0x4228c000}, {0x4228e000}, 
-    {0x42290000}, {0x42292000}, {0x42294000}, {0x42296000}, 
-    {0x42298000}, {0x4229a000}, {0x4229c000}, {0x4229e000}, 
-    {0x422a0000}, {0x422a2000}, {0x422a4000}, {0x422a6000}, 
-    {0x422a8000}, {0x422aa000}, {0x422ac000}, {0x422ae000}, 
-    {0x422b0000}, {0x422b2000}, {0x422b4000}, {0x422b6000}, 
-    {0x422b8000}, {0x422ba000}, {0x422bc000}, {0x422be000}, 
-    {0x422c0000}, {0x422c2000}, {0x422c4000}, {0x422c6000}, 
-    {0x422c8000}, {0x422ca000}, {0x422cc000}, {0x422ce000}, 
-    {0x422d0000}, {0x422d2000}, {0x422d4000}, {0x422d6000}, 
-    {0x422d8000}, {0x422da000}, {0x422dc000}, {0x422de000}, 
-    {0x422e0000}, {0x422e2000}, {0x422e4000}, {0x422e6000}, 
-    {0x422e8000}, {0x422ea000}, {0x422ec000}, {0x422ee000}, 
-    {0x422f0000}, {0x422f2000}, {0x422f4000}, {0x422f6000}, 
-    {0x422f8000}, {0x422fa000}, {0x422fc000}, {0x422fe000}, 
-    {0x42300000}, {0x42302000}, {0x42304000}, {0x42306000}, 
-    {0x42308000}, {0x4230a000}, {0x4230c000}, {0x4230e000}, 
-    {0x42310000}, {0x42312000}, {0x42314000}, {0x42316000}, 
-    {0x42318000}, {0x4231a000}, {0x4231c000}, {0x4231e000}, 
-    {0x42320000}, {0x42322000}, {0x42324000}, {0x42326000}, 
-    {0x42328000}, {0x4232a000}, {0x4232c000}, {0x4232e000}, 
-    {0x42330000}, {0x42332000}, {0x42334000}, {0x42336000}, 
-    {0x42338000}, {0x4233a000}, {0x4233c000}, {0x4233e000}, 
-    {0x42340000}, {0x42342000}, {0x42344000}, {0x42346000}, 
-    {0x42348000}, {0x4234a000}, {0x4234c000}, {0x4234e000}, 
-    {0x42350000}, {0x42352000}, {0x42354000}, {0x42356000}, 
-    {0x42358000}, {0x4235a000}, {0x4235c000}, {0x4235e000}, 
-    {0x42360000}, {0x42362000}, {0x42364000}, {0x42366000}, 
-    {0x42368000}, {0x4236a000}, {0x4236c000}, {0x4236e000}, 
-    {0x42370000}, {0x42372000}, {0x42374000}, {0x42376000}, 
-    {0x42378000}, {0x4237a000}, {0x4237c000}, {0x4237e000}, 
-    {0x42380000}, {0x42382000}, {0x42384000}, {0x42386000}, 
-    {0x42388000}, {0x4238a000}, {0x4238c000}, {0x4238e000}, 
-    {0x42390000}, {0x42392000}, {0x42394000}, {0x42396000}, 
-    {0x42398000}, {0x4239a000}, {0x4239c000}, {0x4239e000}, 
-    {0x423a0000}, {0x423a2000}, {0x423a4000}, {0x423a6000}, 
-    {0x423a8000}, {0x423aa000}, {0x423ac000}, {0x423ae000}, 
-    {0x423b0000}, {0x423b2000}, {0x423b4000}, {0x423b6000}, 
-    {0x423b8000}, {0x423ba000}, {0x423bc000}, {0x423be000}, 
-    {0x423c0000}, {0x423c2000}, {0x423c4000}, {0x423c6000}, 
-    {0x423c8000}, {0x423ca000}, {0x423cc000}, {0x423ce000}, 
-    {0x423d0000}, {0x423d2000}, {0x423d4000}, {0x423d6000}, 
-    {0x423d8000}, {0x423da000}, {0x423dc000}, {0x423de000}, 
-    {0x423e0000}, {0x423e2000}, {0x423e4000}, {0x423e6000}, 
-    {0x423e8000}, {0x423ea000}, {0x423ec000}, {0x423ee000}, 
-    {0x423f0000}, {0x423f2000}, {0x423f4000}, {0x423f6000}, 
-    {0x423f8000}, {0x423fa000}, {0x423fc000}, {0x423fe000}, 
-    {0x42400000}, {0x42402000}, {0x42404000}, {0x42406000}, 
-    {0x42408000}, {0x4240a000}, {0x4240c000}, {0x4240e000}, 
-    {0x42410000}, {0x42412000}, {0x42414000}, {0x42416000}, 
-    {0x42418000}, {0x4241a000}, {0x4241c000}, {0x4241e000}, 
-    {0x42420000}, {0x42422000}, {0x42424000}, {0x42426000}, 
-    {0x42428000}, {0x4242a000}, {0x4242c000}, {0x4242e000}, 
-    {0x42430000}, {0x42432000}, {0x42434000}, {0x42436000}, 
-    {0x42438000}, {0x4243a000}, {0x4243c000}, {0x4243e000}, 
-    {0x42440000}, {0x42442000}, {0x42444000}, {0x42446000}, 
-    {0x42448000}, {0x4244a000}, {0x4244c000}, {0x4244e000}, 
-    {0x42450000}, {0x42452000}, {0x42454000}, {0x42456000}, 
-    {0x42458000}, {0x4245a000}, {0x4245c000}, {0x4245e000}, 
-    {0x42460000}, {0x42462000}, {0x42464000}, {0x42466000}, 
-    {0x42468000}, {0x4246a000}, {0x4246c000}, {0x4246e000}, 
-    {0x42470000}, {0x42472000}, {0x42474000}, {0x42476000}, 
-    {0x42478000}, {0x4247a000}, {0x4247c000}, {0x4247e000}, 
-    {0x42480000}, {0x42482000}, {0x42484000}, {0x42486000}, 
-    {0x42488000}, {0x4248a000}, {0x4248c000}, {0x4248e000}, 
-    {0x42490000}, {0x42492000}, {0x42494000}, {0x42496000}, 
-    {0x42498000}, {0x4249a000}, {0x4249c000}, {0x4249e000}, 
-    {0x424a0000}, {0x424a2000}, {0x424a4000}, {0x424a6000}, 
-    {0x424a8000}, {0x424aa000}, {0x424ac000}, {0x424ae000}, 
-    {0x424b0000}, {0x424b2000}, {0x424b4000}, {0x424b6000}, 
-    {0x424b8000}, {0x424ba000}, {0x424bc000}, {0x424be000}, 
-    {0x424c0000}, {0x424c2000}, {0x424c4000}, {0x424c6000}, 
-    {0x424c8000}, {0x424ca000}, {0x424cc000}, {0x424ce000}, 
-    {0x424d0000}, {0x424d2000}, {0x424d4000}, {0x424d6000}, 
-    {0x424d8000}, {0x424da000}, {0x424dc000}, {0x424de000}, 
-    {0x424e0000}, {0x424e2000}, {0x424e4000}, {0x424e6000}, 
-    {0x424e8000}, {0x424ea000}, {0x424ec000}, {0x424ee000}, 
-    {0x424f0000}, {0x424f2000}, {0x424f4000}, {0x424f6000}, 
-    {0x424f8000}, {0x424fa000}, {0x424fc000}, {0x424fe000}, 
-    {0x42500000}, {0x42502000}, {0x42504000}, {0x42506000}, 
-    {0x42508000}, {0x4250a000}, {0x4250c000}, {0x4250e000}, 
-    {0x42510000}, {0x42512000}, {0x42514000}, {0x42516000}, 
-    {0x42518000}, {0x4251a000}, {0x4251c000}, {0x4251e000}, 
-    {0x42520000}, {0x42522000}, {0x42524000}, {0x42526000}, 
-    {0x42528000}, {0x4252a000}, {0x4252c000}, {0x4252e000}, 
-    {0x42530000}, {0x42532000}, {0x42534000}, {0x42536000}, 
-    {0x42538000}, {0x4253a000}, {0x4253c000}, {0x4253e000}, 
-    {0x42540000}, {0x42542000}, {0x42544000}, {0x42546000}, 
-    {0x42548000}, {0x4254a000}, {0x4254c000}, {0x4254e000}, 
-    {0x42550000}, {0x42552000}, {0x42554000}, {0x42556000}, 
-    {0x42558000}, {0x4255a000}, {0x4255c000}, {0x4255e000}, 
-    {0x42560000}, {0x42562000}, {0x42564000}, {0x42566000}, 
-    {0x42568000}, {0x4256a000}, {0x4256c000}, {0x4256e000}, 
-    {0x42570000}, {0x42572000}, {0x42574000}, {0x42576000}, 
-    {0x42578000}, {0x4257a000}, {0x4257c000}, {0x4257e000}, 
-    {0x42580000}, {0x42582000}, {0x42584000}, {0x42586000}, 
-    {0x42588000}, {0x4258a000}, {0x4258c000}, {0x4258e000}, 
-    {0x42590000}, {0x42592000}, {0x42594000}, {0x42596000}, 
-    {0x42598000}, {0x4259a000}, {0x4259c000}, {0x4259e000}, 
-    {0x425a0000}, {0x425a2000}, {0x425a4000}, {0x425a6000}, 
-    {0x425a8000}, {0x425aa000}, {0x425ac000}, {0x425ae000}, 
-    {0x425b0000}, {0x425b2000}, {0x425b4000}, {0x425b6000}, 
-    {0x425b8000}, {0x425ba000}, {0x425bc000}, {0x425be000}, 
-    {0x425c0000}, {0x425c2000}, {0x425c4000}, {0x425c6000}, 
-    {0x425c8000}, {0x425ca000}, {0x425cc000}, {0x425ce000}, 
-    {0x425d0000}, {0x425d2000}, {0x425d4000}, {0x425d6000}, 
-    {0x425d8000}, {0x425da000}, {0x425dc000}, {0x425de000}, 
-    {0x425e0000}, {0x425e2000}, {0x425e4000}, {0x425e6000}, 
-    {0x425e8000}, {0x425ea000}, {0x425ec000}, {0x425ee000}, 
-    {0x425f0000}, {0x425f2000}, {0x425f4000}, {0x425f6000}, 
-    {0x425f8000}, {0x425fa000}, {0x425fc000}, {0x425fe000}, 
-    {0x42600000}, {0x42602000}, {0x42604000}, {0x42606000}, 
-    {0x42608000}, {0x4260a000}, {0x4260c000}, {0x4260e000}, 
-    {0x42610000}, {0x42612000}, {0x42614000}, {0x42616000}, 
-    {0x42618000}, {0x4261a000}, {0x4261c000}, {0x4261e000}, 
-    {0x42620000}, {0x42622000}, {0x42624000}, {0x42626000}, 
-    {0x42628000}, {0x4262a000}, {0x4262c000}, {0x4262e000}, 
-    {0x42630000}, {0x42632000}, {0x42634000}, {0x42636000}, 
-    {0x42638000}, {0x4263a000}, {0x4263c000}, {0x4263e000}, 
-    {0x42640000}, {0x42642000}, {0x42644000}, {0x42646000}, 
-    {0x42648000}, {0x4264a000}, {0x4264c000}, {0x4264e000}, 
-    {0x42650000}, {0x42652000}, {0x42654000}, {0x42656000}, 
-    {0x42658000}, {0x4265a000}, {0x4265c000}, {0x4265e000}, 
-    {0x42660000}, {0x42662000}, {0x42664000}, {0x42666000}, 
-    {0x42668000}, {0x4266a000}, {0x4266c000}, {0x4266e000}, 
-    {0x42670000}, {0x42672000}, {0x42674000}, {0x42676000}, 
-    {0x42678000}, {0x4267a000}, {0x4267c000}, {0x4267e000}, 
-    {0x42680000}, {0x42682000}, {0x42684000}, {0x42686000}, 
-    {0x42688000}, {0x4268a000}, {0x4268c000}, {0x4268e000}, 
-    {0x42690000}, {0x42692000}, {0x42694000}, {0x42696000}, 
-    {0x42698000}, {0x4269a000}, {0x4269c000}, {0x4269e000}, 
-    {0x426a0000}, {0x426a2000}, {0x426a4000}, {0x426a6000}, 
-    {0x426a8000}, {0x426aa000}, {0x426ac000}, {0x426ae000}, 
-    {0x426b0000}, {0x426b2000}, {0x426b4000}, {0x426b6000}, 
-    {0x426b8000}, {0x426ba000}, {0x426bc000}, {0x426be000}, 
-    {0x426c0000}, {0x426c2000}, {0x426c4000}, {0x426c6000}, 
-    {0x426c8000}, {0x426ca000}, {0x426cc000}, {0x426ce000}, 
-    {0x426d0000}, {0x426d2000}, {0x426d4000}, {0x426d6000}, 
-    {0x426d8000}, {0x426da000}, {0x426dc000}, {0x426de000}, 
-    {0x426e0000}, {0x426e2000}, {0x426e4000}, {0x426e6000}, 
-    {0x426e8000}, {0x426ea000}, {0x426ec000}, {0x426ee000}, 
-    {0x426f0000}, {0x426f2000}, {0x426f4000}, {0x426f6000}, 
-    {0x426f8000}, {0x426fa000}, {0x426fc000}, {0x426fe000}, 
-    {0x42700000}, {0x42702000}, {0x42704000}, {0x42706000}, 
-    {0x42708000}, {0x4270a000}, {0x4270c000}, {0x4270e000}, 
-    {0x42710000}, {0x42712000}, {0x42714000}, {0x42716000}, 
-    {0x42718000}, {0x4271a000}, {0x4271c000}, {0x4271e000}, 
-    {0x42720000}, {0x42722000}, {0x42724000}, {0x42726000}, 
-    {0x42728000}, {0x4272a000}, {0x4272c000}, {0x4272e000}, 
-    {0x42730000}, {0x42732000}, {0x42734000}, {0x42736000}, 
-    {0x42738000}, {0x4273a000}, {0x4273c000}, {0x4273e000}, 
-    {0x42740000}, {0x42742000}, {0x42744000}, {0x42746000}, 
-    {0x42748000}, {0x4274a000}, {0x4274c000}, {0x4274e000}, 
-    {0x42750000}, {0x42752000}, {0x42754000}, {0x42756000}, 
-    {0x42758000}, {0x4275a000}, {0x4275c000}, {0x4275e000}, 
-    {0x42760000}, {0x42762000}, {0x42764000}, {0x42766000}, 
-    {0x42768000}, {0x4276a000}, {0x4276c000}, {0x4276e000}, 
-    {0x42770000}, {0x42772000}, {0x42774000}, {0x42776000}, 
-    {0x42778000}, {0x4277a000}, {0x4277c000}, {0x4277e000}, 
-    {0x42780000}, {0x42782000}, {0x42784000}, {0x42786000}, 
-    {0x42788000}, {0x4278a000}, {0x4278c000}, {0x4278e000}, 
-    {0x42790000}, {0x42792000}, {0x42794000}, {0x42796000}, 
-    {0x42798000}, {0x4279a000}, {0x4279c000}, {0x4279e000}, 
-    {0x427a0000}, {0x427a2000}, {0x427a4000}, {0x427a6000}, 
-    {0x427a8000}, {0x427aa000}, {0x427ac000}, {0x427ae000}, 
-    {0x427b0000}, {0x427b2000}, {0x427b4000}, {0x427b6000}, 
-    {0x427b8000}, {0x427ba000}, {0x427bc000}, {0x427be000}, 
-    {0x427c0000}, {0x427c2000}, {0x427c4000}, {0x427c6000}, 
-    {0x427c8000}, {0x427ca000}, {0x427cc000}, {0x427ce000}, 
-    {0x427d0000}, {0x427d2000}, {0x427d4000}, {0x427d6000}, 
-    {0x427d8000}, {0x427da000}, {0x427dc000}, {0x427de000}, 
-    {0x427e0000}, {0x427e2000}, {0x427e4000}, {0x427e6000}, 
-    {0x427e8000}, {0x427ea000}, {0x427ec000}, {0x427ee000}, 
-    {0x427f0000}, {0x427f2000}, {0x427f4000}, {0x427f6000}, 
-    {0x427f8000}, {0x427fa000}, {0x427fc000}, {0x427fe000}, 
-    {0x42800000}, {0x42802000}, {0x42804000}, {0x42806000}, 
-    {0x42808000}, {0x4280a000}, {0x4280c000}, {0x4280e000}, 
-    {0x42810000}, {0x42812000}, {0x42814000}, {0x42816000}, 
-    {0x42818000}, {0x4281a000}, {0x4281c000}, {0x4281e000}, 
-    {0x42820000}, {0x42822000}, {0x42824000}, {0x42826000}, 
-    {0x42828000}, {0x4282a000}, {0x4282c000}, {0x4282e000}, 
-    {0x42830000}, {0x42832000}, {0x42834000}, {0x42836000}, 
-    {0x42838000}, {0x4283a000}, {0x4283c000}, {0x4283e000}, 
-    {0x42840000}, {0x42842000}, {0x42844000}, {0x42846000}, 
-    {0x42848000}, {0x4284a000}, {0x4284c000}, {0x4284e000}, 
-    {0x42850000}, {0x42852000}, {0x42854000}, {0x42856000}, 
-    {0x42858000}, {0x4285a000}, {0x4285c000}, {0x4285e000}, 
-    {0x42860000}, {0x42862000}, {0x42864000}, {0x42866000}, 
-    {0x42868000}, {0x4286a000}, {0x4286c000}, {0x4286e000}, 
-    {0x42870000}, {0x42872000}, {0x42874000}, {0x42876000}, 
-    {0x42878000}, {0x4287a000}, {0x4287c000}, {0x4287e000}, 
-    {0x42880000}, {0x42882000}, {0x42884000}, {0x42886000}, 
-    {0x42888000}, {0x4288a000}, {0x4288c000}, {0x4288e000}, 
-    {0x42890000}, {0x42892000}, {0x42894000}, {0x42896000}, 
-    {0x42898000}, {0x4289a000}, {0x4289c000}, {0x4289e000}, 
-    {0x428a0000}, {0x428a2000}, {0x428a4000}, {0x428a6000}, 
-    {0x428a8000}, {0x428aa000}, {0x428ac000}, {0x428ae000}, 
-    {0x428b0000}, {0x428b2000}, {0x428b4000}, {0x428b6000}, 
-    {0x428b8000}, {0x428ba000}, {0x428bc000}, {0x428be000}, 
-    {0x428c0000}, {0x428c2000}, {0x428c4000}, {0x428c6000}, 
-    {0x428c8000}, {0x428ca000}, {0x428cc000}, {0x428ce000}, 
-    {0x428d0000}, {0x428d2000}, {0x428d4000}, {0x428d6000}, 
-    {0x428d8000}, {0x428da000}, {0x428dc000}, {0x428de000}, 
-    {0x428e0000}, {0x428e2000}, {0x428e4000}, {0x428e6000}, 
-    {0x428e8000}, {0x428ea000}, {0x428ec000}, {0x428ee000}, 
-    {0x428f0000}, {0x428f2000}, {0x428f4000}, {0x428f6000}, 
-    {0x428f8000}, {0x428fa000}, {0x428fc000}, {0x428fe000}, 
-    {0x42900000}, {0x42902000}, {0x42904000}, {0x42906000}, 
-    {0x42908000}, {0x4290a000}, {0x4290c000}, {0x4290e000}, 
-    {0x42910000}, {0x42912000}, {0x42914000}, {0x42916000}, 
-    {0x42918000}, {0x4291a000}, {0x4291c000}, {0x4291e000}, 
-    {0x42920000}, {0x42922000}, {0x42924000}, {0x42926000}, 
-    {0x42928000}, {0x4292a000}, {0x4292c000}, {0x4292e000}, 
-    {0x42930000}, {0x42932000}, {0x42934000}, {0x42936000}, 
-    {0x42938000}, {0x4293a000}, {0x4293c000}, {0x4293e000}, 
-    {0x42940000}, {0x42942000}, {0x42944000}, {0x42946000}, 
-    {0x42948000}, {0x4294a000}, {0x4294c000}, {0x4294e000}, 
-    {0x42950000}, {0x42952000}, {0x42954000}, {0x42956000}, 
-    {0x42958000}, {0x4295a000}, {0x4295c000}, {0x4295e000}, 
-    {0x42960000}, {0x42962000}, {0x42964000}, {0x42966000}, 
-    {0x42968000}, {0x4296a000}, {0x4296c000}, {0x4296e000}, 
-    {0x42970000}, {0x42972000}, {0x42974000}, {0x42976000}, 
-    {0x42978000}, {0x4297a000}, {0x4297c000}, {0x4297e000}, 
-    {0x42980000}, {0x42982000}, {0x42984000}, {0x42986000}, 
-    {0x42988000}, {0x4298a000}, {0x4298c000}, {0x4298e000}, 
-    {0x42990000}, {0x42992000}, {0x42994000}, {0x42996000}, 
-    {0x42998000}, {0x4299a000}, {0x4299c000}, {0x4299e000}, 
-    {0x429a0000}, {0x429a2000}, {0x429a4000}, {0x429a6000}, 
-    {0x429a8000}, {0x429aa000}, {0x429ac000}, {0x429ae000}, 
-    {0x429b0000}, {0x429b2000}, {0x429b4000}, {0x429b6000}, 
-    {0x429b8000}, {0x429ba000}, {0x429bc000}, {0x429be000}, 
-    {0x429c0000}, {0x429c2000}, {0x429c4000}, {0x429c6000}, 
-    {0x429c8000}, {0x429ca000}, {0x429cc000}, {0x429ce000}, 
-    {0x429d0000}, {0x429d2000}, {0x429d4000}, {0x429d6000}, 
-    {0x429d8000}, {0x429da000}, {0x429dc000}, {0x429de000}, 
-    {0x429e0000}, {0x429e2000}, {0x429e4000}, {0x429e6000}, 
-    {0x429e8000}, {0x429ea000}, {0x429ec000}, {0x429ee000}, 
-    {0x429f0000}, {0x429f2000}, {0x429f4000}, {0x429f6000}, 
-    {0x429f8000}, {0x429fa000}, {0x429fc000}, {0x429fe000}, 
-    {0x42a00000}, {0x42a02000}, {0x42a04000}, {0x42a06000}, 
-    {0x42a08000}, {0x42a0a000}, {0x42a0c000}, {0x42a0e000}, 
-    {0x42a10000}, {0x42a12000}, {0x42a14000}, {0x42a16000}, 
-    {0x42a18000}, {0x42a1a000}, {0x42a1c000}, {0x42a1e000}, 
-    {0x42a20000}, {0x42a22000}, {0x42a24000}, {0x42a26000}, 
-    {0x42a28000}, {0x42a2a000}, {0x42a2c000}, {0x42a2e000}, 
-    {0x42a30000}, {0x42a32000}, {0x42a34000}, {0x42a36000}, 
-    {0x42a38000}, {0x42a3a000}, {0x42a3c000}, {0x42a3e000}, 
-    {0x42a40000}, {0x42a42000}, {0x42a44000}, {0x42a46000}, 
-    {0x42a48000}, {0x42a4a000}, {0x42a4c000}, {0x42a4e000}, 
-    {0x42a50000}, {0x42a52000}, {0x42a54000}, {0x42a56000}, 
-    {0x42a58000}, {0x42a5a000}, {0x42a5c000}, {0x42a5e000}, 
-    {0x42a60000}, {0x42a62000}, {0x42a64000}, {0x42a66000}, 
-    {0x42a68000}, {0x42a6a000}, {0x42a6c000}, {0x42a6e000}, 
-    {0x42a70000}, {0x42a72000}, {0x42a74000}, {0x42a76000}, 
-    {0x42a78000}, {0x42a7a000}, {0x42a7c000}, {0x42a7e000}, 
-    {0x42a80000}, {0x42a82000}, {0x42a84000}, {0x42a86000}, 
-    {0x42a88000}, {0x42a8a000}, {0x42a8c000}, {0x42a8e000}, 
-    {0x42a90000}, {0x42a92000}, {0x42a94000}, {0x42a96000}, 
-    {0x42a98000}, {0x42a9a000}, {0x42a9c000}, {0x42a9e000}, 
-    {0x42aa0000}, {0x42aa2000}, {0x42aa4000}, {0x42aa6000}, 
-    {0x42aa8000}, {0x42aaa000}, {0x42aac000}, {0x42aae000}, 
-    {0x42ab0000}, {0x42ab2000}, {0x42ab4000}, {0x42ab6000}, 
-    {0x42ab8000}, {0x42aba000}, {0x42abc000}, {0x42abe000}, 
-    {0x42ac0000}, {0x42ac2000}, {0x42ac4000}, {0x42ac6000}, 
-    {0x42ac8000}, {0x42aca000}, {0x42acc000}, {0x42ace000}, 
-    {0x42ad0000}, {0x42ad2000}, {0x42ad4000}, {0x42ad6000}, 
-    {0x42ad8000}, {0x42ada000}, {0x42adc000}, {0x42ade000}, 
-    {0x42ae0000}, {0x42ae2000}, {0x42ae4000}, {0x42ae6000}, 
-    {0x42ae8000}, {0x42aea000}, {0x42aec000}, {0x42aee000}, 
-    {0x42af0000}, {0x42af2000}, {0x42af4000}, {0x42af6000}, 
-    {0x42af8000}, {0x42afa000}, {0x42afc000}, {0x42afe000}, 
-    {0x42b00000}, {0x42b02000}, {0x42b04000}, {0x42b06000}, 
-    {0x42b08000}, {0x42b0a000}, {0x42b0c000}, {0x42b0e000}, 
-    {0x42b10000}, {0x42b12000}, {0x42b14000}, {0x42b16000}, 
-    {0x42b18000}, {0x42b1a000}, {0x42b1c000}, {0x42b1e000}, 
-    {0x42b20000}, {0x42b22000}, {0x42b24000}, {0x42b26000}, 
-    {0x42b28000}, {0x42b2a000}, {0x42b2c000}, {0x42b2e000}, 
-    {0x42b30000}, {0x42b32000}, {0x42b34000}, {0x42b36000}, 
-    {0x42b38000}, {0x42b3a000}, {0x42b3c000}, {0x42b3e000}, 
-    {0x42b40000}, {0x42b42000}, {0x42b44000}, {0x42b46000}, 
-    {0x42b48000}, {0x42b4a000}, {0x42b4c000}, {0x42b4e000}, 
-    {0x42b50000}, {0x42b52000}, {0x42b54000}, {0x42b56000}, 
-    {0x42b58000}, {0x42b5a000}, {0x42b5c000}, {0x42b5e000}, 
-    {0x42b60000}, {0x42b62000}, {0x42b64000}, {0x42b66000}, 
-    {0x42b68000}, {0x42b6a000}, {0x42b6c000}, {0x42b6e000}, 
-    {0x42b70000}, {0x42b72000}, {0x42b74000}, {0x42b76000}, 
-    {0x42b78000}, {0x42b7a000}, {0x42b7c000}, {0x42b7e000}, 
-    {0x42b80000}, {0x42b82000}, {0x42b84000}, {0x42b86000}, 
-    {0x42b88000}, {0x42b8a000}, {0x42b8c000}, {0x42b8e000}, 
-    {0x42b90000}, {0x42b92000}, {0x42b94000}, {0x42b96000}, 
-    {0x42b98000}, {0x42b9a000}, {0x42b9c000}, {0x42b9e000}, 
-    {0x42ba0000}, {0x42ba2000}, {0x42ba4000}, {0x42ba6000}, 
-    {0x42ba8000}, {0x42baa000}, {0x42bac000}, {0x42bae000}, 
-    {0x42bb0000}, {0x42bb2000}, {0x42bb4000}, {0x42bb6000}, 
-    {0x42bb8000}, {0x42bba000}, {0x42bbc000}, {0x42bbe000}, 
-    {0x42bc0000}, {0x42bc2000}, {0x42bc4000}, {0x42bc6000}, 
-    {0x42bc8000}, {0x42bca000}, {0x42bcc000}, {0x42bce000}, 
-    {0x42bd0000}, {0x42bd2000}, {0x42bd4000}, {0x42bd6000}, 
-    {0x42bd8000}, {0x42bda000}, {0x42bdc000}, {0x42bde000}, 
-    {0x42be0000}, {0x42be2000}, {0x42be4000}, {0x42be6000}, 
-    {0x42be8000}, {0x42bea000}, {0x42bec000}, {0x42bee000}, 
-    {0x42bf0000}, {0x42bf2000}, {0x42bf4000}, {0x42bf6000}, 
-    {0x42bf8000}, {0x42bfa000}, {0x42bfc000}, {0x42bfe000}, 
-    {0x42c00000}, {0x42c02000}, {0x42c04000}, {0x42c06000}, 
-    {0x42c08000}, {0x42c0a000}, {0x42c0c000}, {0x42c0e000}, 
-    {0x42c10000}, {0x42c12000}, {0x42c14000}, {0x42c16000}, 
-    {0x42c18000}, {0x42c1a000}, {0x42c1c000}, {0x42c1e000}, 
-    {0x42c20000}, {0x42c22000}, {0x42c24000}, {0x42c26000}, 
-    {0x42c28000}, {0x42c2a000}, {0x42c2c000}, {0x42c2e000}, 
-    {0x42c30000}, {0x42c32000}, {0x42c34000}, {0x42c36000}, 
-    {0x42c38000}, {0x42c3a000}, {0x42c3c000}, {0x42c3e000}, 
-    {0x42c40000}, {0x42c42000}, {0x42c44000}, {0x42c46000}, 
-    {0x42c48000}, {0x42c4a000}, {0x42c4c000}, {0x42c4e000}, 
-    {0x42c50000}, {0x42c52000}, {0x42c54000}, {0x42c56000}, 
-    {0x42c58000}, {0x42c5a000}, {0x42c5c000}, {0x42c5e000}, 
-    {0x42c60000}, {0x42c62000}, {0x42c64000}, {0x42c66000}, 
-    {0x42c68000}, {0x42c6a000}, {0x42c6c000}, {0x42c6e000}, 
-    {0x42c70000}, {0x42c72000}, {0x42c74000}, {0x42c76000}, 
-    {0x42c78000}, {0x42c7a000}, {0x42c7c000}, {0x42c7e000}, 
-    {0x42c80000}, {0x42c82000}, {0x42c84000}, {0x42c86000}, 
-    {0x42c88000}, {0x42c8a000}, {0x42c8c000}, {0x42c8e000}, 
-    {0x42c90000}, {0x42c92000}, {0x42c94000}, {0x42c96000}, 
-    {0x42c98000}, {0x42c9a000}, {0x42c9c000}, {0x42c9e000}, 
-    {0x42ca0000}, {0x42ca2000}, {0x42ca4000}, {0x42ca6000}, 
-    {0x42ca8000}, {0x42caa000}, {0x42cac000}, {0x42cae000}, 
-    {0x42cb0000}, {0x42cb2000}, {0x42cb4000}, {0x42cb6000}, 
-    {0x42cb8000}, {0x42cba000}, {0x42cbc000}, {0x42cbe000}, 
-    {0x42cc0000}, {0x42cc2000}, {0x42cc4000}, {0x42cc6000}, 
-    {0x42cc8000}, {0x42cca000}, {0x42ccc000}, {0x42cce000}, 
-    {0x42cd0000}, {0x42cd2000}, {0x42cd4000}, {0x42cd6000}, 
-    {0x42cd8000}, {0x42cda000}, {0x42cdc000}, {0x42cde000}, 
-    {0x42ce0000}, {0x42ce2000}, {0x42ce4000}, {0x42ce6000}, 
-    {0x42ce8000}, {0x42cea000}, {0x42cec000}, {0x42cee000}, 
-    {0x42cf0000}, {0x42cf2000}, {0x42cf4000}, {0x42cf6000}, 
-    {0x42cf8000}, {0x42cfa000}, {0x42cfc000}, {0x42cfe000}, 
-    {0x42d00000}, {0x42d02000}, {0x42d04000}, {0x42d06000}, 
-    {0x42d08000}, {0x42d0a000}, {0x42d0c000}, {0x42d0e000}, 
-    {0x42d10000}, {0x42d12000}, {0x42d14000}, {0x42d16000}, 
-    {0x42d18000}, {0x42d1a000}, {0x42d1c000}, {0x42d1e000}, 
-    {0x42d20000}, {0x42d22000}, {0x42d24000}, {0x42d26000}, 
-    {0x42d28000}, {0x42d2a000}, {0x42d2c000}, {0x42d2e000}, 
-    {0x42d30000}, {0x42d32000}, {0x42d34000}, {0x42d36000}, 
-    {0x42d38000}, {0x42d3a000}, {0x42d3c000}, {0x42d3e000}, 
-    {0x42d40000}, {0x42d42000}, {0x42d44000}, {0x42d46000}, 
-    {0x42d48000}, {0x42d4a000}, {0x42d4c000}, {0x42d4e000}, 
-    {0x42d50000}, {0x42d52000}, {0x42d54000}, {0x42d56000}, 
-    {0x42d58000}, {0x42d5a000}, {0x42d5c000}, {0x42d5e000}, 
-    {0x42d60000}, {0x42d62000}, {0x42d64000}, {0x42d66000}, 
-    {0x42d68000}, {0x42d6a000}, {0x42d6c000}, {0x42d6e000}, 
-    {0x42d70000}, {0x42d72000}, {0x42d74000}, {0x42d76000}, 
-    {0x42d78000}, {0x42d7a000}, {0x42d7c000}, {0x42d7e000}, 
-    {0x42d80000}, {0x42d82000}, {0x42d84000}, {0x42d86000}, 
-    {0x42d88000}, {0x42d8a000}, {0x42d8c000}, {0x42d8e000}, 
-    {0x42d90000}, {0x42d92000}, {0x42d94000}, {0x42d96000}, 
-    {0x42d98000}, {0x42d9a000}, {0x42d9c000}, {0x42d9e000}, 
-    {0x42da0000}, {0x42da2000}, {0x42da4000}, {0x42da6000}, 
-    {0x42da8000}, {0x42daa000}, {0x42dac000}, {0x42dae000}, 
-    {0x42db0000}, {0x42db2000}, {0x42db4000}, {0x42db6000}, 
-    {0x42db8000}, {0x42dba000}, {0x42dbc000}, {0x42dbe000}, 
-    {0x42dc0000}, {0x42dc2000}, {0x42dc4000}, {0x42dc6000}, 
-    {0x42dc8000}, {0x42dca000}, {0x42dcc000}, {0x42dce000}, 
-    {0x42dd0000}, {0x42dd2000}, {0x42dd4000}, {0x42dd6000}, 
-    {0x42dd8000}, {0x42dda000}, {0x42ddc000}, {0x42dde000}, 
-    {0x42de0000}, {0x42de2000}, {0x42de4000}, {0x42de6000}, 
-    {0x42de8000}, {0x42dea000}, {0x42dec000}, {0x42dee000}, 
-    {0x42df0000}, {0x42df2000}, {0x42df4000}, {0x42df6000}, 
-    {0x42df8000}, {0x42dfa000}, {0x42dfc000}, {0x42dfe000}, 
-    {0x42e00000}, {0x42e02000}, {0x42e04000}, {0x42e06000}, 
-    {0x42e08000}, {0x42e0a000}, {0x42e0c000}, {0x42e0e000}, 
-    {0x42e10000}, {0x42e12000}, {0x42e14000}, {0x42e16000}, 
-    {0x42e18000}, {0x42e1a000}, {0x42e1c000}, {0x42e1e000}, 
-    {0x42e20000}, {0x42e22000}, {0x42e24000}, {0x42e26000}, 
-    {0x42e28000}, {0x42e2a000}, {0x42e2c000}, {0x42e2e000}, 
-    {0x42e30000}, {0x42e32000}, {0x42e34000}, {0x42e36000}, 
-    {0x42e38000}, {0x42e3a000}, {0x42e3c000}, {0x42e3e000}, 
-    {0x42e40000}, {0x42e42000}, {0x42e44000}, {0x42e46000}, 
-    {0x42e48000}, {0x42e4a000}, {0x42e4c000}, {0x42e4e000}, 
-    {0x42e50000}, {0x42e52000}, {0x42e54000}, {0x42e56000}, 
-    {0x42e58000}, {0x42e5a000}, {0x42e5c000}, {0x42e5e000}, 
-    {0x42e60000}, {0x42e62000}, {0x42e64000}, {0x42e66000}, 
-    {0x42e68000}, {0x42e6a000}, {0x42e6c000}, {0x42e6e000}, 
-    {0x42e70000}, {0x42e72000}, {0x42e74000}, {0x42e76000}, 
-    {0x42e78000}, {0x42e7a000}, {0x42e7c000}, {0x42e7e000}, 
-    {0x42e80000}, {0x42e82000}, {0x42e84000}, {0x42e86000}, 
-    {0x42e88000}, {0x42e8a000}, {0x42e8c000}, {0x42e8e000}, 
-    {0x42e90000}, {0x42e92000}, {0x42e94000}, {0x42e96000}, 
-    {0x42e98000}, {0x42e9a000}, {0x42e9c000}, {0x42e9e000}, 
-    {0x42ea0000}, {0x42ea2000}, {0x42ea4000}, {0x42ea6000}, 
-    {0x42ea8000}, {0x42eaa000}, {0x42eac000}, {0x42eae000}, 
-    {0x42eb0000}, {0x42eb2000}, {0x42eb4000}, {0x42eb6000}, 
-    {0x42eb8000}, {0x42eba000}, {0x42ebc000}, {0x42ebe000}, 
-    {0x42ec0000}, {0x42ec2000}, {0x42ec4000}, {0x42ec6000}, 
-    {0x42ec8000}, {0x42eca000}, {0x42ecc000}, {0x42ece000}, 
-    {0x42ed0000}, {0x42ed2000}, {0x42ed4000}, {0x42ed6000}, 
-    {0x42ed8000}, {0x42eda000}, {0x42edc000}, {0x42ede000}, 
-    {0x42ee0000}, {0x42ee2000}, {0x42ee4000}, {0x42ee6000}, 
-    {0x42ee8000}, {0x42eea000}, {0x42eec000}, {0x42eee000}, 
-    {0x42ef0000}, {0x42ef2000}, {0x42ef4000}, {0x42ef6000}, 
-    {0x42ef8000}, {0x42efa000}, {0x42efc000}, {0x42efe000}, 
-    {0x42f00000}, {0x42f02000}, {0x42f04000}, {0x42f06000}, 
-    {0x42f08000}, {0x42f0a000}, {0x42f0c000}, {0x42f0e000}, 
-    {0x42f10000}, {0x42f12000}, {0x42f14000}, {0x42f16000}, 
-    {0x42f18000}, {0x42f1a000}, {0x42f1c000}, {0x42f1e000}, 
-    {0x42f20000}, {0x42f22000}, {0x42f24000}, {0x42f26000}, 
-    {0x42f28000}, {0x42f2a000}, {0x42f2c000}, {0x42f2e000}, 
-    {0x42f30000}, {0x42f32000}, {0x42f34000}, {0x42f36000}, 
-    {0x42f38000}, {0x42f3a000}, {0x42f3c000}, {0x42f3e000}, 
-    {0x42f40000}, {0x42f42000}, {0x42f44000}, {0x42f46000}, 
-    {0x42f48000}, {0x42f4a000}, {0x42f4c000}, {0x42f4e000}, 
-    {0x42f50000}, {0x42f52000}, {0x42f54000}, {0x42f56000}, 
-    {0x42f58000}, {0x42f5a000}, {0x42f5c000}, {0x42f5e000}, 
-    {0x42f60000}, {0x42f62000}, {0x42f64000}, {0x42f66000}, 
-    {0x42f68000}, {0x42f6a000}, {0x42f6c000}, {0x42f6e000}, 
-    {0x42f70000}, {0x42f72000}, {0x42f74000}, {0x42f76000}, 
-    {0x42f78000}, {0x42f7a000}, {0x42f7c000}, {0x42f7e000}, 
-    {0x42f80000}, {0x42f82000}, {0x42f84000}, {0x42f86000}, 
-    {0x42f88000}, {0x42f8a000}, {0x42f8c000}, {0x42f8e000}, 
-    {0x42f90000}, {0x42f92000}, {0x42f94000}, {0x42f96000}, 
-    {0x42f98000}, {0x42f9a000}, {0x42f9c000}, {0x42f9e000}, 
-    {0x42fa0000}, {0x42fa2000}, {0x42fa4000}, {0x42fa6000}, 
-    {0x42fa8000}, {0x42faa000}, {0x42fac000}, {0x42fae000}, 
-    {0x42fb0000}, {0x42fb2000}, {0x42fb4000}, {0x42fb6000}, 
-    {0x42fb8000}, {0x42fba000}, {0x42fbc000}, {0x42fbe000}, 
-    {0x42fc0000}, {0x42fc2000}, {0x42fc4000}, {0x42fc6000}, 
-    {0x42fc8000}, {0x42fca000}, {0x42fcc000}, {0x42fce000}, 
-    {0x42fd0000}, {0x42fd2000}, {0x42fd4000}, {0x42fd6000}, 
-    {0x42fd8000}, {0x42fda000}, {0x42fdc000}, {0x42fde000}, 
-    {0x42fe0000}, {0x42fe2000}, {0x42fe4000}, {0x42fe6000}, 
-    {0x42fe8000}, {0x42fea000}, {0x42fec000}, {0x42fee000}, 
-    {0x42ff0000}, {0x42ff2000}, {0x42ff4000}, {0x42ff6000}, 
-    {0x42ff8000}, {0x42ffa000}, {0x42ffc000}, {0x42ffe000}, 
-    {0x43000000}, {0x43002000}, {0x43004000}, {0x43006000}, 
-    {0x43008000}, {0x4300a000}, {0x4300c000}, {0x4300e000}, 
-    {0x43010000}, {0x43012000}, {0x43014000}, {0x43016000}, 
-    {0x43018000}, {0x4301a000}, {0x4301c000}, {0x4301e000}, 
-    {0x43020000}, {0x43022000}, {0x43024000}, {0x43026000}, 
-    {0x43028000}, {0x4302a000}, {0x4302c000}, {0x4302e000}, 
-    {0x43030000}, {0x43032000}, {0x43034000}, {0x43036000}, 
-    {0x43038000}, {0x4303a000}, {0x4303c000}, {0x4303e000}, 
-    {0x43040000}, {0x43042000}, {0x43044000}, {0x43046000}, 
-    {0x43048000}, {0x4304a000}, {0x4304c000}, {0x4304e000}, 
-    {0x43050000}, {0x43052000}, {0x43054000}, {0x43056000}, 
-    {0x43058000}, {0x4305a000}, {0x4305c000}, {0x4305e000}, 
-    {0x43060000}, {0x43062000}, {0x43064000}, {0x43066000}, 
-    {0x43068000}, {0x4306a000}, {0x4306c000}, {0x4306e000}, 
-    {0x43070000}, {0x43072000}, {0x43074000}, {0x43076000}, 
-    {0x43078000}, {0x4307a000}, {0x4307c000}, {0x4307e000}, 
-    {0x43080000}, {0x43082000}, {0x43084000}, {0x43086000}, 
-    {0x43088000}, {0x4308a000}, {0x4308c000}, {0x4308e000}, 
-    {0x43090000}, {0x43092000}, {0x43094000}, {0x43096000}, 
-    {0x43098000}, {0x4309a000}, {0x4309c000}, {0x4309e000}, 
-    {0x430a0000}, {0x430a2000}, {0x430a4000}, {0x430a6000}, 
-    {0x430a8000}, {0x430aa000}, {0x430ac000}, {0x430ae000}, 
-    {0x430b0000}, {0x430b2000}, {0x430b4000}, {0x430b6000}, 
-    {0x430b8000}, {0x430ba000}, {0x430bc000}, {0x430be000}, 
-    {0x430c0000}, {0x430c2000}, {0x430c4000}, {0x430c6000}, 
-    {0x430c8000}, {0x430ca000}, {0x430cc000}, {0x430ce000}, 
-    {0x430d0000}, {0x430d2000}, {0x430d4000}, {0x430d6000}, 
-    {0x430d8000}, {0x430da000}, {0x430dc000}, {0x430de000}, 
-    {0x430e0000}, {0x430e2000}, {0x430e4000}, {0x430e6000}, 
-    {0x430e8000}, {0x430ea000}, {0x430ec000}, {0x430ee000}, 
-    {0x430f0000}, {0x430f2000}, {0x430f4000}, {0x430f6000}, 
-    {0x430f8000}, {0x430fa000}, {0x430fc000}, {0x430fe000}, 
-    {0x43100000}, {0x43102000}, {0x43104000}, {0x43106000}, 
-    {0x43108000}, {0x4310a000}, {0x4310c000}, {0x4310e000}, 
-    {0x43110000}, {0x43112000}, {0x43114000}, {0x43116000}, 
-    {0x43118000}, {0x4311a000}, {0x4311c000}, {0x4311e000}, 
-    {0x43120000}, {0x43122000}, {0x43124000}, {0x43126000}, 
-    {0x43128000}, {0x4312a000}, {0x4312c000}, {0x4312e000}, 
-    {0x43130000}, {0x43132000}, {0x43134000}, {0x43136000}, 
-    {0x43138000}, {0x4313a000}, {0x4313c000}, {0x4313e000}, 
-    {0x43140000}, {0x43142000}, {0x43144000}, {0x43146000}, 
-    {0x43148000}, {0x4314a000}, {0x4314c000}, {0x4314e000}, 
-    {0x43150000}, {0x43152000}, {0x43154000}, {0x43156000}, 
-    {0x43158000}, {0x4315a000}, {0x4315c000}, {0x4315e000}, 
-    {0x43160000}, {0x43162000}, {0x43164000}, {0x43166000}, 
-    {0x43168000}, {0x4316a000}, {0x4316c000}, {0x4316e000}, 
-    {0x43170000}, {0x43172000}, {0x43174000}, {0x43176000}, 
-    {0x43178000}, {0x4317a000}, {0x4317c000}, {0x4317e000}, 
-    {0x43180000}, {0x43182000}, {0x43184000}, {0x43186000}, 
-    {0x43188000}, {0x4318a000}, {0x4318c000}, {0x4318e000}, 
-    {0x43190000}, {0x43192000}, {0x43194000}, {0x43196000}, 
-    {0x43198000}, {0x4319a000}, {0x4319c000}, {0x4319e000}, 
-    {0x431a0000}, {0x431a2000}, {0x431a4000}, {0x431a6000}, 
-    {0x431a8000}, {0x431aa000}, {0x431ac000}, {0x431ae000}, 
-    {0x431b0000}, {0x431b2000}, {0x431b4000}, {0x431b6000}, 
-    {0x431b8000}, {0x431ba000}, {0x431bc000}, {0x431be000}, 
-    {0x431c0000}, {0x431c2000}, {0x431c4000}, {0x431c6000}, 
-    {0x431c8000}, {0x431ca000}, {0x431cc000}, {0x431ce000}, 
-    {0x431d0000}, {0x431d2000}, {0x431d4000}, {0x431d6000}, 
-    {0x431d8000}, {0x431da000}, {0x431dc000}, {0x431de000}, 
-    {0x431e0000}, {0x431e2000}, {0x431e4000}, {0x431e6000}, 
-    {0x431e8000}, {0x431ea000}, {0x431ec000}, {0x431ee000}, 
-    {0x431f0000}, {0x431f2000}, {0x431f4000}, {0x431f6000}, 
-    {0x431f8000}, {0x431fa000}, {0x431fc000}, {0x431fe000}, 
-    {0x43200000}, {0x43202000}, {0x43204000}, {0x43206000}, 
-    {0x43208000}, {0x4320a000}, {0x4320c000}, {0x4320e000}, 
-    {0x43210000}, {0x43212000}, {0x43214000}, {0x43216000}, 
-    {0x43218000}, {0x4321a000}, {0x4321c000}, {0x4321e000}, 
-    {0x43220000}, {0x43222000}, {0x43224000}, {0x43226000}, 
-    {0x43228000}, {0x4322a000}, {0x4322c000}, {0x4322e000}, 
-    {0x43230000}, {0x43232000}, {0x43234000}, {0x43236000}, 
-    {0x43238000}, {0x4323a000}, {0x4323c000}, {0x4323e000}, 
-    {0x43240000}, {0x43242000}, {0x43244000}, {0x43246000}, 
-    {0x43248000}, {0x4324a000}, {0x4324c000}, {0x4324e000}, 
-    {0x43250000}, {0x43252000}, {0x43254000}, {0x43256000}, 
-    {0x43258000}, {0x4325a000}, {0x4325c000}, {0x4325e000}, 
-    {0x43260000}, {0x43262000}, {0x43264000}, {0x43266000}, 
-    {0x43268000}, {0x4326a000}, {0x4326c000}, {0x4326e000}, 
-    {0x43270000}, {0x43272000}, {0x43274000}, {0x43276000}, 
-    {0x43278000}, {0x4327a000}, {0x4327c000}, {0x4327e000}, 
-    {0x43280000}, {0x43282000}, {0x43284000}, {0x43286000}, 
-    {0x43288000}, {0x4328a000}, {0x4328c000}, {0x4328e000}, 
-    {0x43290000}, {0x43292000}, {0x43294000}, {0x43296000}, 
-    {0x43298000}, {0x4329a000}, {0x4329c000}, {0x4329e000}, 
-    {0x432a0000}, {0x432a2000}, {0x432a4000}, {0x432a6000}, 
-    {0x432a8000}, {0x432aa000}, {0x432ac000}, {0x432ae000}, 
-    {0x432b0000}, {0x432b2000}, {0x432b4000}, {0x432b6000}, 
-    {0x432b8000}, {0x432ba000}, {0x432bc000}, {0x432be000}, 
-    {0x432c0000}, {0x432c2000}, {0x432c4000}, {0x432c6000}, 
-    {0x432c8000}, {0x432ca000}, {0x432cc000}, {0x432ce000}, 
-    {0x432d0000}, {0x432d2000}, {0x432d4000}, {0x432d6000}, 
-    {0x432d8000}, {0x432da000}, {0x432dc000}, {0x432de000}, 
-    {0x432e0000}, {0x432e2000}, {0x432e4000}, {0x432e6000}, 
-    {0x432e8000}, {0x432ea000}, {0x432ec000}, {0x432ee000}, 
-    {0x432f0000}, {0x432f2000}, {0x432f4000}, {0x432f6000}, 
-    {0x432f8000}, {0x432fa000}, {0x432fc000}, {0x432fe000}, 
-    {0x43300000}, {0x43302000}, {0x43304000}, {0x43306000}, 
-    {0x43308000}, {0x4330a000}, {0x4330c000}, {0x4330e000}, 
-    {0x43310000}, {0x43312000}, {0x43314000}, {0x43316000}, 
-    {0x43318000}, {0x4331a000}, {0x4331c000}, {0x4331e000}, 
-    {0x43320000}, {0x43322000}, {0x43324000}, {0x43326000}, 
-    {0x43328000}, {0x4332a000}, {0x4332c000}, {0x4332e000}, 
-    {0x43330000}, {0x43332000}, {0x43334000}, {0x43336000}, 
-    {0x43338000}, {0x4333a000}, {0x4333c000}, {0x4333e000}, 
-    {0x43340000}, {0x43342000}, {0x43344000}, {0x43346000}, 
-    {0x43348000}, {0x4334a000}, {0x4334c000}, {0x4334e000}, 
-    {0x43350000}, {0x43352000}, {0x43354000}, {0x43356000}, 
-    {0x43358000}, {0x4335a000}, {0x4335c000}, {0x4335e000}, 
-    {0x43360000}, {0x43362000}, {0x43364000}, {0x43366000}, 
-    {0x43368000}, {0x4336a000}, {0x4336c000}, {0x4336e000}, 
-    {0x43370000}, {0x43372000}, {0x43374000}, {0x43376000}, 
-    {0x43378000}, {0x4337a000}, {0x4337c000}, {0x4337e000}, 
-    {0x43380000}, {0x43382000}, {0x43384000}, {0x43386000}, 
-    {0x43388000}, {0x4338a000}, {0x4338c000}, {0x4338e000}, 
-    {0x43390000}, {0x43392000}, {0x43394000}, {0x43396000}, 
-    {0x43398000}, {0x4339a000}, {0x4339c000}, {0x4339e000}, 
-    {0x433a0000}, {0x433a2000}, {0x433a4000}, {0x433a6000}, 
-    {0x433a8000}, {0x433aa000}, {0x433ac000}, {0x433ae000}, 
-    {0x433b0000}, {0x433b2000}, {0x433b4000}, {0x433b6000}, 
-    {0x433b8000}, {0x433ba000}, {0x433bc000}, {0x433be000}, 
-    {0x433c0000}, {0x433c2000}, {0x433c4000}, {0x433c6000}, 
-    {0x433c8000}, {0x433ca000}, {0x433cc000}, {0x433ce000}, 
-    {0x433d0000}, {0x433d2000}, {0x433d4000}, {0x433d6000}, 
-    {0x433d8000}, {0x433da000}, {0x433dc000}, {0x433de000}, 
-    {0x433e0000}, {0x433e2000}, {0x433e4000}, {0x433e6000}, 
-    {0x433e8000}, {0x433ea000}, {0x433ec000}, {0x433ee000}, 
-    {0x433f0000}, {0x433f2000}, {0x433f4000}, {0x433f6000}, 
-    {0x433f8000}, {0x433fa000}, {0x433fc000}, {0x433fe000}, 
-    {0x43400000}, {0x43402000}, {0x43404000}, {0x43406000}, 
-    {0x43408000}, {0x4340a000}, {0x4340c000}, {0x4340e000}, 
-    {0x43410000}, {0x43412000}, {0x43414000}, {0x43416000}, 
-    {0x43418000}, {0x4341a000}, {0x4341c000}, {0x4341e000}, 
-    {0x43420000}, {0x43422000}, {0x43424000}, {0x43426000}, 
-    {0x43428000}, {0x4342a000}, {0x4342c000}, {0x4342e000}, 
-    {0x43430000}, {0x43432000}, {0x43434000}, {0x43436000}, 
-    {0x43438000}, {0x4343a000}, {0x4343c000}, {0x4343e000}, 
-    {0x43440000}, {0x43442000}, {0x43444000}, {0x43446000}, 
-    {0x43448000}, {0x4344a000}, {0x4344c000}, {0x4344e000}, 
-    {0x43450000}, {0x43452000}, {0x43454000}, {0x43456000}, 
-    {0x43458000}, {0x4345a000}, {0x4345c000}, {0x4345e000}, 
-    {0x43460000}, {0x43462000}, {0x43464000}, {0x43466000}, 
-    {0x43468000}, {0x4346a000}, {0x4346c000}, {0x4346e000}, 
-    {0x43470000}, {0x43472000}, {0x43474000}, {0x43476000}, 
-    {0x43478000}, {0x4347a000}, {0x4347c000}, {0x4347e000}, 
-    {0x43480000}, {0x43482000}, {0x43484000}, {0x43486000}, 
-    {0x43488000}, {0x4348a000}, {0x4348c000}, {0x4348e000}, 
-    {0x43490000}, {0x43492000}, {0x43494000}, {0x43496000}, 
-    {0x43498000}, {0x4349a000}, {0x4349c000}, {0x4349e000}, 
-    {0x434a0000}, {0x434a2000}, {0x434a4000}, {0x434a6000}, 
-    {0x434a8000}, {0x434aa000}, {0x434ac000}, {0x434ae000}, 
-    {0x434b0000}, {0x434b2000}, {0x434b4000}, {0x434b6000}, 
-    {0x434b8000}, {0x434ba000}, {0x434bc000}, {0x434be000}, 
-    {0x434c0000}, {0x434c2000}, {0x434c4000}, {0x434c6000}, 
-    {0x434c8000}, {0x434ca000}, {0x434cc000}, {0x434ce000}, 
-    {0x434d0000}, {0x434d2000}, {0x434d4000}, {0x434d6000}, 
-    {0x434d8000}, {0x434da000}, {0x434dc000}, {0x434de000}, 
-    {0x434e0000}, {0x434e2000}, {0x434e4000}, {0x434e6000}, 
-    {0x434e8000}, {0x434ea000}, {0x434ec000}, {0x434ee000}, 
-    {0x434f0000}, {0x434f2000}, {0x434f4000}, {0x434f6000}, 
-    {0x434f8000}, {0x434fa000}, {0x434fc000}, {0x434fe000}, 
-    {0x43500000}, {0x43502000}, {0x43504000}, {0x43506000}, 
-    {0x43508000}, {0x4350a000}, {0x4350c000}, {0x4350e000}, 
-    {0x43510000}, {0x43512000}, {0x43514000}, {0x43516000}, 
-    {0x43518000}, {0x4351a000}, {0x4351c000}, {0x4351e000}, 
-    {0x43520000}, {0x43522000}, {0x43524000}, {0x43526000}, 
-    {0x43528000}, {0x4352a000}, {0x4352c000}, {0x4352e000}, 
-    {0x43530000}, {0x43532000}, {0x43534000}, {0x43536000}, 
-    {0x43538000}, {0x4353a000}, {0x4353c000}, {0x4353e000}, 
-    {0x43540000}, {0x43542000}, {0x43544000}, {0x43546000}, 
-    {0x43548000}, {0x4354a000}, {0x4354c000}, {0x4354e000}, 
-    {0x43550000}, {0x43552000}, {0x43554000}, {0x43556000}, 
-    {0x43558000}, {0x4355a000}, {0x4355c000}, {0x4355e000}, 
-    {0x43560000}, {0x43562000}, {0x43564000}, {0x43566000}, 
-    {0x43568000}, {0x4356a000}, {0x4356c000}, {0x4356e000}, 
-    {0x43570000}, {0x43572000}, {0x43574000}, {0x43576000}, 
-    {0x43578000}, {0x4357a000}, {0x4357c000}, {0x4357e000}, 
-    {0x43580000}, {0x43582000}, {0x43584000}, {0x43586000}, 
-    {0x43588000}, {0x4358a000}, {0x4358c000}, {0x4358e000}, 
-    {0x43590000}, {0x43592000}, {0x43594000}, {0x43596000}, 
-    {0x43598000}, {0x4359a000}, {0x4359c000}, {0x4359e000}, 
-    {0x435a0000}, {0x435a2000}, {0x435a4000}, {0x435a6000}, 
-    {0x435a8000}, {0x435aa000}, {0x435ac000}, {0x435ae000}, 
-    {0x435b0000}, {0x435b2000}, {0x435b4000}, {0x435b6000}, 
-    {0x435b8000}, {0x435ba000}, {0x435bc000}, {0x435be000}, 
-    {0x435c0000}, {0x435c2000}, {0x435c4000}, {0x435c6000}, 
-    {0x435c8000}, {0x435ca000}, {0x435cc000}, {0x435ce000}, 
-    {0x435d0000}, {0x435d2000}, {0x435d4000}, {0x435d6000}, 
-    {0x435d8000}, {0x435da000}, {0x435dc000}, {0x435de000}, 
-    {0x435e0000}, {0x435e2000}, {0x435e4000}, {0x435e6000}, 
-    {0x435e8000}, {0x435ea000}, {0x435ec000}, {0x435ee000}, 
-    {0x435f0000}, {0x435f2000}, {0x435f4000}, {0x435f6000}, 
-    {0x435f8000}, {0x435fa000}, {0x435fc000}, {0x435fe000}, 
-    {0x43600000}, {0x43602000}, {0x43604000}, {0x43606000}, 
-    {0x43608000}, {0x4360a000}, {0x4360c000}, {0x4360e000}, 
-    {0x43610000}, {0x43612000}, {0x43614000}, {0x43616000}, 
-    {0x43618000}, {0x4361a000}, {0x4361c000}, {0x4361e000}, 
-    {0x43620000}, {0x43622000}, {0x43624000}, {0x43626000}, 
-    {0x43628000}, {0x4362a000}, {0x4362c000}, {0x4362e000}, 
-    {0x43630000}, {0x43632000}, {0x43634000}, {0x43636000}, 
-    {0x43638000}, {0x4363a000}, {0x4363c000}, {0x4363e000}, 
-    {0x43640000}, {0x43642000}, {0x43644000}, {0x43646000}, 
-    {0x43648000}, {0x4364a000}, {0x4364c000}, {0x4364e000}, 
-    {0x43650000}, {0x43652000}, {0x43654000}, {0x43656000}, 
-    {0x43658000}, {0x4365a000}, {0x4365c000}, {0x4365e000}, 
-    {0x43660000}, {0x43662000}, {0x43664000}, {0x43666000}, 
-    {0x43668000}, {0x4366a000}, {0x4366c000}, {0x4366e000}, 
-    {0x43670000}, {0x43672000}, {0x43674000}, {0x43676000}, 
-    {0x43678000}, {0x4367a000}, {0x4367c000}, {0x4367e000}, 
-    {0x43680000}, {0x43682000}, {0x43684000}, {0x43686000}, 
-    {0x43688000}, {0x4368a000}, {0x4368c000}, {0x4368e000}, 
-    {0x43690000}, {0x43692000}, {0x43694000}, {0x43696000}, 
-    {0x43698000}, {0x4369a000}, {0x4369c000}, {0x4369e000}, 
-    {0x436a0000}, {0x436a2000}, {0x436a4000}, {0x436a6000}, 
-    {0x436a8000}, {0x436aa000}, {0x436ac000}, {0x436ae000}, 
-    {0x436b0000}, {0x436b2000}, {0x436b4000}, {0x436b6000}, 
-    {0x436b8000}, {0x436ba000}, {0x436bc000}, {0x436be000}, 
-    {0x436c0000}, {0x436c2000}, {0x436c4000}, {0x436c6000}, 
-    {0x436c8000}, {0x436ca000}, {0x436cc000}, {0x436ce000}, 
-    {0x436d0000}, {0x436d2000}, {0x436d4000}, {0x436d6000}, 
-    {0x436d8000}, {0x436da000}, {0x436dc000}, {0x436de000}, 
-    {0x436e0000}, {0x436e2000}, {0x436e4000}, {0x436e6000}, 
-    {0x436e8000}, {0x436ea000}, {0x436ec000}, {0x436ee000}, 
-    {0x436f0000}, {0x436f2000}, {0x436f4000}, {0x436f6000}, 
-    {0x436f8000}, {0x436fa000}, {0x436fc000}, {0x436fe000}, 
-    {0x43700000}, {0x43702000}, {0x43704000}, {0x43706000}, 
-    {0x43708000}, {0x4370a000}, {0x4370c000}, {0x4370e000}, 
-    {0x43710000}, {0x43712000}, {0x43714000}, {0x43716000}, 
-    {0x43718000}, {0x4371a000}, {0x4371c000}, {0x4371e000}, 
-    {0x43720000}, {0x43722000}, {0x43724000}, {0x43726000}, 
-    {0x43728000}, {0x4372a000}, {0x4372c000}, {0x4372e000}, 
-    {0x43730000}, {0x43732000}, {0x43734000}, {0x43736000}, 
-    {0x43738000}, {0x4373a000}, {0x4373c000}, {0x4373e000}, 
-    {0x43740000}, {0x43742000}, {0x43744000}, {0x43746000}, 
-    {0x43748000}, {0x4374a000}, {0x4374c000}, {0x4374e000}, 
-    {0x43750000}, {0x43752000}, {0x43754000}, {0x43756000}, 
-    {0x43758000}, {0x4375a000}, {0x4375c000}, {0x4375e000}, 
-    {0x43760000}, {0x43762000}, {0x43764000}, {0x43766000}, 
-    {0x43768000}, {0x4376a000}, {0x4376c000}, {0x4376e000}, 
-    {0x43770000}, {0x43772000}, {0x43774000}, {0x43776000}, 
-    {0x43778000}, {0x4377a000}, {0x4377c000}, {0x4377e000}, 
-    {0x43780000}, {0x43782000}, {0x43784000}, {0x43786000}, 
-    {0x43788000}, {0x4378a000}, {0x4378c000}, {0x4378e000}, 
-    {0x43790000}, {0x43792000}, {0x43794000}, {0x43796000}, 
-    {0x43798000}, {0x4379a000}, {0x4379c000}, {0x4379e000}, 
-    {0x437a0000}, {0x437a2000}, {0x437a4000}, {0x437a6000}, 
-    {0x437a8000}, {0x437aa000}, {0x437ac000}, {0x437ae000}, 
-    {0x437b0000}, {0x437b2000}, {0x437b4000}, {0x437b6000}, 
-    {0x437b8000}, {0x437ba000}, {0x437bc000}, {0x437be000}, 
-    {0x437c0000}, {0x437c2000}, {0x437c4000}, {0x437c6000}, 
-    {0x437c8000}, {0x437ca000}, {0x437cc000}, {0x437ce000}, 
-    {0x437d0000}, {0x437d2000}, {0x437d4000}, {0x437d6000}, 
-    {0x437d8000}, {0x437da000}, {0x437dc000}, {0x437de000}, 
-    {0x437e0000}, {0x437e2000}, {0x437e4000}, {0x437e6000}, 
-    {0x437e8000}, {0x437ea000}, {0x437ec000}, {0x437ee000}, 
-    {0x437f0000}, {0x437f2000}, {0x437f4000}, {0x437f6000}, 
-    {0x437f8000}, {0x437fa000}, {0x437fc000}, {0x437fe000}, 
-    {0x43800000}, {0x43802000}, {0x43804000}, {0x43806000}, 
-    {0x43808000}, {0x4380a000}, {0x4380c000}, {0x4380e000}, 
-    {0x43810000}, {0x43812000}, {0x43814000}, {0x43816000}, 
-    {0x43818000}, {0x4381a000}, {0x4381c000}, {0x4381e000}, 
-    {0x43820000}, {0x43822000}, {0x43824000}, {0x43826000}, 
-    {0x43828000}, {0x4382a000}, {0x4382c000}, {0x4382e000}, 
-    {0x43830000}, {0x43832000}, {0x43834000}, {0x43836000}, 
-    {0x43838000}, {0x4383a000}, {0x4383c000}, {0x4383e000}, 
-    {0x43840000}, {0x43842000}, {0x43844000}, {0x43846000}, 
-    {0x43848000}, {0x4384a000}, {0x4384c000}, {0x4384e000}, 
-    {0x43850000}, {0x43852000}, {0x43854000}, {0x43856000}, 
-    {0x43858000}, {0x4385a000}, {0x4385c000}, {0x4385e000}, 
-    {0x43860000}, {0x43862000}, {0x43864000}, {0x43866000}, 
-    {0x43868000}, {0x4386a000}, {0x4386c000}, {0x4386e000}, 
-    {0x43870000}, {0x43872000}, {0x43874000}, {0x43876000}, 
-    {0x43878000}, {0x4387a000}, {0x4387c000}, {0x4387e000}, 
-    {0x43880000}, {0x43882000}, {0x43884000}, {0x43886000}, 
-    {0x43888000}, {0x4388a000}, {0x4388c000}, {0x4388e000}, 
-    {0x43890000}, {0x43892000}, {0x43894000}, {0x43896000}, 
-    {0x43898000}, {0x4389a000}, {0x4389c000}, {0x4389e000}, 
-    {0x438a0000}, {0x438a2000}, {0x438a4000}, {0x438a6000}, 
-    {0x438a8000}, {0x438aa000}, {0x438ac000}, {0x438ae000}, 
-    {0x438b0000}, {0x438b2000}, {0x438b4000}, {0x438b6000}, 
-    {0x438b8000}, {0x438ba000}, {0x438bc000}, {0x438be000}, 
-    {0x438c0000}, {0x438c2000}, {0x438c4000}, {0x438c6000}, 
-    {0x438c8000}, {0x438ca000}, {0x438cc000}, {0x438ce000}, 
-    {0x438d0000}, {0x438d2000}, {0x438d4000}, {0x438d6000}, 
-    {0x438d8000}, {0x438da000}, {0x438dc000}, {0x438de000}, 
-    {0x438e0000}, {0x438e2000}, {0x438e4000}, {0x438e6000}, 
-    {0x438e8000}, {0x438ea000}, {0x438ec000}, {0x438ee000}, 
-    {0x438f0000}, {0x438f2000}, {0x438f4000}, {0x438f6000}, 
-    {0x438f8000}, {0x438fa000}, {0x438fc000}, {0x438fe000}, 
-    {0x43900000}, {0x43902000}, {0x43904000}, {0x43906000}, 
-    {0x43908000}, {0x4390a000}, {0x4390c000}, {0x4390e000}, 
-    {0x43910000}, {0x43912000}, {0x43914000}, {0x43916000}, 
-    {0x43918000}, {0x4391a000}, {0x4391c000}, {0x4391e000}, 
-    {0x43920000}, {0x43922000}, {0x43924000}, {0x43926000}, 
-    {0x43928000}, {0x4392a000}, {0x4392c000}, {0x4392e000}, 
-    {0x43930000}, {0x43932000}, {0x43934000}, {0x43936000}, 
-    {0x43938000}, {0x4393a000}, {0x4393c000}, {0x4393e000}, 
-    {0x43940000}, {0x43942000}, {0x43944000}, {0x43946000}, 
-    {0x43948000}, {0x4394a000}, {0x4394c000}, {0x4394e000}, 
-    {0x43950000}, {0x43952000}, {0x43954000}, {0x43956000}, 
-    {0x43958000}, {0x4395a000}, {0x4395c000}, {0x4395e000}, 
-    {0x43960000}, {0x43962000}, {0x43964000}, {0x43966000}, 
-    {0x43968000}, {0x4396a000}, {0x4396c000}, {0x4396e000}, 
-    {0x43970000}, {0x43972000}, {0x43974000}, {0x43976000}, 
-    {0x43978000}, {0x4397a000}, {0x4397c000}, {0x4397e000}, 
-    {0x43980000}, {0x43982000}, {0x43984000}, {0x43986000}, 
-    {0x43988000}, {0x4398a000}, {0x4398c000}, {0x4398e000}, 
-    {0x43990000}, {0x43992000}, {0x43994000}, {0x43996000}, 
-    {0x43998000}, {0x4399a000}, {0x4399c000}, {0x4399e000}, 
-    {0x439a0000}, {0x439a2000}, {0x439a4000}, {0x439a6000}, 
-    {0x439a8000}, {0x439aa000}, {0x439ac000}, {0x439ae000}, 
-    {0x439b0000}, {0x439b2000}, {0x439b4000}, {0x439b6000}, 
-    {0x439b8000}, {0x439ba000}, {0x439bc000}, {0x439be000}, 
-    {0x439c0000}, {0x439c2000}, {0x439c4000}, {0x439c6000}, 
-    {0x439c8000}, {0x439ca000}, {0x439cc000}, {0x439ce000}, 
-    {0x439d0000}, {0x439d2000}, {0x439d4000}, {0x439d6000}, 
-    {0x439d8000}, {0x439da000}, {0x439dc000}, {0x439de000}, 
-    {0x439e0000}, {0x439e2000}, {0x439e4000}, {0x439e6000}, 
-    {0x439e8000}, {0x439ea000}, {0x439ec000}, {0x439ee000}, 
-    {0x439f0000}, {0x439f2000}, {0x439f4000}, {0x439f6000}, 
-    {0x439f8000}, {0x439fa000}, {0x439fc000}, {0x439fe000}, 
-    {0x43a00000}, {0x43a02000}, {0x43a04000}, {0x43a06000}, 
-    {0x43a08000}, {0x43a0a000}, {0x43a0c000}, {0x43a0e000}, 
-    {0x43a10000}, {0x43a12000}, {0x43a14000}, {0x43a16000}, 
-    {0x43a18000}, {0x43a1a000}, {0x43a1c000}, {0x43a1e000}, 
-    {0x43a20000}, {0x43a22000}, {0x43a24000}, {0x43a26000}, 
-    {0x43a28000}, {0x43a2a000}, {0x43a2c000}, {0x43a2e000}, 
-    {0x43a30000}, {0x43a32000}, {0x43a34000}, {0x43a36000}, 
-    {0x43a38000}, {0x43a3a000}, {0x43a3c000}, {0x43a3e000}, 
-    {0x43a40000}, {0x43a42000}, {0x43a44000}, {0x43a46000}, 
-    {0x43a48000}, {0x43a4a000}, {0x43a4c000}, {0x43a4e000}, 
-    {0x43a50000}, {0x43a52000}, {0x43a54000}, {0x43a56000}, 
-    {0x43a58000}, {0x43a5a000}, {0x43a5c000}, {0x43a5e000}, 
-    {0x43a60000}, {0x43a62000}, {0x43a64000}, {0x43a66000}, 
-    {0x43a68000}, {0x43a6a000}, {0x43a6c000}, {0x43a6e000}, 
-    {0x43a70000}, {0x43a72000}, {0x43a74000}, {0x43a76000}, 
-    {0x43a78000}, {0x43a7a000}, {0x43a7c000}, {0x43a7e000}, 
-    {0x43a80000}, {0x43a82000}, {0x43a84000}, {0x43a86000}, 
-    {0x43a88000}, {0x43a8a000}, {0x43a8c000}, {0x43a8e000}, 
-    {0x43a90000}, {0x43a92000}, {0x43a94000}, {0x43a96000}, 
-    {0x43a98000}, {0x43a9a000}, {0x43a9c000}, {0x43a9e000}, 
-    {0x43aa0000}, {0x43aa2000}, {0x43aa4000}, {0x43aa6000}, 
-    {0x43aa8000}, {0x43aaa000}, {0x43aac000}, {0x43aae000}, 
-    {0x43ab0000}, {0x43ab2000}, {0x43ab4000}, {0x43ab6000}, 
-    {0x43ab8000}, {0x43aba000}, {0x43abc000}, {0x43abe000}, 
-    {0x43ac0000}, {0x43ac2000}, {0x43ac4000}, {0x43ac6000}, 
-    {0x43ac8000}, {0x43aca000}, {0x43acc000}, {0x43ace000}, 
-    {0x43ad0000}, {0x43ad2000}, {0x43ad4000}, {0x43ad6000}, 
-    {0x43ad8000}, {0x43ada000}, {0x43adc000}, {0x43ade000}, 
-    {0x43ae0000}, {0x43ae2000}, {0x43ae4000}, {0x43ae6000}, 
-    {0x43ae8000}, {0x43aea000}, {0x43aec000}, {0x43aee000}, 
-    {0x43af0000}, {0x43af2000}, {0x43af4000}, {0x43af6000}, 
-    {0x43af8000}, {0x43afa000}, {0x43afc000}, {0x43afe000}, 
-    {0x43b00000}, {0x43b02000}, {0x43b04000}, {0x43b06000}, 
-    {0x43b08000}, {0x43b0a000}, {0x43b0c000}, {0x43b0e000}, 
-    {0x43b10000}, {0x43b12000}, {0x43b14000}, {0x43b16000}, 
-    {0x43b18000}, {0x43b1a000}, {0x43b1c000}, {0x43b1e000}, 
-    {0x43b20000}, {0x43b22000}, {0x43b24000}, {0x43b26000}, 
-    {0x43b28000}, {0x43b2a000}, {0x43b2c000}, {0x43b2e000}, 
-    {0x43b30000}, {0x43b32000}, {0x43b34000}, {0x43b36000}, 
-    {0x43b38000}, {0x43b3a000}, {0x43b3c000}, {0x43b3e000}, 
-    {0x43b40000}, {0x43b42000}, {0x43b44000}, {0x43b46000}, 
-    {0x43b48000}, {0x43b4a000}, {0x43b4c000}, {0x43b4e000}, 
-    {0x43b50000}, {0x43b52000}, {0x43b54000}, {0x43b56000}, 
-    {0x43b58000}, {0x43b5a000}, {0x43b5c000}, {0x43b5e000}, 
-    {0x43b60000}, {0x43b62000}, {0x43b64000}, {0x43b66000}, 
-    {0x43b68000}, {0x43b6a000}, {0x43b6c000}, {0x43b6e000}, 
-    {0x43b70000}, {0x43b72000}, {0x43b74000}, {0x43b76000}, 
-    {0x43b78000}, {0x43b7a000}, {0x43b7c000}, {0x43b7e000}, 
-    {0x43b80000}, {0x43b82000}, {0x43b84000}, {0x43b86000}, 
-    {0x43b88000}, {0x43b8a000}, {0x43b8c000}, {0x43b8e000}, 
-    {0x43b90000}, {0x43b92000}, {0x43b94000}, {0x43b96000}, 
-    {0x43b98000}, {0x43b9a000}, {0x43b9c000}, {0x43b9e000}, 
-    {0x43ba0000}, {0x43ba2000}, {0x43ba4000}, {0x43ba6000}, 
-    {0x43ba8000}, {0x43baa000}, {0x43bac000}, {0x43bae000}, 
-    {0x43bb0000}, {0x43bb2000}, {0x43bb4000}, {0x43bb6000}, 
-    {0x43bb8000}, {0x43bba000}, {0x43bbc000}, {0x43bbe000}, 
-    {0x43bc0000}, {0x43bc2000}, {0x43bc4000}, {0x43bc6000}, 
-    {0x43bc8000}, {0x43bca000}, {0x43bcc000}, {0x43bce000}, 
-    {0x43bd0000}, {0x43bd2000}, {0x43bd4000}, {0x43bd6000}, 
-    {0x43bd8000}, {0x43bda000}, {0x43bdc000}, {0x43bde000}, 
-    {0x43be0000}, {0x43be2000}, {0x43be4000}, {0x43be6000}, 
-    {0x43be8000}, {0x43bea000}, {0x43bec000}, {0x43bee000}, 
-    {0x43bf0000}, {0x43bf2000}, {0x43bf4000}, {0x43bf6000}, 
-    {0x43bf8000}, {0x43bfa000}, {0x43bfc000}, {0x43bfe000}, 
-    {0x43c00000}, {0x43c02000}, {0x43c04000}, {0x43c06000}, 
-    {0x43c08000}, {0x43c0a000}, {0x43c0c000}, {0x43c0e000}, 
-    {0x43c10000}, {0x43c12000}, {0x43c14000}, {0x43c16000}, 
-    {0x43c18000}, {0x43c1a000}, {0x43c1c000}, {0x43c1e000}, 
-    {0x43c20000}, {0x43c22000}, {0x43c24000}, {0x43c26000}, 
-    {0x43c28000}, {0x43c2a000}, {0x43c2c000}, {0x43c2e000}, 
-    {0x43c30000}, {0x43c32000}, {0x43c34000}, {0x43c36000}, 
-    {0x43c38000}, {0x43c3a000}, {0x43c3c000}, {0x43c3e000}, 
-    {0x43c40000}, {0x43c42000}, {0x43c44000}, {0x43c46000}, 
-    {0x43c48000}, {0x43c4a000}, {0x43c4c000}, {0x43c4e000}, 
-    {0x43c50000}, {0x43c52000}, {0x43c54000}, {0x43c56000}, 
-    {0x43c58000}, {0x43c5a000}, {0x43c5c000}, {0x43c5e000}, 
-    {0x43c60000}, {0x43c62000}, {0x43c64000}, {0x43c66000}, 
-    {0x43c68000}, {0x43c6a000}, {0x43c6c000}, {0x43c6e000}, 
-    {0x43c70000}, {0x43c72000}, {0x43c74000}, {0x43c76000}, 
-    {0x43c78000}, {0x43c7a000}, {0x43c7c000}, {0x43c7e000}, 
-    {0x43c80000}, {0x43c82000}, {0x43c84000}, {0x43c86000}, 
-    {0x43c88000}, {0x43c8a000}, {0x43c8c000}, {0x43c8e000}, 
-    {0x43c90000}, {0x43c92000}, {0x43c94000}, {0x43c96000}, 
-    {0x43c98000}, {0x43c9a000}, {0x43c9c000}, {0x43c9e000}, 
-    {0x43ca0000}, {0x43ca2000}, {0x43ca4000}, {0x43ca6000}, 
-    {0x43ca8000}, {0x43caa000}, {0x43cac000}, {0x43cae000}, 
-    {0x43cb0000}, {0x43cb2000}, {0x43cb4000}, {0x43cb6000}, 
-    {0x43cb8000}, {0x43cba000}, {0x43cbc000}, {0x43cbe000}, 
-    {0x43cc0000}, {0x43cc2000}, {0x43cc4000}, {0x43cc6000}, 
-    {0x43cc8000}, {0x43cca000}, {0x43ccc000}, {0x43cce000}, 
-    {0x43cd0000}, {0x43cd2000}, {0x43cd4000}, {0x43cd6000}, 
-    {0x43cd8000}, {0x43cda000}, {0x43cdc000}, {0x43cde000}, 
-    {0x43ce0000}, {0x43ce2000}, {0x43ce4000}, {0x43ce6000}, 
-    {0x43ce8000}, {0x43cea000}, {0x43cec000}, {0x43cee000}, 
-    {0x43cf0000}, {0x43cf2000}, {0x43cf4000}, {0x43cf6000}, 
-    {0x43cf8000}, {0x43cfa000}, {0x43cfc000}, {0x43cfe000}, 
-    {0x43d00000}, {0x43d02000}, {0x43d04000}, {0x43d06000}, 
-    {0x43d08000}, {0x43d0a000}, {0x43d0c000}, {0x43d0e000}, 
-    {0x43d10000}, {0x43d12000}, {0x43d14000}, {0x43d16000}, 
-    {0x43d18000}, {0x43d1a000}, {0x43d1c000}, {0x43d1e000}, 
-    {0x43d20000}, {0x43d22000}, {0x43d24000}, {0x43d26000}, 
-    {0x43d28000}, {0x43d2a000}, {0x43d2c000}, {0x43d2e000}, 
-    {0x43d30000}, {0x43d32000}, {0x43d34000}, {0x43d36000}, 
-    {0x43d38000}, {0x43d3a000}, {0x43d3c000}, {0x43d3e000}, 
-    {0x43d40000}, {0x43d42000}, {0x43d44000}, {0x43d46000}, 
-    {0x43d48000}, {0x43d4a000}, {0x43d4c000}, {0x43d4e000}, 
-    {0x43d50000}, {0x43d52000}, {0x43d54000}, {0x43d56000}, 
-    {0x43d58000}, {0x43d5a000}, {0x43d5c000}, {0x43d5e000}, 
-    {0x43d60000}, {0x43d62000}, {0x43d64000}, {0x43d66000}, 
-    {0x43d68000}, {0x43d6a000}, {0x43d6c000}, {0x43d6e000}, 
-    {0x43d70000}, {0x43d72000}, {0x43d74000}, {0x43d76000}, 
-    {0x43d78000}, {0x43d7a000}, {0x43d7c000}, {0x43d7e000}, 
-    {0x43d80000}, {0x43d82000}, {0x43d84000}, {0x43d86000}, 
-    {0x43d88000}, {0x43d8a000}, {0x43d8c000}, {0x43d8e000}, 
-    {0x43d90000}, {0x43d92000}, {0x43d94000}, {0x43d96000}, 
-    {0x43d98000}, {0x43d9a000}, {0x43d9c000}, {0x43d9e000}, 
-    {0x43da0000}, {0x43da2000}, {0x43da4000}, {0x43da6000}, 
-    {0x43da8000}, {0x43daa000}, {0x43dac000}, {0x43dae000}, 
-    {0x43db0000}, {0x43db2000}, {0x43db4000}, {0x43db6000}, 
-    {0x43db8000}, {0x43dba000}, {0x43dbc000}, {0x43dbe000}, 
-    {0x43dc0000}, {0x43dc2000}, {0x43dc4000}, {0x43dc6000}, 
-    {0x43dc8000}, {0x43dca000}, {0x43dcc000}, {0x43dce000}, 
-    {0x43dd0000}, {0x43dd2000}, {0x43dd4000}, {0x43dd6000}, 
-    {0x43dd8000}, {0x43dda000}, {0x43ddc000}, {0x43dde000}, 
-    {0x43de0000}, {0x43de2000}, {0x43de4000}, {0x43de6000}, 
-    {0x43de8000}, {0x43dea000}, {0x43dec000}, {0x43dee000}, 
-    {0x43df0000}, {0x43df2000}, {0x43df4000}, {0x43df6000}, 
-    {0x43df8000}, {0x43dfa000}, {0x43dfc000}, {0x43dfe000}, 
-    {0x43e00000}, {0x43e02000}, {0x43e04000}, {0x43e06000}, 
-    {0x43e08000}, {0x43e0a000}, {0x43e0c000}, {0x43e0e000}, 
-    {0x43e10000}, {0x43e12000}, {0x43e14000}, {0x43e16000}, 
-    {0x43e18000}, {0x43e1a000}, {0x43e1c000}, {0x43e1e000}, 
-    {0x43e20000}, {0x43e22000}, {0x43e24000}, {0x43e26000}, 
-    {0x43e28000}, {0x43e2a000}, {0x43e2c000}, {0x43e2e000}, 
-    {0x43e30000}, {0x43e32000}, {0x43e34000}, {0x43e36000}, 
-    {0x43e38000}, {0x43e3a000}, {0x43e3c000}, {0x43e3e000}, 
-    {0x43e40000}, {0x43e42000}, {0x43e44000}, {0x43e46000}, 
-    {0x43e48000}, {0x43e4a000}, {0x43e4c000}, {0x43e4e000}, 
-    {0x43e50000}, {0x43e52000}, {0x43e54000}, {0x43e56000}, 
-    {0x43e58000}, {0x43e5a000}, {0x43e5c000}, {0x43e5e000}, 
-    {0x43e60000}, {0x43e62000}, {0x43e64000}, {0x43e66000}, 
-    {0x43e68000}, {0x43e6a000}, {0x43e6c000}, {0x43e6e000}, 
-    {0x43e70000}, {0x43e72000}, {0x43e74000}, {0x43e76000}, 
-    {0x43e78000}, {0x43e7a000}, {0x43e7c000}, {0x43e7e000}, 
-    {0x43e80000}, {0x43e82000}, {0x43e84000}, {0x43e86000}, 
-    {0x43e88000}, {0x43e8a000}, {0x43e8c000}, {0x43e8e000}, 
-    {0x43e90000}, {0x43e92000}, {0x43e94000}, {0x43e96000}, 
-    {0x43e98000}, {0x43e9a000}, {0x43e9c000}, {0x43e9e000}, 
-    {0x43ea0000}, {0x43ea2000}, {0x43ea4000}, {0x43ea6000}, 
-    {0x43ea8000}, {0x43eaa000}, {0x43eac000}, {0x43eae000}, 
-    {0x43eb0000}, {0x43eb2000}, {0x43eb4000}, {0x43eb6000}, 
-    {0x43eb8000}, {0x43eba000}, {0x43ebc000}, {0x43ebe000}, 
-    {0x43ec0000}, {0x43ec2000}, {0x43ec4000}, {0x43ec6000}, 
-    {0x43ec8000}, {0x43eca000}, {0x43ecc000}, {0x43ece000}, 
-    {0x43ed0000}, {0x43ed2000}, {0x43ed4000}, {0x43ed6000}, 
-    {0x43ed8000}, {0x43eda000}, {0x43edc000}, {0x43ede000}, 
-    {0x43ee0000}, {0x43ee2000}, {0x43ee4000}, {0x43ee6000}, 
-    {0x43ee8000}, {0x43eea000}, {0x43eec000}, {0x43eee000}, 
-    {0x43ef0000}, {0x43ef2000}, {0x43ef4000}, {0x43ef6000}, 
-    {0x43ef8000}, {0x43efa000}, {0x43efc000}, {0x43efe000}, 
-    {0x43f00000}, {0x43f02000}, {0x43f04000}, {0x43f06000}, 
-    {0x43f08000}, {0x43f0a000}, {0x43f0c000}, {0x43f0e000}, 
-    {0x43f10000}, {0x43f12000}, {0x43f14000}, {0x43f16000}, 
-    {0x43f18000}, {0x43f1a000}, {0x43f1c000}, {0x43f1e000}, 
-    {0x43f20000}, {0x43f22000}, {0x43f24000}, {0x43f26000}, 
-    {0x43f28000}, {0x43f2a000}, {0x43f2c000}, {0x43f2e000}, 
-    {0x43f30000}, {0x43f32000}, {0x43f34000}, {0x43f36000}, 
-    {0x43f38000}, {0x43f3a000}, {0x43f3c000}, {0x43f3e000}, 
-    {0x43f40000}, {0x43f42000}, {0x43f44000}, {0x43f46000}, 
-    {0x43f48000}, {0x43f4a000}, {0x43f4c000}, {0x43f4e000}, 
-    {0x43f50000}, {0x43f52000}, {0x43f54000}, {0x43f56000}, 
-    {0x43f58000}, {0x43f5a000}, {0x43f5c000}, {0x43f5e000}, 
-    {0x43f60000}, {0x43f62000}, {0x43f64000}, {0x43f66000}, 
-    {0x43f68000}, {0x43f6a000}, {0x43f6c000}, {0x43f6e000}, 
-    {0x43f70000}, {0x43f72000}, {0x43f74000}, {0x43f76000}, 
-    {0x43f78000}, {0x43f7a000}, {0x43f7c000}, {0x43f7e000}, 
-    {0x43f80000}, {0x43f82000}, {0x43f84000}, {0x43f86000}, 
-    {0x43f88000}, {0x43f8a000}, {0x43f8c000}, {0x43f8e000}, 
-    {0x43f90000}, {0x43f92000}, {0x43f94000}, {0x43f96000}, 
-    {0x43f98000}, {0x43f9a000}, {0x43f9c000}, {0x43f9e000}, 
-    {0x43fa0000}, {0x43fa2000}, {0x43fa4000}, {0x43fa6000}, 
-    {0x43fa8000}, {0x43faa000}, {0x43fac000}, {0x43fae000}, 
-    {0x43fb0000}, {0x43fb2000}, {0x43fb4000}, {0x43fb6000}, 
-    {0x43fb8000}, {0x43fba000}, {0x43fbc000}, {0x43fbe000}, 
-    {0x43fc0000}, {0x43fc2000}, {0x43fc4000}, {0x43fc6000}, 
-    {0x43fc8000}, {0x43fca000}, {0x43fcc000}, {0x43fce000}, 
-    {0x43fd0000}, {0x43fd2000}, {0x43fd4000}, {0x43fd6000}, 
-    {0x43fd8000}, {0x43fda000}, {0x43fdc000}, {0x43fde000}, 
-    {0x43fe0000}, {0x43fe2000}, {0x43fe4000}, {0x43fe6000}, 
-    {0x43fe8000}, {0x43fea000}, {0x43fec000}, {0x43fee000}, 
-    {0x43ff0000}, {0x43ff2000}, {0x43ff4000}, {0x43ff6000}, 
-    {0x43ff8000}, {0x43ffa000}, {0x43ffc000}, {0x43ffe000}, 
-    {0x44000000}, {0x44002000}, {0x44004000}, {0x44006000}, 
-    {0x44008000}, {0x4400a000}, {0x4400c000}, {0x4400e000}, 
-    {0x44010000}, {0x44012000}, {0x44014000}, {0x44016000}, 
-    {0x44018000}, {0x4401a000}, {0x4401c000}, {0x4401e000}, 
-    {0x44020000}, {0x44022000}, {0x44024000}, {0x44026000}, 
-    {0x44028000}, {0x4402a000}, {0x4402c000}, {0x4402e000}, 
-    {0x44030000}, {0x44032000}, {0x44034000}, {0x44036000}, 
-    {0x44038000}, {0x4403a000}, {0x4403c000}, {0x4403e000}, 
-    {0x44040000}, {0x44042000}, {0x44044000}, {0x44046000}, 
-    {0x44048000}, {0x4404a000}, {0x4404c000}, {0x4404e000}, 
-    {0x44050000}, {0x44052000}, {0x44054000}, {0x44056000}, 
-    {0x44058000}, {0x4405a000}, {0x4405c000}, {0x4405e000}, 
-    {0x44060000}, {0x44062000}, {0x44064000}, {0x44066000}, 
-    {0x44068000}, {0x4406a000}, {0x4406c000}, {0x4406e000}, 
-    {0x44070000}, {0x44072000}, {0x44074000}, {0x44076000}, 
-    {0x44078000}, {0x4407a000}, {0x4407c000}, {0x4407e000}, 
-    {0x44080000}, {0x44082000}, {0x44084000}, {0x44086000}, 
-    {0x44088000}, {0x4408a000}, {0x4408c000}, {0x4408e000}, 
-    {0x44090000}, {0x44092000}, {0x44094000}, {0x44096000}, 
-    {0x44098000}, {0x4409a000}, {0x4409c000}, {0x4409e000}, 
-    {0x440a0000}, {0x440a2000}, {0x440a4000}, {0x440a6000}, 
-    {0x440a8000}, {0x440aa000}, {0x440ac000}, {0x440ae000}, 
-    {0x440b0000}, {0x440b2000}, {0x440b4000}, {0x440b6000}, 
-    {0x440b8000}, {0x440ba000}, {0x440bc000}, {0x440be000}, 
-    {0x440c0000}, {0x440c2000}, {0x440c4000}, {0x440c6000}, 
-    {0x440c8000}, {0x440ca000}, {0x440cc000}, {0x440ce000}, 
-    {0x440d0000}, {0x440d2000}, {0x440d4000}, {0x440d6000}, 
-    {0x440d8000}, {0x440da000}, {0x440dc000}, {0x440de000}, 
-    {0x440e0000}, {0x440e2000}, {0x440e4000}, {0x440e6000}, 
-    {0x440e8000}, {0x440ea000}, {0x440ec000}, {0x440ee000}, 
-    {0x440f0000}, {0x440f2000}, {0x440f4000}, {0x440f6000}, 
-    {0x440f8000}, {0x440fa000}, {0x440fc000}, {0x440fe000}, 
-    {0x44100000}, {0x44102000}, {0x44104000}, {0x44106000}, 
-    {0x44108000}, {0x4410a000}, {0x4410c000}, {0x4410e000}, 
-    {0x44110000}, {0x44112000}, {0x44114000}, {0x44116000}, 
-    {0x44118000}, {0x4411a000}, {0x4411c000}, {0x4411e000}, 
-    {0x44120000}, {0x44122000}, {0x44124000}, {0x44126000}, 
-    {0x44128000}, {0x4412a000}, {0x4412c000}, {0x4412e000}, 
-    {0x44130000}, {0x44132000}, {0x44134000}, {0x44136000}, 
-    {0x44138000}, {0x4413a000}, {0x4413c000}, {0x4413e000}, 
-    {0x44140000}, {0x44142000}, {0x44144000}, {0x44146000}, 
-    {0x44148000}, {0x4414a000}, {0x4414c000}, {0x4414e000}, 
-    {0x44150000}, {0x44152000}, {0x44154000}, {0x44156000}, 
-    {0x44158000}, {0x4415a000}, {0x4415c000}, {0x4415e000}, 
-    {0x44160000}, {0x44162000}, {0x44164000}, {0x44166000}, 
-    {0x44168000}, {0x4416a000}, {0x4416c000}, {0x4416e000}, 
-    {0x44170000}, {0x44172000}, {0x44174000}, {0x44176000}, 
-    {0x44178000}, {0x4417a000}, {0x4417c000}, {0x4417e000}, 
-    {0x44180000}, {0x44182000}, {0x44184000}, {0x44186000}, 
-    {0x44188000}, {0x4418a000}, {0x4418c000}, {0x4418e000}, 
-    {0x44190000}, {0x44192000}, {0x44194000}, {0x44196000}, 
-    {0x44198000}, {0x4419a000}, {0x4419c000}, {0x4419e000}, 
-    {0x441a0000}, {0x441a2000}, {0x441a4000}, {0x441a6000}, 
-    {0x441a8000}, {0x441aa000}, {0x441ac000}, {0x441ae000}, 
-    {0x441b0000}, {0x441b2000}, {0x441b4000}, {0x441b6000}, 
-    {0x441b8000}, {0x441ba000}, {0x441bc000}, {0x441be000}, 
-    {0x441c0000}, {0x441c2000}, {0x441c4000}, {0x441c6000}, 
-    {0x441c8000}, {0x441ca000}, {0x441cc000}, {0x441ce000}, 
-    {0x441d0000}, {0x441d2000}, {0x441d4000}, {0x441d6000}, 
-    {0x441d8000}, {0x441da000}, {0x441dc000}, {0x441de000}, 
-    {0x441e0000}, {0x441e2000}, {0x441e4000}, {0x441e6000}, 
-    {0x441e8000}, {0x441ea000}, {0x441ec000}, {0x441ee000}, 
-    {0x441f0000}, {0x441f2000}, {0x441f4000}, {0x441f6000}, 
-    {0x441f8000}, {0x441fa000}, {0x441fc000}, {0x441fe000}, 
-    {0x44200000}, {0x44202000}, {0x44204000}, {0x44206000}, 
-    {0x44208000}, {0x4420a000}, {0x4420c000}, {0x4420e000}, 
-    {0x44210000}, {0x44212000}, {0x44214000}, {0x44216000}, 
-    {0x44218000}, {0x4421a000}, {0x4421c000}, {0x4421e000}, 
-    {0x44220000}, {0x44222000}, {0x44224000}, {0x44226000}, 
-    {0x44228000}, {0x4422a000}, {0x4422c000}, {0x4422e000}, 
-    {0x44230000}, {0x44232000}, {0x44234000}, {0x44236000}, 
-    {0x44238000}, {0x4423a000}, {0x4423c000}, {0x4423e000}, 
-    {0x44240000}, {0x44242000}, {0x44244000}, {0x44246000}, 
-    {0x44248000}, {0x4424a000}, {0x4424c000}, {0x4424e000}, 
-    {0x44250000}, {0x44252000}, {0x44254000}, {0x44256000}, 
-    {0x44258000}, {0x4425a000}, {0x4425c000}, {0x4425e000}, 
-    {0x44260000}, {0x44262000}, {0x44264000}, {0x44266000}, 
-    {0x44268000}, {0x4426a000}, {0x4426c000}, {0x4426e000}, 
-    {0x44270000}, {0x44272000}, {0x44274000}, {0x44276000}, 
-    {0x44278000}, {0x4427a000}, {0x4427c000}, {0x4427e000}, 
-    {0x44280000}, {0x44282000}, {0x44284000}, {0x44286000}, 
-    {0x44288000}, {0x4428a000}, {0x4428c000}, {0x4428e000}, 
-    {0x44290000}, {0x44292000}, {0x44294000}, {0x44296000}, 
-    {0x44298000}, {0x4429a000}, {0x4429c000}, {0x4429e000}, 
-    {0x442a0000}, {0x442a2000}, {0x442a4000}, {0x442a6000}, 
-    {0x442a8000}, {0x442aa000}, {0x442ac000}, {0x442ae000}, 
-    {0x442b0000}, {0x442b2000}, {0x442b4000}, {0x442b6000}, 
-    {0x442b8000}, {0x442ba000}, {0x442bc000}, {0x442be000}, 
-    {0x442c0000}, {0x442c2000}, {0x442c4000}, {0x442c6000}, 
-    {0x442c8000}, {0x442ca000}, {0x442cc000}, {0x442ce000}, 
-    {0x442d0000}, {0x442d2000}, {0x442d4000}, {0x442d6000}, 
-    {0x442d8000}, {0x442da000}, {0x442dc000}, {0x442de000}, 
-    {0x442e0000}, {0x442e2000}, {0x442e4000}, {0x442e6000}, 
-    {0x442e8000}, {0x442ea000}, {0x442ec000}, {0x442ee000}, 
-    {0x442f0000}, {0x442f2000}, {0x442f4000}, {0x442f6000}, 
-    {0x442f8000}, {0x442fa000}, {0x442fc000}, {0x442fe000}, 
-    {0x44300000}, {0x44302000}, {0x44304000}, {0x44306000}, 
-    {0x44308000}, {0x4430a000}, {0x4430c000}, {0x4430e000}, 
-    {0x44310000}, {0x44312000}, {0x44314000}, {0x44316000}, 
-    {0x44318000}, {0x4431a000}, {0x4431c000}, {0x4431e000}, 
-    {0x44320000}, {0x44322000}, {0x44324000}, {0x44326000}, 
-    {0x44328000}, {0x4432a000}, {0x4432c000}, {0x4432e000}, 
-    {0x44330000}, {0x44332000}, {0x44334000}, {0x44336000}, 
-    {0x44338000}, {0x4433a000}, {0x4433c000}, {0x4433e000}, 
-    {0x44340000}, {0x44342000}, {0x44344000}, {0x44346000}, 
-    {0x44348000}, {0x4434a000}, {0x4434c000}, {0x4434e000}, 
-    {0x44350000}, {0x44352000}, {0x44354000}, {0x44356000}, 
-    {0x44358000}, {0x4435a000}, {0x4435c000}, {0x4435e000}, 
-    {0x44360000}, {0x44362000}, {0x44364000}, {0x44366000}, 
-    {0x44368000}, {0x4436a000}, {0x4436c000}, {0x4436e000}, 
-    {0x44370000}, {0x44372000}, {0x44374000}, {0x44376000}, 
-    {0x44378000}, {0x4437a000}, {0x4437c000}, {0x4437e000}, 
-    {0x44380000}, {0x44382000}, {0x44384000}, {0x44386000}, 
-    {0x44388000}, {0x4438a000}, {0x4438c000}, {0x4438e000}, 
-    {0x44390000}, {0x44392000}, {0x44394000}, {0x44396000}, 
-    {0x44398000}, {0x4439a000}, {0x4439c000}, {0x4439e000}, 
-    {0x443a0000}, {0x443a2000}, {0x443a4000}, {0x443a6000}, 
-    {0x443a8000}, {0x443aa000}, {0x443ac000}, {0x443ae000}, 
-    {0x443b0000}, {0x443b2000}, {0x443b4000}, {0x443b6000}, 
-    {0x443b8000}, {0x443ba000}, {0x443bc000}, {0x443be000}, 
-    {0x443c0000}, {0x443c2000}, {0x443c4000}, {0x443c6000}, 
-    {0x443c8000}, {0x443ca000}, {0x443cc000}, {0x443ce000}, 
-    {0x443d0000}, {0x443d2000}, {0x443d4000}, {0x443d6000}, 
-    {0x443d8000}, {0x443da000}, {0x443dc000}, {0x443de000}, 
-    {0x443e0000}, {0x443e2000}, {0x443e4000}, {0x443e6000}, 
-    {0x443e8000}, {0x443ea000}, {0x443ec000}, {0x443ee000}, 
-    {0x443f0000}, {0x443f2000}, {0x443f4000}, {0x443f6000}, 
-    {0x443f8000}, {0x443fa000}, {0x443fc000}, {0x443fe000}, 
-    {0x44400000}, {0x44402000}, {0x44404000}, {0x44406000}, 
-    {0x44408000}, {0x4440a000}, {0x4440c000}, {0x4440e000}, 
-    {0x44410000}, {0x44412000}, {0x44414000}, {0x44416000}, 
-    {0x44418000}, {0x4441a000}, {0x4441c000}, {0x4441e000}, 
-    {0x44420000}, {0x44422000}, {0x44424000}, {0x44426000}, 
-    {0x44428000}, {0x4442a000}, {0x4442c000}, {0x4442e000}, 
-    {0x44430000}, {0x44432000}, {0x44434000}, {0x44436000}, 
-    {0x44438000}, {0x4443a000}, {0x4443c000}, {0x4443e000}, 
-    {0x44440000}, {0x44442000}, {0x44444000}, {0x44446000}, 
-    {0x44448000}, {0x4444a000}, {0x4444c000}, {0x4444e000}, 
-    {0x44450000}, {0x44452000}, {0x44454000}, {0x44456000}, 
-    {0x44458000}, {0x4445a000}, {0x4445c000}, {0x4445e000}, 
-    {0x44460000}, {0x44462000}, {0x44464000}, {0x44466000}, 
-    {0x44468000}, {0x4446a000}, {0x4446c000}, {0x4446e000}, 
-    {0x44470000}, {0x44472000}, {0x44474000}, {0x44476000}, 
-    {0x44478000}, {0x4447a000}, {0x4447c000}, {0x4447e000}, 
-    {0x44480000}, {0x44482000}, {0x44484000}, {0x44486000}, 
-    {0x44488000}, {0x4448a000}, {0x4448c000}, {0x4448e000}, 
-    {0x44490000}, {0x44492000}, {0x44494000}, {0x44496000}, 
-    {0x44498000}, {0x4449a000}, {0x4449c000}, {0x4449e000}, 
-    {0x444a0000}, {0x444a2000}, {0x444a4000}, {0x444a6000}, 
-    {0x444a8000}, {0x444aa000}, {0x444ac000}, {0x444ae000}, 
-    {0x444b0000}, {0x444b2000}, {0x444b4000}, {0x444b6000}, 
-    {0x444b8000}, {0x444ba000}, {0x444bc000}, {0x444be000}, 
-    {0x444c0000}, {0x444c2000}, {0x444c4000}, {0x444c6000}, 
-    {0x444c8000}, {0x444ca000}, {0x444cc000}, {0x444ce000}, 
-    {0x444d0000}, {0x444d2000}, {0x444d4000}, {0x444d6000}, 
-    {0x444d8000}, {0x444da000}, {0x444dc000}, {0x444de000}, 
-    {0x444e0000}, {0x444e2000}, {0x444e4000}, {0x444e6000}, 
-    {0x444e8000}, {0x444ea000}, {0x444ec000}, {0x444ee000}, 
-    {0x444f0000}, {0x444f2000}, {0x444f4000}, {0x444f6000}, 
-    {0x444f8000}, {0x444fa000}, {0x444fc000}, {0x444fe000}, 
-    {0x44500000}, {0x44502000}, {0x44504000}, {0x44506000}, 
-    {0x44508000}, {0x4450a000}, {0x4450c000}, {0x4450e000}, 
-    {0x44510000}, {0x44512000}, {0x44514000}, {0x44516000}, 
-    {0x44518000}, {0x4451a000}, {0x4451c000}, {0x4451e000}, 
-    {0x44520000}, {0x44522000}, {0x44524000}, {0x44526000}, 
-    {0x44528000}, {0x4452a000}, {0x4452c000}, {0x4452e000}, 
-    {0x44530000}, {0x44532000}, {0x44534000}, {0x44536000}, 
-    {0x44538000}, {0x4453a000}, {0x4453c000}, {0x4453e000}, 
-    {0x44540000}, {0x44542000}, {0x44544000}, {0x44546000}, 
-    {0x44548000}, {0x4454a000}, {0x4454c000}, {0x4454e000}, 
-    {0x44550000}, {0x44552000}, {0x44554000}, {0x44556000}, 
-    {0x44558000}, {0x4455a000}, {0x4455c000}, {0x4455e000}, 
-    {0x44560000}, {0x44562000}, {0x44564000}, {0x44566000}, 
-    {0x44568000}, {0x4456a000}, {0x4456c000}, {0x4456e000}, 
-    {0x44570000}, {0x44572000}, {0x44574000}, {0x44576000}, 
-    {0x44578000}, {0x4457a000}, {0x4457c000}, {0x4457e000}, 
-    {0x44580000}, {0x44582000}, {0x44584000}, {0x44586000}, 
-    {0x44588000}, {0x4458a000}, {0x4458c000}, {0x4458e000}, 
-    {0x44590000}, {0x44592000}, {0x44594000}, {0x44596000}, 
-    {0x44598000}, {0x4459a000}, {0x4459c000}, {0x4459e000}, 
-    {0x445a0000}, {0x445a2000}, {0x445a4000}, {0x445a6000}, 
-    {0x445a8000}, {0x445aa000}, {0x445ac000}, {0x445ae000}, 
-    {0x445b0000}, {0x445b2000}, {0x445b4000}, {0x445b6000}, 
-    {0x445b8000}, {0x445ba000}, {0x445bc000}, {0x445be000}, 
-    {0x445c0000}, {0x445c2000}, {0x445c4000}, {0x445c6000}, 
-    {0x445c8000}, {0x445ca000}, {0x445cc000}, {0x445ce000}, 
-    {0x445d0000}, {0x445d2000}, {0x445d4000}, {0x445d6000}, 
-    {0x445d8000}, {0x445da000}, {0x445dc000}, {0x445de000}, 
-    {0x445e0000}, {0x445e2000}, {0x445e4000}, {0x445e6000}, 
-    {0x445e8000}, {0x445ea000}, {0x445ec000}, {0x445ee000}, 
-    {0x445f0000}, {0x445f2000}, {0x445f4000}, {0x445f6000}, 
-    {0x445f8000}, {0x445fa000}, {0x445fc000}, {0x445fe000}, 
-    {0x44600000}, {0x44602000}, {0x44604000}, {0x44606000}, 
-    {0x44608000}, {0x4460a000}, {0x4460c000}, {0x4460e000}, 
-    {0x44610000}, {0x44612000}, {0x44614000}, {0x44616000}, 
-    {0x44618000}, {0x4461a000}, {0x4461c000}, {0x4461e000}, 
-    {0x44620000}, {0x44622000}, {0x44624000}, {0x44626000}, 
-    {0x44628000}, {0x4462a000}, {0x4462c000}, {0x4462e000}, 
-    {0x44630000}, {0x44632000}, {0x44634000}, {0x44636000}, 
-    {0x44638000}, {0x4463a000}, {0x4463c000}, {0x4463e000}, 
-    {0x44640000}, {0x44642000}, {0x44644000}, {0x44646000}, 
-    {0x44648000}, {0x4464a000}, {0x4464c000}, {0x4464e000}, 
-    {0x44650000}, {0x44652000}, {0x44654000}, {0x44656000}, 
-    {0x44658000}, {0x4465a000}, {0x4465c000}, {0x4465e000}, 
-    {0x44660000}, {0x44662000}, {0x44664000}, {0x44666000}, 
-    {0x44668000}, {0x4466a000}, {0x4466c000}, {0x4466e000}, 
-    {0x44670000}, {0x44672000}, {0x44674000}, {0x44676000}, 
-    {0x44678000}, {0x4467a000}, {0x4467c000}, {0x4467e000}, 
-    {0x44680000}, {0x44682000}, {0x44684000}, {0x44686000}, 
-    {0x44688000}, {0x4468a000}, {0x4468c000}, {0x4468e000}, 
-    {0x44690000}, {0x44692000}, {0x44694000}, {0x44696000}, 
-    {0x44698000}, {0x4469a000}, {0x4469c000}, {0x4469e000}, 
-    {0x446a0000}, {0x446a2000}, {0x446a4000}, {0x446a6000}, 
-    {0x446a8000}, {0x446aa000}, {0x446ac000}, {0x446ae000}, 
-    {0x446b0000}, {0x446b2000}, {0x446b4000}, {0x446b6000}, 
-    {0x446b8000}, {0x446ba000}, {0x446bc000}, {0x446be000}, 
-    {0x446c0000}, {0x446c2000}, {0x446c4000}, {0x446c6000}, 
-    {0x446c8000}, {0x446ca000}, {0x446cc000}, {0x446ce000}, 
-    {0x446d0000}, {0x446d2000}, {0x446d4000}, {0x446d6000}, 
-    {0x446d8000}, {0x446da000}, {0x446dc000}, {0x446de000}, 
-    {0x446e0000}, {0x446e2000}, {0x446e4000}, {0x446e6000}, 
-    {0x446e8000}, {0x446ea000}, {0x446ec000}, {0x446ee000}, 
-    {0x446f0000}, {0x446f2000}, {0x446f4000}, {0x446f6000}, 
-    {0x446f8000}, {0x446fa000}, {0x446fc000}, {0x446fe000}, 
-    {0x44700000}, {0x44702000}, {0x44704000}, {0x44706000}, 
-    {0x44708000}, {0x4470a000}, {0x4470c000}, {0x4470e000}, 
-    {0x44710000}, {0x44712000}, {0x44714000}, {0x44716000}, 
-    {0x44718000}, {0x4471a000}, {0x4471c000}, {0x4471e000}, 
-    {0x44720000}, {0x44722000}, {0x44724000}, {0x44726000}, 
-    {0x44728000}, {0x4472a000}, {0x4472c000}, {0x4472e000}, 
-    {0x44730000}, {0x44732000}, {0x44734000}, {0x44736000}, 
-    {0x44738000}, {0x4473a000}, {0x4473c000}, {0x4473e000}, 
-    {0x44740000}, {0x44742000}, {0x44744000}, {0x44746000}, 
-    {0x44748000}, {0x4474a000}, {0x4474c000}, {0x4474e000}, 
-    {0x44750000}, {0x44752000}, {0x44754000}, {0x44756000}, 
-    {0x44758000}, {0x4475a000}, {0x4475c000}, {0x4475e000}, 
-    {0x44760000}, {0x44762000}, {0x44764000}, {0x44766000}, 
-    {0x44768000}, {0x4476a000}, {0x4476c000}, {0x4476e000}, 
-    {0x44770000}, {0x44772000}, {0x44774000}, {0x44776000}, 
-    {0x44778000}, {0x4477a000}, {0x4477c000}, {0x4477e000}, 
-    {0x44780000}, {0x44782000}, {0x44784000}, {0x44786000}, 
-    {0x44788000}, {0x4478a000}, {0x4478c000}, {0x4478e000}, 
-    {0x44790000}, {0x44792000}, {0x44794000}, {0x44796000}, 
-    {0x44798000}, {0x4479a000}, {0x4479c000}, {0x4479e000}, 
-    {0x447a0000}, {0x447a2000}, {0x447a4000}, {0x447a6000}, 
-    {0x447a8000}, {0x447aa000}, {0x447ac000}, {0x447ae000}, 
-    {0x447b0000}, {0x447b2000}, {0x447b4000}, {0x447b6000}, 
-    {0x447b8000}, {0x447ba000}, {0x447bc000}, {0x447be000}, 
-    {0x447c0000}, {0x447c2000}, {0x447c4000}, {0x447c6000}, 
-    {0x447c8000}, {0x447ca000}, {0x447cc000}, {0x447ce000}, 
-    {0x447d0000}, {0x447d2000}, {0x447d4000}, {0x447d6000}, 
-    {0x447d8000}, {0x447da000}, {0x447dc000}, {0x447de000}, 
-    {0x447e0000}, {0x447e2000}, {0x447e4000}, {0x447e6000}, 
-    {0x447e8000}, {0x447ea000}, {0x447ec000}, {0x447ee000}, 
-    {0x447f0000}, {0x447f2000}, {0x447f4000}, {0x447f6000}, 
-    {0x447f8000}, {0x447fa000}, {0x447fc000}, {0x447fe000}, 
-    {0x44800000}, {0x44802000}, {0x44804000}, {0x44806000}, 
-    {0x44808000}, {0x4480a000}, {0x4480c000}, {0x4480e000}, 
-    {0x44810000}, {0x44812000}, {0x44814000}, {0x44816000}, 
-    {0x44818000}, {0x4481a000}, {0x4481c000}, {0x4481e000}, 
-    {0x44820000}, {0x44822000}, {0x44824000}, {0x44826000}, 
-    {0x44828000}, {0x4482a000}, {0x4482c000}, {0x4482e000}, 
-    {0x44830000}, {0x44832000}, {0x44834000}, {0x44836000}, 
-    {0x44838000}, {0x4483a000}, {0x4483c000}, {0x4483e000}, 
-    {0x44840000}, {0x44842000}, {0x44844000}, {0x44846000}, 
-    {0x44848000}, {0x4484a000}, {0x4484c000}, {0x4484e000}, 
-    {0x44850000}, {0x44852000}, {0x44854000}, {0x44856000}, 
-    {0x44858000}, {0x4485a000}, {0x4485c000}, {0x4485e000}, 
-    {0x44860000}, {0x44862000}, {0x44864000}, {0x44866000}, 
-    {0x44868000}, {0x4486a000}, {0x4486c000}, {0x4486e000}, 
-    {0x44870000}, {0x44872000}, {0x44874000}, {0x44876000}, 
-    {0x44878000}, {0x4487a000}, {0x4487c000}, {0x4487e000}, 
-    {0x44880000}, {0x44882000}, {0x44884000}, {0x44886000}, 
-    {0x44888000}, {0x4488a000}, {0x4488c000}, {0x4488e000}, 
-    {0x44890000}, {0x44892000}, {0x44894000}, {0x44896000}, 
-    {0x44898000}, {0x4489a000}, {0x4489c000}, {0x4489e000}, 
-    {0x448a0000}, {0x448a2000}, {0x448a4000}, {0x448a6000}, 
-    {0x448a8000}, {0x448aa000}, {0x448ac000}, {0x448ae000}, 
-    {0x448b0000}, {0x448b2000}, {0x448b4000}, {0x448b6000}, 
-    {0x448b8000}, {0x448ba000}, {0x448bc000}, {0x448be000}, 
-    {0x448c0000}, {0x448c2000}, {0x448c4000}, {0x448c6000}, 
-    {0x448c8000}, {0x448ca000}, {0x448cc000}, {0x448ce000}, 
-    {0x448d0000}, {0x448d2000}, {0x448d4000}, {0x448d6000}, 
-    {0x448d8000}, {0x448da000}, {0x448dc000}, {0x448de000}, 
-    {0x448e0000}, {0x448e2000}, {0x448e4000}, {0x448e6000}, 
-    {0x448e8000}, {0x448ea000}, {0x448ec000}, {0x448ee000}, 
-    {0x448f0000}, {0x448f2000}, {0x448f4000}, {0x448f6000}, 
-    {0x448f8000}, {0x448fa000}, {0x448fc000}, {0x448fe000}, 
-    {0x44900000}, {0x44902000}, {0x44904000}, {0x44906000}, 
-    {0x44908000}, {0x4490a000}, {0x4490c000}, {0x4490e000}, 
-    {0x44910000}, {0x44912000}, {0x44914000}, {0x44916000}, 
-    {0x44918000}, {0x4491a000}, {0x4491c000}, {0x4491e000}, 
-    {0x44920000}, {0x44922000}, {0x44924000}, {0x44926000}, 
-    {0x44928000}, {0x4492a000}, {0x4492c000}, {0x4492e000}, 
-    {0x44930000}, {0x44932000}, {0x44934000}, {0x44936000}, 
-    {0x44938000}, {0x4493a000}, {0x4493c000}, {0x4493e000}, 
-    {0x44940000}, {0x44942000}, {0x44944000}, {0x44946000}, 
-    {0x44948000}, {0x4494a000}, {0x4494c000}, {0x4494e000}, 
-    {0x44950000}, {0x44952000}, {0x44954000}, {0x44956000}, 
-    {0x44958000}, {0x4495a000}, {0x4495c000}, {0x4495e000}, 
-    {0x44960000}, {0x44962000}, {0x44964000}, {0x44966000}, 
-    {0x44968000}, {0x4496a000}, {0x4496c000}, {0x4496e000}, 
-    {0x44970000}, {0x44972000}, {0x44974000}, {0x44976000}, 
-    {0x44978000}, {0x4497a000}, {0x4497c000}, {0x4497e000}, 
-    {0x44980000}, {0x44982000}, {0x44984000}, {0x44986000}, 
-    {0x44988000}, {0x4498a000}, {0x4498c000}, {0x4498e000}, 
-    {0x44990000}, {0x44992000}, {0x44994000}, {0x44996000}, 
-    {0x44998000}, {0x4499a000}, {0x4499c000}, {0x4499e000}, 
-    {0x449a0000}, {0x449a2000}, {0x449a4000}, {0x449a6000}, 
-    {0x449a8000}, {0x449aa000}, {0x449ac000}, {0x449ae000}, 
-    {0x449b0000}, {0x449b2000}, {0x449b4000}, {0x449b6000}, 
-    {0x449b8000}, {0x449ba000}, {0x449bc000}, {0x449be000}, 
-    {0x449c0000}, {0x449c2000}, {0x449c4000}, {0x449c6000}, 
-    {0x449c8000}, {0x449ca000}, {0x449cc000}, {0x449ce000}, 
-    {0x449d0000}, {0x449d2000}, {0x449d4000}, {0x449d6000}, 
-    {0x449d8000}, {0x449da000}, {0x449dc000}, {0x449de000}, 
-    {0x449e0000}, {0x449e2000}, {0x449e4000}, {0x449e6000}, 
-    {0x449e8000}, {0x449ea000}, {0x449ec000}, {0x449ee000}, 
-    {0x449f0000}, {0x449f2000}, {0x449f4000}, {0x449f6000}, 
-    {0x449f8000}, {0x449fa000}, {0x449fc000}, {0x449fe000}, 
-    {0x44a00000}, {0x44a02000}, {0x44a04000}, {0x44a06000}, 
-    {0x44a08000}, {0x44a0a000}, {0x44a0c000}, {0x44a0e000}, 
-    {0x44a10000}, {0x44a12000}, {0x44a14000}, {0x44a16000}, 
-    {0x44a18000}, {0x44a1a000}, {0x44a1c000}, {0x44a1e000}, 
-    {0x44a20000}, {0x44a22000}, {0x44a24000}, {0x44a26000}, 
-    {0x44a28000}, {0x44a2a000}, {0x44a2c000}, {0x44a2e000}, 
-    {0x44a30000}, {0x44a32000}, {0x44a34000}, {0x44a36000}, 
-    {0x44a38000}, {0x44a3a000}, {0x44a3c000}, {0x44a3e000}, 
-    {0x44a40000}, {0x44a42000}, {0x44a44000}, {0x44a46000}, 
-    {0x44a48000}, {0x44a4a000}, {0x44a4c000}, {0x44a4e000}, 
-    {0x44a50000}, {0x44a52000}, {0x44a54000}, {0x44a56000}, 
-    {0x44a58000}, {0x44a5a000}, {0x44a5c000}, {0x44a5e000}, 
-    {0x44a60000}, {0x44a62000}, {0x44a64000}, {0x44a66000}, 
-    {0x44a68000}, {0x44a6a000}, {0x44a6c000}, {0x44a6e000}, 
-    {0x44a70000}, {0x44a72000}, {0x44a74000}, {0x44a76000}, 
-    {0x44a78000}, {0x44a7a000}, {0x44a7c000}, {0x44a7e000}, 
-    {0x44a80000}, {0x44a82000}, {0x44a84000}, {0x44a86000}, 
-    {0x44a88000}, {0x44a8a000}, {0x44a8c000}, {0x44a8e000}, 
-    {0x44a90000}, {0x44a92000}, {0x44a94000}, {0x44a96000}, 
-    {0x44a98000}, {0x44a9a000}, {0x44a9c000}, {0x44a9e000}, 
-    {0x44aa0000}, {0x44aa2000}, {0x44aa4000}, {0x44aa6000}, 
-    {0x44aa8000}, {0x44aaa000}, {0x44aac000}, {0x44aae000}, 
-    {0x44ab0000}, {0x44ab2000}, {0x44ab4000}, {0x44ab6000}, 
-    {0x44ab8000}, {0x44aba000}, {0x44abc000}, {0x44abe000}, 
-    {0x44ac0000}, {0x44ac2000}, {0x44ac4000}, {0x44ac6000}, 
-    {0x44ac8000}, {0x44aca000}, {0x44acc000}, {0x44ace000}, 
-    {0x44ad0000}, {0x44ad2000}, {0x44ad4000}, {0x44ad6000}, 
-    {0x44ad8000}, {0x44ada000}, {0x44adc000}, {0x44ade000}, 
-    {0x44ae0000}, {0x44ae2000}, {0x44ae4000}, {0x44ae6000}, 
-    {0x44ae8000}, {0x44aea000}, {0x44aec000}, {0x44aee000}, 
-    {0x44af0000}, {0x44af2000}, {0x44af4000}, {0x44af6000}, 
-    {0x44af8000}, {0x44afa000}, {0x44afc000}, {0x44afe000}, 
-    {0x44b00000}, {0x44b02000}, {0x44b04000}, {0x44b06000}, 
-    {0x44b08000}, {0x44b0a000}, {0x44b0c000}, {0x44b0e000}, 
-    {0x44b10000}, {0x44b12000}, {0x44b14000}, {0x44b16000}, 
-    {0x44b18000}, {0x44b1a000}, {0x44b1c000}, {0x44b1e000}, 
-    {0x44b20000}, {0x44b22000}, {0x44b24000}, {0x44b26000}, 
-    {0x44b28000}, {0x44b2a000}, {0x44b2c000}, {0x44b2e000}, 
-    {0x44b30000}, {0x44b32000}, {0x44b34000}, {0x44b36000}, 
-    {0x44b38000}, {0x44b3a000}, {0x44b3c000}, {0x44b3e000}, 
-    {0x44b40000}, {0x44b42000}, {0x44b44000}, {0x44b46000}, 
-    {0x44b48000}, {0x44b4a000}, {0x44b4c000}, {0x44b4e000}, 
-    {0x44b50000}, {0x44b52000}, {0x44b54000}, {0x44b56000}, 
-    {0x44b58000}, {0x44b5a000}, {0x44b5c000}, {0x44b5e000}, 
-    {0x44b60000}, {0x44b62000}, {0x44b64000}, {0x44b66000}, 
-    {0x44b68000}, {0x44b6a000}, {0x44b6c000}, {0x44b6e000}, 
-    {0x44b70000}, {0x44b72000}, {0x44b74000}, {0x44b76000}, 
-    {0x44b78000}, {0x44b7a000}, {0x44b7c000}, {0x44b7e000}, 
-    {0x44b80000}, {0x44b82000}, {0x44b84000}, {0x44b86000}, 
-    {0x44b88000}, {0x44b8a000}, {0x44b8c000}, {0x44b8e000}, 
-    {0x44b90000}, {0x44b92000}, {0x44b94000}, {0x44b96000}, 
-    {0x44b98000}, {0x44b9a000}, {0x44b9c000}, {0x44b9e000}, 
-    {0x44ba0000}, {0x44ba2000}, {0x44ba4000}, {0x44ba6000}, 
-    {0x44ba8000}, {0x44baa000}, {0x44bac000}, {0x44bae000}, 
-    {0x44bb0000}, {0x44bb2000}, {0x44bb4000}, {0x44bb6000}, 
-    {0x44bb8000}, {0x44bba000}, {0x44bbc000}, {0x44bbe000}, 
-    {0x44bc0000}, {0x44bc2000}, {0x44bc4000}, {0x44bc6000}, 
-    {0x44bc8000}, {0x44bca000}, {0x44bcc000}, {0x44bce000}, 
-    {0x44bd0000}, {0x44bd2000}, {0x44bd4000}, {0x44bd6000}, 
-    {0x44bd8000}, {0x44bda000}, {0x44bdc000}, {0x44bde000}, 
-    {0x44be0000}, {0x44be2000}, {0x44be4000}, {0x44be6000}, 
-    {0x44be8000}, {0x44bea000}, {0x44bec000}, {0x44bee000}, 
-    {0x44bf0000}, {0x44bf2000}, {0x44bf4000}, {0x44bf6000}, 
-    {0x44bf8000}, {0x44bfa000}, {0x44bfc000}, {0x44bfe000}, 
-    {0x44c00000}, {0x44c02000}, {0x44c04000}, {0x44c06000}, 
-    {0x44c08000}, {0x44c0a000}, {0x44c0c000}, {0x44c0e000}, 
-    {0x44c10000}, {0x44c12000}, {0x44c14000}, {0x44c16000}, 
-    {0x44c18000}, {0x44c1a000}, {0x44c1c000}, {0x44c1e000}, 
-    {0x44c20000}, {0x44c22000}, {0x44c24000}, {0x44c26000}, 
-    {0x44c28000}, {0x44c2a000}, {0x44c2c000}, {0x44c2e000}, 
-    {0x44c30000}, {0x44c32000}, {0x44c34000}, {0x44c36000}, 
-    {0x44c38000}, {0x44c3a000}, {0x44c3c000}, {0x44c3e000}, 
-    {0x44c40000}, {0x44c42000}, {0x44c44000}, {0x44c46000}, 
-    {0x44c48000}, {0x44c4a000}, {0x44c4c000}, {0x44c4e000}, 
-    {0x44c50000}, {0x44c52000}, {0x44c54000}, {0x44c56000}, 
-    {0x44c58000}, {0x44c5a000}, {0x44c5c000}, {0x44c5e000}, 
-    {0x44c60000}, {0x44c62000}, {0x44c64000}, {0x44c66000}, 
-    {0x44c68000}, {0x44c6a000}, {0x44c6c000}, {0x44c6e000}, 
-    {0x44c70000}, {0x44c72000}, {0x44c74000}, {0x44c76000}, 
-    {0x44c78000}, {0x44c7a000}, {0x44c7c000}, {0x44c7e000}, 
-    {0x44c80000}, {0x44c82000}, {0x44c84000}, {0x44c86000}, 
-    {0x44c88000}, {0x44c8a000}, {0x44c8c000}, {0x44c8e000}, 
-    {0x44c90000}, {0x44c92000}, {0x44c94000}, {0x44c96000}, 
-    {0x44c98000}, {0x44c9a000}, {0x44c9c000}, {0x44c9e000}, 
-    {0x44ca0000}, {0x44ca2000}, {0x44ca4000}, {0x44ca6000}, 
-    {0x44ca8000}, {0x44caa000}, {0x44cac000}, {0x44cae000}, 
-    {0x44cb0000}, {0x44cb2000}, {0x44cb4000}, {0x44cb6000}, 
-    {0x44cb8000}, {0x44cba000}, {0x44cbc000}, {0x44cbe000}, 
-    {0x44cc0000}, {0x44cc2000}, {0x44cc4000}, {0x44cc6000}, 
-    {0x44cc8000}, {0x44cca000}, {0x44ccc000}, {0x44cce000}, 
-    {0x44cd0000}, {0x44cd2000}, {0x44cd4000}, {0x44cd6000}, 
-    {0x44cd8000}, {0x44cda000}, {0x44cdc000}, {0x44cde000}, 
-    {0x44ce0000}, {0x44ce2000}, {0x44ce4000}, {0x44ce6000}, 
-    {0x44ce8000}, {0x44cea000}, {0x44cec000}, {0x44cee000}, 
-    {0x44cf0000}, {0x44cf2000}, {0x44cf4000}, {0x44cf6000}, 
-    {0x44cf8000}, {0x44cfa000}, {0x44cfc000}, {0x44cfe000}, 
-    {0x44d00000}, {0x44d02000}, {0x44d04000}, {0x44d06000}, 
-    {0x44d08000}, {0x44d0a000}, {0x44d0c000}, {0x44d0e000}, 
-    {0x44d10000}, {0x44d12000}, {0x44d14000}, {0x44d16000}, 
-    {0x44d18000}, {0x44d1a000}, {0x44d1c000}, {0x44d1e000}, 
-    {0x44d20000}, {0x44d22000}, {0x44d24000}, {0x44d26000}, 
-    {0x44d28000}, {0x44d2a000}, {0x44d2c000}, {0x44d2e000}, 
-    {0x44d30000}, {0x44d32000}, {0x44d34000}, {0x44d36000}, 
-    {0x44d38000}, {0x44d3a000}, {0x44d3c000}, {0x44d3e000}, 
-    {0x44d40000}, {0x44d42000}, {0x44d44000}, {0x44d46000}, 
-    {0x44d48000}, {0x44d4a000}, {0x44d4c000}, {0x44d4e000}, 
-    {0x44d50000}, {0x44d52000}, {0x44d54000}, {0x44d56000}, 
-    {0x44d58000}, {0x44d5a000}, {0x44d5c000}, {0x44d5e000}, 
-    {0x44d60000}, {0x44d62000}, {0x44d64000}, {0x44d66000}, 
-    {0x44d68000}, {0x44d6a000}, {0x44d6c000}, {0x44d6e000}, 
-    {0x44d70000}, {0x44d72000}, {0x44d74000}, {0x44d76000}, 
-    {0x44d78000}, {0x44d7a000}, {0x44d7c000}, {0x44d7e000}, 
-    {0x44d80000}, {0x44d82000}, {0x44d84000}, {0x44d86000}, 
-    {0x44d88000}, {0x44d8a000}, {0x44d8c000}, {0x44d8e000}, 
-    {0x44d90000}, {0x44d92000}, {0x44d94000}, {0x44d96000}, 
-    {0x44d98000}, {0x44d9a000}, {0x44d9c000}, {0x44d9e000}, 
-    {0x44da0000}, {0x44da2000}, {0x44da4000}, {0x44da6000}, 
-    {0x44da8000}, {0x44daa000}, {0x44dac000}, {0x44dae000}, 
-    {0x44db0000}, {0x44db2000}, {0x44db4000}, {0x44db6000}, 
-    {0x44db8000}, {0x44dba000}, {0x44dbc000}, {0x44dbe000}, 
-    {0x44dc0000}, {0x44dc2000}, {0x44dc4000}, {0x44dc6000}, 
-    {0x44dc8000}, {0x44dca000}, {0x44dcc000}, {0x44dce000}, 
-    {0x44dd0000}, {0x44dd2000}, {0x44dd4000}, {0x44dd6000}, 
-    {0x44dd8000}, {0x44dda000}, {0x44ddc000}, {0x44dde000}, 
-    {0x44de0000}, {0x44de2000}, {0x44de4000}, {0x44de6000}, 
-    {0x44de8000}, {0x44dea000}, {0x44dec000}, {0x44dee000}, 
-    {0x44df0000}, {0x44df2000}, {0x44df4000}, {0x44df6000}, 
-    {0x44df8000}, {0x44dfa000}, {0x44dfc000}, {0x44dfe000}, 
-    {0x44e00000}, {0x44e02000}, {0x44e04000}, {0x44e06000}, 
-    {0x44e08000}, {0x44e0a000}, {0x44e0c000}, {0x44e0e000}, 
-    {0x44e10000}, {0x44e12000}, {0x44e14000}, {0x44e16000}, 
-    {0x44e18000}, {0x44e1a000}, {0x44e1c000}, {0x44e1e000}, 
-    {0x44e20000}, {0x44e22000}, {0x44e24000}, {0x44e26000}, 
-    {0x44e28000}, {0x44e2a000}, {0x44e2c000}, {0x44e2e000}, 
-    {0x44e30000}, {0x44e32000}, {0x44e34000}, {0x44e36000}, 
-    {0x44e38000}, {0x44e3a000}, {0x44e3c000}, {0x44e3e000}, 
-    {0x44e40000}, {0x44e42000}, {0x44e44000}, {0x44e46000}, 
-    {0x44e48000}, {0x44e4a000}, {0x44e4c000}, {0x44e4e000}, 
-    {0x44e50000}, {0x44e52000}, {0x44e54000}, {0x44e56000}, 
-    {0x44e58000}, {0x44e5a000}, {0x44e5c000}, {0x44e5e000}, 
-    {0x44e60000}, {0x44e62000}, {0x44e64000}, {0x44e66000}, 
-    {0x44e68000}, {0x44e6a000}, {0x44e6c000}, {0x44e6e000}, 
-    {0x44e70000}, {0x44e72000}, {0x44e74000}, {0x44e76000}, 
-    {0x44e78000}, {0x44e7a000}, {0x44e7c000}, {0x44e7e000}, 
-    {0x44e80000}, {0x44e82000}, {0x44e84000}, {0x44e86000}, 
-    {0x44e88000}, {0x44e8a000}, {0x44e8c000}, {0x44e8e000}, 
-    {0x44e90000}, {0x44e92000}, {0x44e94000}, {0x44e96000}, 
-    {0x44e98000}, {0x44e9a000}, {0x44e9c000}, {0x44e9e000}, 
-    {0x44ea0000}, {0x44ea2000}, {0x44ea4000}, {0x44ea6000}, 
-    {0x44ea8000}, {0x44eaa000}, {0x44eac000}, {0x44eae000}, 
-    {0x44eb0000}, {0x44eb2000}, {0x44eb4000}, {0x44eb6000}, 
-    {0x44eb8000}, {0x44eba000}, {0x44ebc000}, {0x44ebe000}, 
-    {0x44ec0000}, {0x44ec2000}, {0x44ec4000}, {0x44ec6000}, 
-    {0x44ec8000}, {0x44eca000}, {0x44ecc000}, {0x44ece000}, 
-    {0x44ed0000}, {0x44ed2000}, {0x44ed4000}, {0x44ed6000}, 
-    {0x44ed8000}, {0x44eda000}, {0x44edc000}, {0x44ede000}, 
-    {0x44ee0000}, {0x44ee2000}, {0x44ee4000}, {0x44ee6000}, 
-    {0x44ee8000}, {0x44eea000}, {0x44eec000}, {0x44eee000}, 
-    {0x44ef0000}, {0x44ef2000}, {0x44ef4000}, {0x44ef6000}, 
-    {0x44ef8000}, {0x44efa000}, {0x44efc000}, {0x44efe000}, 
-    {0x44f00000}, {0x44f02000}, {0x44f04000}, {0x44f06000}, 
-    {0x44f08000}, {0x44f0a000}, {0x44f0c000}, {0x44f0e000}, 
-    {0x44f10000}, {0x44f12000}, {0x44f14000}, {0x44f16000}, 
-    {0x44f18000}, {0x44f1a000}, {0x44f1c000}, {0x44f1e000}, 
-    {0x44f20000}, {0x44f22000}, {0x44f24000}, {0x44f26000}, 
-    {0x44f28000}, {0x44f2a000}, {0x44f2c000}, {0x44f2e000}, 
-    {0x44f30000}, {0x44f32000}, {0x44f34000}, {0x44f36000}, 
-    {0x44f38000}, {0x44f3a000}, {0x44f3c000}, {0x44f3e000}, 
-    {0x44f40000}, {0x44f42000}, {0x44f44000}, {0x44f46000}, 
-    {0x44f48000}, {0x44f4a000}, {0x44f4c000}, {0x44f4e000}, 
-    {0x44f50000}, {0x44f52000}, {0x44f54000}, {0x44f56000}, 
-    {0x44f58000}, {0x44f5a000}, {0x44f5c000}, {0x44f5e000}, 
-    {0x44f60000}, {0x44f62000}, {0x44f64000}, {0x44f66000}, 
-    {0x44f68000}, {0x44f6a000}, {0x44f6c000}, {0x44f6e000}, 
-    {0x44f70000}, {0x44f72000}, {0x44f74000}, {0x44f76000}, 
-    {0x44f78000}, {0x44f7a000}, {0x44f7c000}, {0x44f7e000}, 
-    {0x44f80000}, {0x44f82000}, {0x44f84000}, {0x44f86000}, 
-    {0x44f88000}, {0x44f8a000}, {0x44f8c000}, {0x44f8e000}, 
-    {0x44f90000}, {0x44f92000}, {0x44f94000}, {0x44f96000}, 
-    {0x44f98000}, {0x44f9a000}, {0x44f9c000}, {0x44f9e000}, 
-    {0x44fa0000}, {0x44fa2000}, {0x44fa4000}, {0x44fa6000}, 
-    {0x44fa8000}, {0x44faa000}, {0x44fac000}, {0x44fae000}, 
-    {0x44fb0000}, {0x44fb2000}, {0x44fb4000}, {0x44fb6000}, 
-    {0x44fb8000}, {0x44fba000}, {0x44fbc000}, {0x44fbe000}, 
-    {0x44fc0000}, {0x44fc2000}, {0x44fc4000}, {0x44fc6000}, 
-    {0x44fc8000}, {0x44fca000}, {0x44fcc000}, {0x44fce000}, 
-    {0x44fd0000}, {0x44fd2000}, {0x44fd4000}, {0x44fd6000}, 
-    {0x44fd8000}, {0x44fda000}, {0x44fdc000}, {0x44fde000}, 
-    {0x44fe0000}, {0x44fe2000}, {0x44fe4000}, {0x44fe6000}, 
-    {0x44fe8000}, {0x44fea000}, {0x44fec000}, {0x44fee000}, 
-    {0x44ff0000}, {0x44ff2000}, {0x44ff4000}, {0x44ff6000}, 
-    {0x44ff8000}, {0x44ffa000}, {0x44ffc000}, {0x44ffe000}, 
-    {0x45000000}, {0x45002000}, {0x45004000}, {0x45006000}, 
-    {0x45008000}, {0x4500a000}, {0x4500c000}, {0x4500e000}, 
-    {0x45010000}, {0x45012000}, {0x45014000}, {0x45016000}, 
-    {0x45018000}, {0x4501a000}, {0x4501c000}, {0x4501e000}, 
-    {0x45020000}, {0x45022000}, {0x45024000}, {0x45026000}, 
-    {0x45028000}, {0x4502a000}, {0x4502c000}, {0x4502e000}, 
-    {0x45030000}, {0x45032000}, {0x45034000}, {0x45036000}, 
-    {0x45038000}, {0x4503a000}, {0x4503c000}, {0x4503e000}, 
-    {0x45040000}, {0x45042000}, {0x45044000}, {0x45046000}, 
-    {0x45048000}, {0x4504a000}, {0x4504c000}, {0x4504e000}, 
-    {0x45050000}, {0x45052000}, {0x45054000}, {0x45056000}, 
-    {0x45058000}, {0x4505a000}, {0x4505c000}, {0x4505e000}, 
-    {0x45060000}, {0x45062000}, {0x45064000}, {0x45066000}, 
-    {0x45068000}, {0x4506a000}, {0x4506c000}, {0x4506e000}, 
-    {0x45070000}, {0x45072000}, {0x45074000}, {0x45076000}, 
-    {0x45078000}, {0x4507a000}, {0x4507c000}, {0x4507e000}, 
-    {0x45080000}, {0x45082000}, {0x45084000}, {0x45086000}, 
-    {0x45088000}, {0x4508a000}, {0x4508c000}, {0x4508e000}, 
-    {0x45090000}, {0x45092000}, {0x45094000}, {0x45096000}, 
-    {0x45098000}, {0x4509a000}, {0x4509c000}, {0x4509e000}, 
-    {0x450a0000}, {0x450a2000}, {0x450a4000}, {0x450a6000}, 
-    {0x450a8000}, {0x450aa000}, {0x450ac000}, {0x450ae000}, 
-    {0x450b0000}, {0x450b2000}, {0x450b4000}, {0x450b6000}, 
-    {0x450b8000}, {0x450ba000}, {0x450bc000}, {0x450be000}, 
-    {0x450c0000}, {0x450c2000}, {0x450c4000}, {0x450c6000}, 
-    {0x450c8000}, {0x450ca000}, {0x450cc000}, {0x450ce000}, 
-    {0x450d0000}, {0x450d2000}, {0x450d4000}, {0x450d6000}, 
-    {0x450d8000}, {0x450da000}, {0x450dc000}, {0x450de000}, 
-    {0x450e0000}, {0x450e2000}, {0x450e4000}, {0x450e6000}, 
-    {0x450e8000}, {0x450ea000}, {0x450ec000}, {0x450ee000}, 
-    {0x450f0000}, {0x450f2000}, {0x450f4000}, {0x450f6000}, 
-    {0x450f8000}, {0x450fa000}, {0x450fc000}, {0x450fe000}, 
-    {0x45100000}, {0x45102000}, {0x45104000}, {0x45106000}, 
-    {0x45108000}, {0x4510a000}, {0x4510c000}, {0x4510e000}, 
-    {0x45110000}, {0x45112000}, {0x45114000}, {0x45116000}, 
-    {0x45118000}, {0x4511a000}, {0x4511c000}, {0x4511e000}, 
-    {0x45120000}, {0x45122000}, {0x45124000}, {0x45126000}, 
-    {0x45128000}, {0x4512a000}, {0x4512c000}, {0x4512e000}, 
-    {0x45130000}, {0x45132000}, {0x45134000}, {0x45136000}, 
-    {0x45138000}, {0x4513a000}, {0x4513c000}, {0x4513e000}, 
-    {0x45140000}, {0x45142000}, {0x45144000}, {0x45146000}, 
-    {0x45148000}, {0x4514a000}, {0x4514c000}, {0x4514e000}, 
-    {0x45150000}, {0x45152000}, {0x45154000}, {0x45156000}, 
-    {0x45158000}, {0x4515a000}, {0x4515c000}, {0x4515e000}, 
-    {0x45160000}, {0x45162000}, {0x45164000}, {0x45166000}, 
-    {0x45168000}, {0x4516a000}, {0x4516c000}, {0x4516e000}, 
-    {0x45170000}, {0x45172000}, {0x45174000}, {0x45176000}, 
-    {0x45178000}, {0x4517a000}, {0x4517c000}, {0x4517e000}, 
-    {0x45180000}, {0x45182000}, {0x45184000}, {0x45186000}, 
-    {0x45188000}, {0x4518a000}, {0x4518c000}, {0x4518e000}, 
-    {0x45190000}, {0x45192000}, {0x45194000}, {0x45196000}, 
-    {0x45198000}, {0x4519a000}, {0x4519c000}, {0x4519e000}, 
-    {0x451a0000}, {0x451a2000}, {0x451a4000}, {0x451a6000}, 
-    {0x451a8000}, {0x451aa000}, {0x451ac000}, {0x451ae000}, 
-    {0x451b0000}, {0x451b2000}, {0x451b4000}, {0x451b6000}, 
-    {0x451b8000}, {0x451ba000}, {0x451bc000}, {0x451be000}, 
-    {0x451c0000}, {0x451c2000}, {0x451c4000}, {0x451c6000}, 
-    {0x451c8000}, {0x451ca000}, {0x451cc000}, {0x451ce000}, 
-    {0x451d0000}, {0x451d2000}, {0x451d4000}, {0x451d6000}, 
-    {0x451d8000}, {0x451da000}, {0x451dc000}, {0x451de000}, 
-    {0x451e0000}, {0x451e2000}, {0x451e4000}, {0x451e6000}, 
-    {0x451e8000}, {0x451ea000}, {0x451ec000}, {0x451ee000}, 
-    {0x451f0000}, {0x451f2000}, {0x451f4000}, {0x451f6000}, 
-    {0x451f8000}, {0x451fa000}, {0x451fc000}, {0x451fe000}, 
-    {0x45200000}, {0x45202000}, {0x45204000}, {0x45206000}, 
-    {0x45208000}, {0x4520a000}, {0x4520c000}, {0x4520e000}, 
-    {0x45210000}, {0x45212000}, {0x45214000}, {0x45216000}, 
-    {0x45218000}, {0x4521a000}, {0x4521c000}, {0x4521e000}, 
-    {0x45220000}, {0x45222000}, {0x45224000}, {0x45226000}, 
-    {0x45228000}, {0x4522a000}, {0x4522c000}, {0x4522e000}, 
-    {0x45230000}, {0x45232000}, {0x45234000}, {0x45236000}, 
-    {0x45238000}, {0x4523a000}, {0x4523c000}, {0x4523e000}, 
-    {0x45240000}, {0x45242000}, {0x45244000}, {0x45246000}, 
-    {0x45248000}, {0x4524a000}, {0x4524c000}, {0x4524e000}, 
-    {0x45250000}, {0x45252000}, {0x45254000}, {0x45256000}, 
-    {0x45258000}, {0x4525a000}, {0x4525c000}, {0x4525e000}, 
-    {0x45260000}, {0x45262000}, {0x45264000}, {0x45266000}, 
-    {0x45268000}, {0x4526a000}, {0x4526c000}, {0x4526e000}, 
-    {0x45270000}, {0x45272000}, {0x45274000}, {0x45276000}, 
-    {0x45278000}, {0x4527a000}, {0x4527c000}, {0x4527e000}, 
-    {0x45280000}, {0x45282000}, {0x45284000}, {0x45286000}, 
-    {0x45288000}, {0x4528a000}, {0x4528c000}, {0x4528e000}, 
-    {0x45290000}, {0x45292000}, {0x45294000}, {0x45296000}, 
-    {0x45298000}, {0x4529a000}, {0x4529c000}, {0x4529e000}, 
-    {0x452a0000}, {0x452a2000}, {0x452a4000}, {0x452a6000}, 
-    {0x452a8000}, {0x452aa000}, {0x452ac000}, {0x452ae000}, 
-    {0x452b0000}, {0x452b2000}, {0x452b4000}, {0x452b6000}, 
-    {0x452b8000}, {0x452ba000}, {0x452bc000}, {0x452be000}, 
-    {0x452c0000}, {0x452c2000}, {0x452c4000}, {0x452c6000}, 
-    {0x452c8000}, {0x452ca000}, {0x452cc000}, {0x452ce000}, 
-    {0x452d0000}, {0x452d2000}, {0x452d4000}, {0x452d6000}, 
-    {0x452d8000}, {0x452da000}, {0x452dc000}, {0x452de000}, 
-    {0x452e0000}, {0x452e2000}, {0x452e4000}, {0x452e6000}, 
-    {0x452e8000}, {0x452ea000}, {0x452ec000}, {0x452ee000}, 
-    {0x452f0000}, {0x452f2000}, {0x452f4000}, {0x452f6000}, 
-    {0x452f8000}, {0x452fa000}, {0x452fc000}, {0x452fe000}, 
-    {0x45300000}, {0x45302000}, {0x45304000}, {0x45306000}, 
-    {0x45308000}, {0x4530a000}, {0x4530c000}, {0x4530e000}, 
-    {0x45310000}, {0x45312000}, {0x45314000}, {0x45316000}, 
-    {0x45318000}, {0x4531a000}, {0x4531c000}, {0x4531e000}, 
-    {0x45320000}, {0x45322000}, {0x45324000}, {0x45326000}, 
-    {0x45328000}, {0x4532a000}, {0x4532c000}, {0x4532e000}, 
-    {0x45330000}, {0x45332000}, {0x45334000}, {0x45336000}, 
-    {0x45338000}, {0x4533a000}, {0x4533c000}, {0x4533e000}, 
-    {0x45340000}, {0x45342000}, {0x45344000}, {0x45346000}, 
-    {0x45348000}, {0x4534a000}, {0x4534c000}, {0x4534e000}, 
-    {0x45350000}, {0x45352000}, {0x45354000}, {0x45356000}, 
-    {0x45358000}, {0x4535a000}, {0x4535c000}, {0x4535e000}, 
-    {0x45360000}, {0x45362000}, {0x45364000}, {0x45366000}, 
-    {0x45368000}, {0x4536a000}, {0x4536c000}, {0x4536e000}, 
-    {0x45370000}, {0x45372000}, {0x45374000}, {0x45376000}, 
-    {0x45378000}, {0x4537a000}, {0x4537c000}, {0x4537e000}, 
-    {0x45380000}, {0x45382000}, {0x45384000}, {0x45386000}, 
-    {0x45388000}, {0x4538a000}, {0x4538c000}, {0x4538e000}, 
-    {0x45390000}, {0x45392000}, {0x45394000}, {0x45396000}, 
-    {0x45398000}, {0x4539a000}, {0x4539c000}, {0x4539e000}, 
-    {0x453a0000}, {0x453a2000}, {0x453a4000}, {0x453a6000}, 
-    {0x453a8000}, {0x453aa000}, {0x453ac000}, {0x453ae000}, 
-    {0x453b0000}, {0x453b2000}, {0x453b4000}, {0x453b6000}, 
-    {0x453b8000}, {0x453ba000}, {0x453bc000}, {0x453be000}, 
-    {0x453c0000}, {0x453c2000}, {0x453c4000}, {0x453c6000}, 
-    {0x453c8000}, {0x453ca000}, {0x453cc000}, {0x453ce000}, 
-    {0x453d0000}, {0x453d2000}, {0x453d4000}, {0x453d6000}, 
-    {0x453d8000}, {0x453da000}, {0x453dc000}, {0x453de000}, 
-    {0x453e0000}, {0x453e2000}, {0x453e4000}, {0x453e6000}, 
-    {0x453e8000}, {0x453ea000}, {0x453ec000}, {0x453ee000}, 
-    {0x453f0000}, {0x453f2000}, {0x453f4000}, {0x453f6000}, 
-    {0x453f8000}, {0x453fa000}, {0x453fc000}, {0x453fe000}, 
-    {0x45400000}, {0x45402000}, {0x45404000}, {0x45406000}, 
-    {0x45408000}, {0x4540a000}, {0x4540c000}, {0x4540e000}, 
-    {0x45410000}, {0x45412000}, {0x45414000}, {0x45416000}, 
-    {0x45418000}, {0x4541a000}, {0x4541c000}, {0x4541e000}, 
-    {0x45420000}, {0x45422000}, {0x45424000}, {0x45426000}, 
-    {0x45428000}, {0x4542a000}, {0x4542c000}, {0x4542e000}, 
-    {0x45430000}, {0x45432000}, {0x45434000}, {0x45436000}, 
-    {0x45438000}, {0x4543a000}, {0x4543c000}, {0x4543e000}, 
-    {0x45440000}, {0x45442000}, {0x45444000}, {0x45446000}, 
-    {0x45448000}, {0x4544a000}, {0x4544c000}, {0x4544e000}, 
-    {0x45450000}, {0x45452000}, {0x45454000}, {0x45456000}, 
-    {0x45458000}, {0x4545a000}, {0x4545c000}, {0x4545e000}, 
-    {0x45460000}, {0x45462000}, {0x45464000}, {0x45466000}, 
-    {0x45468000}, {0x4546a000}, {0x4546c000}, {0x4546e000}, 
-    {0x45470000}, {0x45472000}, {0x45474000}, {0x45476000}, 
-    {0x45478000}, {0x4547a000}, {0x4547c000}, {0x4547e000}, 
-    {0x45480000}, {0x45482000}, {0x45484000}, {0x45486000}, 
-    {0x45488000}, {0x4548a000}, {0x4548c000}, {0x4548e000}, 
-    {0x45490000}, {0x45492000}, {0x45494000}, {0x45496000}, 
-    {0x45498000}, {0x4549a000}, {0x4549c000}, {0x4549e000}, 
-    {0x454a0000}, {0x454a2000}, {0x454a4000}, {0x454a6000}, 
-    {0x454a8000}, {0x454aa000}, {0x454ac000}, {0x454ae000}, 
-    {0x454b0000}, {0x454b2000}, {0x454b4000}, {0x454b6000}, 
-    {0x454b8000}, {0x454ba000}, {0x454bc000}, {0x454be000}, 
-    {0x454c0000}, {0x454c2000}, {0x454c4000}, {0x454c6000}, 
-    {0x454c8000}, {0x454ca000}, {0x454cc000}, {0x454ce000}, 
-    {0x454d0000}, {0x454d2000}, {0x454d4000}, {0x454d6000}, 
-    {0x454d8000}, {0x454da000}, {0x454dc000}, {0x454de000}, 
-    {0x454e0000}, {0x454e2000}, {0x454e4000}, {0x454e6000}, 
-    {0x454e8000}, {0x454ea000}, {0x454ec000}, {0x454ee000}, 
-    {0x454f0000}, {0x454f2000}, {0x454f4000}, {0x454f6000}, 
-    {0x454f8000}, {0x454fa000}, {0x454fc000}, {0x454fe000}, 
-    {0x45500000}, {0x45502000}, {0x45504000}, {0x45506000}, 
-    {0x45508000}, {0x4550a000}, {0x4550c000}, {0x4550e000}, 
-    {0x45510000}, {0x45512000}, {0x45514000}, {0x45516000}, 
-    {0x45518000}, {0x4551a000}, {0x4551c000}, {0x4551e000}, 
-    {0x45520000}, {0x45522000}, {0x45524000}, {0x45526000}, 
-    {0x45528000}, {0x4552a000}, {0x4552c000}, {0x4552e000}, 
-    {0x45530000}, {0x45532000}, {0x45534000}, {0x45536000}, 
-    {0x45538000}, {0x4553a000}, {0x4553c000}, {0x4553e000}, 
-    {0x45540000}, {0x45542000}, {0x45544000}, {0x45546000}, 
-    {0x45548000}, {0x4554a000}, {0x4554c000}, {0x4554e000}, 
-    {0x45550000}, {0x45552000}, {0x45554000}, {0x45556000}, 
-    {0x45558000}, {0x4555a000}, {0x4555c000}, {0x4555e000}, 
-    {0x45560000}, {0x45562000}, {0x45564000}, {0x45566000}, 
-    {0x45568000}, {0x4556a000}, {0x4556c000}, {0x4556e000}, 
-    {0x45570000}, {0x45572000}, {0x45574000}, {0x45576000}, 
-    {0x45578000}, {0x4557a000}, {0x4557c000}, {0x4557e000}, 
-    {0x45580000}, {0x45582000}, {0x45584000}, {0x45586000}, 
-    {0x45588000}, {0x4558a000}, {0x4558c000}, {0x4558e000}, 
-    {0x45590000}, {0x45592000}, {0x45594000}, {0x45596000}, 
-    {0x45598000}, {0x4559a000}, {0x4559c000}, {0x4559e000}, 
-    {0x455a0000}, {0x455a2000}, {0x455a4000}, {0x455a6000}, 
-    {0x455a8000}, {0x455aa000}, {0x455ac000}, {0x455ae000}, 
-    {0x455b0000}, {0x455b2000}, {0x455b4000}, {0x455b6000}, 
-    {0x455b8000}, {0x455ba000}, {0x455bc000}, {0x455be000}, 
-    {0x455c0000}, {0x455c2000}, {0x455c4000}, {0x455c6000}, 
-    {0x455c8000}, {0x455ca000}, {0x455cc000}, {0x455ce000}, 
-    {0x455d0000}, {0x455d2000}, {0x455d4000}, {0x455d6000}, 
-    {0x455d8000}, {0x455da000}, {0x455dc000}, {0x455de000}, 
-    {0x455e0000}, {0x455e2000}, {0x455e4000}, {0x455e6000}, 
-    {0x455e8000}, {0x455ea000}, {0x455ec000}, {0x455ee000}, 
-    {0x455f0000}, {0x455f2000}, {0x455f4000}, {0x455f6000}, 
-    {0x455f8000}, {0x455fa000}, {0x455fc000}, {0x455fe000}, 
-    {0x45600000}, {0x45602000}, {0x45604000}, {0x45606000}, 
-    {0x45608000}, {0x4560a000}, {0x4560c000}, {0x4560e000}, 
-    {0x45610000}, {0x45612000}, {0x45614000}, {0x45616000}, 
-    {0x45618000}, {0x4561a000}, {0x4561c000}, {0x4561e000}, 
-    {0x45620000}, {0x45622000}, {0x45624000}, {0x45626000}, 
-    {0x45628000}, {0x4562a000}, {0x4562c000}, {0x4562e000}, 
-    {0x45630000}, {0x45632000}, {0x45634000}, {0x45636000}, 
-    {0x45638000}, {0x4563a000}, {0x4563c000}, {0x4563e000}, 
-    {0x45640000}, {0x45642000}, {0x45644000}, {0x45646000}, 
-    {0x45648000}, {0x4564a000}, {0x4564c000}, {0x4564e000}, 
-    {0x45650000}, {0x45652000}, {0x45654000}, {0x45656000}, 
-    {0x45658000}, {0x4565a000}, {0x4565c000}, {0x4565e000}, 
-    {0x45660000}, {0x45662000}, {0x45664000}, {0x45666000}, 
-    {0x45668000}, {0x4566a000}, {0x4566c000}, {0x4566e000}, 
-    {0x45670000}, {0x45672000}, {0x45674000}, {0x45676000}, 
-    {0x45678000}, {0x4567a000}, {0x4567c000}, {0x4567e000}, 
-    {0x45680000}, {0x45682000}, {0x45684000}, {0x45686000}, 
-    {0x45688000}, {0x4568a000}, {0x4568c000}, {0x4568e000}, 
-    {0x45690000}, {0x45692000}, {0x45694000}, {0x45696000}, 
-    {0x45698000}, {0x4569a000}, {0x4569c000}, {0x4569e000}, 
-    {0x456a0000}, {0x456a2000}, {0x456a4000}, {0x456a6000}, 
-    {0x456a8000}, {0x456aa000}, {0x456ac000}, {0x456ae000}, 
-    {0x456b0000}, {0x456b2000}, {0x456b4000}, {0x456b6000}, 
-    {0x456b8000}, {0x456ba000}, {0x456bc000}, {0x456be000}, 
-    {0x456c0000}, {0x456c2000}, {0x456c4000}, {0x456c6000}, 
-    {0x456c8000}, {0x456ca000}, {0x456cc000}, {0x456ce000}, 
-    {0x456d0000}, {0x456d2000}, {0x456d4000}, {0x456d6000}, 
-    {0x456d8000}, {0x456da000}, {0x456dc000}, {0x456de000}, 
-    {0x456e0000}, {0x456e2000}, {0x456e4000}, {0x456e6000}, 
-    {0x456e8000}, {0x456ea000}, {0x456ec000}, {0x456ee000}, 
-    {0x456f0000}, {0x456f2000}, {0x456f4000}, {0x456f6000}, 
-    {0x456f8000}, {0x456fa000}, {0x456fc000}, {0x456fe000}, 
-    {0x45700000}, {0x45702000}, {0x45704000}, {0x45706000}, 
-    {0x45708000}, {0x4570a000}, {0x4570c000}, {0x4570e000}, 
-    {0x45710000}, {0x45712000}, {0x45714000}, {0x45716000}, 
-    {0x45718000}, {0x4571a000}, {0x4571c000}, {0x4571e000}, 
-    {0x45720000}, {0x45722000}, {0x45724000}, {0x45726000}, 
-    {0x45728000}, {0x4572a000}, {0x4572c000}, {0x4572e000}, 
-    {0x45730000}, {0x45732000}, {0x45734000}, {0x45736000}, 
-    {0x45738000}, {0x4573a000}, {0x4573c000}, {0x4573e000}, 
-    {0x45740000}, {0x45742000}, {0x45744000}, {0x45746000}, 
-    {0x45748000}, {0x4574a000}, {0x4574c000}, {0x4574e000}, 
-    {0x45750000}, {0x45752000}, {0x45754000}, {0x45756000}, 
-    {0x45758000}, {0x4575a000}, {0x4575c000}, {0x4575e000}, 
-    {0x45760000}, {0x45762000}, {0x45764000}, {0x45766000}, 
-    {0x45768000}, {0x4576a000}, {0x4576c000}, {0x4576e000}, 
-    {0x45770000}, {0x45772000}, {0x45774000}, {0x45776000}, 
-    {0x45778000}, {0x4577a000}, {0x4577c000}, {0x4577e000}, 
-    {0x45780000}, {0x45782000}, {0x45784000}, {0x45786000}, 
-    {0x45788000}, {0x4578a000}, {0x4578c000}, {0x4578e000}, 
-    {0x45790000}, {0x45792000}, {0x45794000}, {0x45796000}, 
-    {0x45798000}, {0x4579a000}, {0x4579c000}, {0x4579e000}, 
-    {0x457a0000}, {0x457a2000}, {0x457a4000}, {0x457a6000}, 
-    {0x457a8000}, {0x457aa000}, {0x457ac000}, {0x457ae000}, 
-    {0x457b0000}, {0x457b2000}, {0x457b4000}, {0x457b6000}, 
-    {0x457b8000}, {0x457ba000}, {0x457bc000}, {0x457be000}, 
-    {0x457c0000}, {0x457c2000}, {0x457c4000}, {0x457c6000}, 
-    {0x457c8000}, {0x457ca000}, {0x457cc000}, {0x457ce000}, 
-    {0x457d0000}, {0x457d2000}, {0x457d4000}, {0x457d6000}, 
-    {0x457d8000}, {0x457da000}, {0x457dc000}, {0x457de000}, 
-    {0x457e0000}, {0x457e2000}, {0x457e4000}, {0x457e6000}, 
-    {0x457e8000}, {0x457ea000}, {0x457ec000}, {0x457ee000}, 
-    {0x457f0000}, {0x457f2000}, {0x457f4000}, {0x457f6000}, 
-    {0x457f8000}, {0x457fa000}, {0x457fc000}, {0x457fe000}, 
-    {0x45800000}, {0x45802000}, {0x45804000}, {0x45806000}, 
-    {0x45808000}, {0x4580a000}, {0x4580c000}, {0x4580e000}, 
-    {0x45810000}, {0x45812000}, {0x45814000}, {0x45816000}, 
-    {0x45818000}, {0x4581a000}, {0x4581c000}, {0x4581e000}, 
-    {0x45820000}, {0x45822000}, {0x45824000}, {0x45826000}, 
-    {0x45828000}, {0x4582a000}, {0x4582c000}, {0x4582e000}, 
-    {0x45830000}, {0x45832000}, {0x45834000}, {0x45836000}, 
-    {0x45838000}, {0x4583a000}, {0x4583c000}, {0x4583e000}, 
-    {0x45840000}, {0x45842000}, {0x45844000}, {0x45846000}, 
-    {0x45848000}, {0x4584a000}, {0x4584c000}, {0x4584e000}, 
-    {0x45850000}, {0x45852000}, {0x45854000}, {0x45856000}, 
-    {0x45858000}, {0x4585a000}, {0x4585c000}, {0x4585e000}, 
-    {0x45860000}, {0x45862000}, {0x45864000}, {0x45866000}, 
-    {0x45868000}, {0x4586a000}, {0x4586c000}, {0x4586e000}, 
-    {0x45870000}, {0x45872000}, {0x45874000}, {0x45876000}, 
-    {0x45878000}, {0x4587a000}, {0x4587c000}, {0x4587e000}, 
-    {0x45880000}, {0x45882000}, {0x45884000}, {0x45886000}, 
-    {0x45888000}, {0x4588a000}, {0x4588c000}, {0x4588e000}, 
-    {0x45890000}, {0x45892000}, {0x45894000}, {0x45896000}, 
-    {0x45898000}, {0x4589a000}, {0x4589c000}, {0x4589e000}, 
-    {0x458a0000}, {0x458a2000}, {0x458a4000}, {0x458a6000}, 
-    {0x458a8000}, {0x458aa000}, {0x458ac000}, {0x458ae000}, 
-    {0x458b0000}, {0x458b2000}, {0x458b4000}, {0x458b6000}, 
-    {0x458b8000}, {0x458ba000}, {0x458bc000}, {0x458be000}, 
-    {0x458c0000}, {0x458c2000}, {0x458c4000}, {0x458c6000}, 
-    {0x458c8000}, {0x458ca000}, {0x458cc000}, {0x458ce000}, 
-    {0x458d0000}, {0x458d2000}, {0x458d4000}, {0x458d6000}, 
-    {0x458d8000}, {0x458da000}, {0x458dc000}, {0x458de000}, 
-    {0x458e0000}, {0x458e2000}, {0x458e4000}, {0x458e6000}, 
-    {0x458e8000}, {0x458ea000}, {0x458ec000}, {0x458ee000}, 
-    {0x458f0000}, {0x458f2000}, {0x458f4000}, {0x458f6000}, 
-    {0x458f8000}, {0x458fa000}, {0x458fc000}, {0x458fe000}, 
-    {0x45900000}, {0x45902000}, {0x45904000}, {0x45906000}, 
-    {0x45908000}, {0x4590a000}, {0x4590c000}, {0x4590e000}, 
-    {0x45910000}, {0x45912000}, {0x45914000}, {0x45916000}, 
-    {0x45918000}, {0x4591a000}, {0x4591c000}, {0x4591e000}, 
-    {0x45920000}, {0x45922000}, {0x45924000}, {0x45926000}, 
-    {0x45928000}, {0x4592a000}, {0x4592c000}, {0x4592e000}, 
-    {0x45930000}, {0x45932000}, {0x45934000}, {0x45936000}, 
-    {0x45938000}, {0x4593a000}, {0x4593c000}, {0x4593e000}, 
-    {0x45940000}, {0x45942000}, {0x45944000}, {0x45946000}, 
-    {0x45948000}, {0x4594a000}, {0x4594c000}, {0x4594e000}, 
-    {0x45950000}, {0x45952000}, {0x45954000}, {0x45956000}, 
-    {0x45958000}, {0x4595a000}, {0x4595c000}, {0x4595e000}, 
-    {0x45960000}, {0x45962000}, {0x45964000}, {0x45966000}, 
-    {0x45968000}, {0x4596a000}, {0x4596c000}, {0x4596e000}, 
-    {0x45970000}, {0x45972000}, {0x45974000}, {0x45976000}, 
-    {0x45978000}, {0x4597a000}, {0x4597c000}, {0x4597e000}, 
-    {0x45980000}, {0x45982000}, {0x45984000}, {0x45986000}, 
-    {0x45988000}, {0x4598a000}, {0x4598c000}, {0x4598e000}, 
-    {0x45990000}, {0x45992000}, {0x45994000}, {0x45996000}, 
-    {0x45998000}, {0x4599a000}, {0x4599c000}, {0x4599e000}, 
-    {0x459a0000}, {0x459a2000}, {0x459a4000}, {0x459a6000}, 
-    {0x459a8000}, {0x459aa000}, {0x459ac000}, {0x459ae000}, 
-    {0x459b0000}, {0x459b2000}, {0x459b4000}, {0x459b6000}, 
-    {0x459b8000}, {0x459ba000}, {0x459bc000}, {0x459be000}, 
-    {0x459c0000}, {0x459c2000}, {0x459c4000}, {0x459c6000}, 
-    {0x459c8000}, {0x459ca000}, {0x459cc000}, {0x459ce000}, 
-    {0x459d0000}, {0x459d2000}, {0x459d4000}, {0x459d6000}, 
-    {0x459d8000}, {0x459da000}, {0x459dc000}, {0x459de000}, 
-    {0x459e0000}, {0x459e2000}, {0x459e4000}, {0x459e6000}, 
-    {0x459e8000}, {0x459ea000}, {0x459ec000}, {0x459ee000}, 
-    {0x459f0000}, {0x459f2000}, {0x459f4000}, {0x459f6000}, 
-    {0x459f8000}, {0x459fa000}, {0x459fc000}, {0x459fe000}, 
-    {0x45a00000}, {0x45a02000}, {0x45a04000}, {0x45a06000}, 
-    {0x45a08000}, {0x45a0a000}, {0x45a0c000}, {0x45a0e000}, 
-    {0x45a10000}, {0x45a12000}, {0x45a14000}, {0x45a16000}, 
-    {0x45a18000}, {0x45a1a000}, {0x45a1c000}, {0x45a1e000}, 
-    {0x45a20000}, {0x45a22000}, {0x45a24000}, {0x45a26000}, 
-    {0x45a28000}, {0x45a2a000}, {0x45a2c000}, {0x45a2e000}, 
-    {0x45a30000}, {0x45a32000}, {0x45a34000}, {0x45a36000}, 
-    {0x45a38000}, {0x45a3a000}, {0x45a3c000}, {0x45a3e000}, 
-    {0x45a40000}, {0x45a42000}, {0x45a44000}, {0x45a46000}, 
-    {0x45a48000}, {0x45a4a000}, {0x45a4c000}, {0x45a4e000}, 
-    {0x45a50000}, {0x45a52000}, {0x45a54000}, {0x45a56000}, 
-    {0x45a58000}, {0x45a5a000}, {0x45a5c000}, {0x45a5e000}, 
-    {0x45a60000}, {0x45a62000}, {0x45a64000}, {0x45a66000}, 
-    {0x45a68000}, {0x45a6a000}, {0x45a6c000}, {0x45a6e000}, 
-    {0x45a70000}, {0x45a72000}, {0x45a74000}, {0x45a76000}, 
-    {0x45a78000}, {0x45a7a000}, {0x45a7c000}, {0x45a7e000}, 
-    {0x45a80000}, {0x45a82000}, {0x45a84000}, {0x45a86000}, 
-    {0x45a88000}, {0x45a8a000}, {0x45a8c000}, {0x45a8e000}, 
-    {0x45a90000}, {0x45a92000}, {0x45a94000}, {0x45a96000}, 
-    {0x45a98000}, {0x45a9a000}, {0x45a9c000}, {0x45a9e000}, 
-    {0x45aa0000}, {0x45aa2000}, {0x45aa4000}, {0x45aa6000}, 
-    {0x45aa8000}, {0x45aaa000}, {0x45aac000}, {0x45aae000}, 
-    {0x45ab0000}, {0x45ab2000}, {0x45ab4000}, {0x45ab6000}, 
-    {0x45ab8000}, {0x45aba000}, {0x45abc000}, {0x45abe000}, 
-    {0x45ac0000}, {0x45ac2000}, {0x45ac4000}, {0x45ac6000}, 
-    {0x45ac8000}, {0x45aca000}, {0x45acc000}, {0x45ace000}, 
-    {0x45ad0000}, {0x45ad2000}, {0x45ad4000}, {0x45ad6000}, 
-    {0x45ad8000}, {0x45ada000}, {0x45adc000}, {0x45ade000}, 
-    {0x45ae0000}, {0x45ae2000}, {0x45ae4000}, {0x45ae6000}, 
-    {0x45ae8000}, {0x45aea000}, {0x45aec000}, {0x45aee000}, 
-    {0x45af0000}, {0x45af2000}, {0x45af4000}, {0x45af6000}, 
-    {0x45af8000}, {0x45afa000}, {0x45afc000}, {0x45afe000}, 
-    {0x45b00000}, {0x45b02000}, {0x45b04000}, {0x45b06000}, 
-    {0x45b08000}, {0x45b0a000}, {0x45b0c000}, {0x45b0e000}, 
-    {0x45b10000}, {0x45b12000}, {0x45b14000}, {0x45b16000}, 
-    {0x45b18000}, {0x45b1a000}, {0x45b1c000}, {0x45b1e000}, 
-    {0x45b20000}, {0x45b22000}, {0x45b24000}, {0x45b26000}, 
-    {0x45b28000}, {0x45b2a000}, {0x45b2c000}, {0x45b2e000}, 
-    {0x45b30000}, {0x45b32000}, {0x45b34000}, {0x45b36000}, 
-    {0x45b38000}, {0x45b3a000}, {0x45b3c000}, {0x45b3e000}, 
-    {0x45b40000}, {0x45b42000}, {0x45b44000}, {0x45b46000}, 
-    {0x45b48000}, {0x45b4a000}, {0x45b4c000}, {0x45b4e000}, 
-    {0x45b50000}, {0x45b52000}, {0x45b54000}, {0x45b56000}, 
-    {0x45b58000}, {0x45b5a000}, {0x45b5c000}, {0x45b5e000}, 
-    {0x45b60000}, {0x45b62000}, {0x45b64000}, {0x45b66000}, 
-    {0x45b68000}, {0x45b6a000}, {0x45b6c000}, {0x45b6e000}, 
-    {0x45b70000}, {0x45b72000}, {0x45b74000}, {0x45b76000}, 
-    {0x45b78000}, {0x45b7a000}, {0x45b7c000}, {0x45b7e000}, 
-    {0x45b80000}, {0x45b82000}, {0x45b84000}, {0x45b86000}, 
-    {0x45b88000}, {0x45b8a000}, {0x45b8c000}, {0x45b8e000}, 
-    {0x45b90000}, {0x45b92000}, {0x45b94000}, {0x45b96000}, 
-    {0x45b98000}, {0x45b9a000}, {0x45b9c000}, {0x45b9e000}, 
-    {0x45ba0000}, {0x45ba2000}, {0x45ba4000}, {0x45ba6000}, 
-    {0x45ba8000}, {0x45baa000}, {0x45bac000}, {0x45bae000}, 
-    {0x45bb0000}, {0x45bb2000}, {0x45bb4000}, {0x45bb6000}, 
-    {0x45bb8000}, {0x45bba000}, {0x45bbc000}, {0x45bbe000}, 
-    {0x45bc0000}, {0x45bc2000}, {0x45bc4000}, {0x45bc6000}, 
-    {0x45bc8000}, {0x45bca000}, {0x45bcc000}, {0x45bce000}, 
-    {0x45bd0000}, {0x45bd2000}, {0x45bd4000}, {0x45bd6000}, 
-    {0x45bd8000}, {0x45bda000}, {0x45bdc000}, {0x45bde000}, 
-    {0x45be0000}, {0x45be2000}, {0x45be4000}, {0x45be6000}, 
-    {0x45be8000}, {0x45bea000}, {0x45bec000}, {0x45bee000}, 
-    {0x45bf0000}, {0x45bf2000}, {0x45bf4000}, {0x45bf6000}, 
-    {0x45bf8000}, {0x45bfa000}, {0x45bfc000}, {0x45bfe000}, 
-    {0x45c00000}, {0x45c02000}, {0x45c04000}, {0x45c06000}, 
-    {0x45c08000}, {0x45c0a000}, {0x45c0c000}, {0x45c0e000}, 
-    {0x45c10000}, {0x45c12000}, {0x45c14000}, {0x45c16000}, 
-    {0x45c18000}, {0x45c1a000}, {0x45c1c000}, {0x45c1e000}, 
-    {0x45c20000}, {0x45c22000}, {0x45c24000}, {0x45c26000}, 
-    {0x45c28000}, {0x45c2a000}, {0x45c2c000}, {0x45c2e000}, 
-    {0x45c30000}, {0x45c32000}, {0x45c34000}, {0x45c36000}, 
-    {0x45c38000}, {0x45c3a000}, {0x45c3c000}, {0x45c3e000}, 
-    {0x45c40000}, {0x45c42000}, {0x45c44000}, {0x45c46000}, 
-    {0x45c48000}, {0x45c4a000}, {0x45c4c000}, {0x45c4e000}, 
-    {0x45c50000}, {0x45c52000}, {0x45c54000}, {0x45c56000}, 
-    {0x45c58000}, {0x45c5a000}, {0x45c5c000}, {0x45c5e000}, 
-    {0x45c60000}, {0x45c62000}, {0x45c64000}, {0x45c66000}, 
-    {0x45c68000}, {0x45c6a000}, {0x45c6c000}, {0x45c6e000}, 
-    {0x45c70000}, {0x45c72000}, {0x45c74000}, {0x45c76000}, 
-    {0x45c78000}, {0x45c7a000}, {0x45c7c000}, {0x45c7e000}, 
-    {0x45c80000}, {0x45c82000}, {0x45c84000}, {0x45c86000}, 
-    {0x45c88000}, {0x45c8a000}, {0x45c8c000}, {0x45c8e000}, 
-    {0x45c90000}, {0x45c92000}, {0x45c94000}, {0x45c96000}, 
-    {0x45c98000}, {0x45c9a000}, {0x45c9c000}, {0x45c9e000}, 
-    {0x45ca0000}, {0x45ca2000}, {0x45ca4000}, {0x45ca6000}, 
-    {0x45ca8000}, {0x45caa000}, {0x45cac000}, {0x45cae000}, 
-    {0x45cb0000}, {0x45cb2000}, {0x45cb4000}, {0x45cb6000}, 
-    {0x45cb8000}, {0x45cba000}, {0x45cbc000}, {0x45cbe000}, 
-    {0x45cc0000}, {0x45cc2000}, {0x45cc4000}, {0x45cc6000}, 
-    {0x45cc8000}, {0x45cca000}, {0x45ccc000}, {0x45cce000}, 
-    {0x45cd0000}, {0x45cd2000}, {0x45cd4000}, {0x45cd6000}, 
-    {0x45cd8000}, {0x45cda000}, {0x45cdc000}, {0x45cde000}, 
-    {0x45ce0000}, {0x45ce2000}, {0x45ce4000}, {0x45ce6000}, 
-    {0x45ce8000}, {0x45cea000}, {0x45cec000}, {0x45cee000}, 
-    {0x45cf0000}, {0x45cf2000}, {0x45cf4000}, {0x45cf6000}, 
-    {0x45cf8000}, {0x45cfa000}, {0x45cfc000}, {0x45cfe000}, 
-    {0x45d00000}, {0x45d02000}, {0x45d04000}, {0x45d06000}, 
-    {0x45d08000}, {0x45d0a000}, {0x45d0c000}, {0x45d0e000}, 
-    {0x45d10000}, {0x45d12000}, {0x45d14000}, {0x45d16000}, 
-    {0x45d18000}, {0x45d1a000}, {0x45d1c000}, {0x45d1e000}, 
-    {0x45d20000}, {0x45d22000}, {0x45d24000}, {0x45d26000}, 
-    {0x45d28000}, {0x45d2a000}, {0x45d2c000}, {0x45d2e000}, 
-    {0x45d30000}, {0x45d32000}, {0x45d34000}, {0x45d36000}, 
-    {0x45d38000}, {0x45d3a000}, {0x45d3c000}, {0x45d3e000}, 
-    {0x45d40000}, {0x45d42000}, {0x45d44000}, {0x45d46000}, 
-    {0x45d48000}, {0x45d4a000}, {0x45d4c000}, {0x45d4e000}, 
-    {0x45d50000}, {0x45d52000}, {0x45d54000}, {0x45d56000}, 
-    {0x45d58000}, {0x45d5a000}, {0x45d5c000}, {0x45d5e000}, 
-    {0x45d60000}, {0x45d62000}, {0x45d64000}, {0x45d66000}, 
-    {0x45d68000}, {0x45d6a000}, {0x45d6c000}, {0x45d6e000}, 
-    {0x45d70000}, {0x45d72000}, {0x45d74000}, {0x45d76000}, 
-    {0x45d78000}, {0x45d7a000}, {0x45d7c000}, {0x45d7e000}, 
-    {0x45d80000}, {0x45d82000}, {0x45d84000}, {0x45d86000}, 
-    {0x45d88000}, {0x45d8a000}, {0x45d8c000}, {0x45d8e000}, 
-    {0x45d90000}, {0x45d92000}, {0x45d94000}, {0x45d96000}, 
-    {0x45d98000}, {0x45d9a000}, {0x45d9c000}, {0x45d9e000}, 
-    {0x45da0000}, {0x45da2000}, {0x45da4000}, {0x45da6000}, 
-    {0x45da8000}, {0x45daa000}, {0x45dac000}, {0x45dae000}, 
-    {0x45db0000}, {0x45db2000}, {0x45db4000}, {0x45db6000}, 
-    {0x45db8000}, {0x45dba000}, {0x45dbc000}, {0x45dbe000}, 
-    {0x45dc0000}, {0x45dc2000}, {0x45dc4000}, {0x45dc6000}, 
-    {0x45dc8000}, {0x45dca000}, {0x45dcc000}, {0x45dce000}, 
-    {0x45dd0000}, {0x45dd2000}, {0x45dd4000}, {0x45dd6000}, 
-    {0x45dd8000}, {0x45dda000}, {0x45ddc000}, {0x45dde000}, 
-    {0x45de0000}, {0x45de2000}, {0x45de4000}, {0x45de6000}, 
-    {0x45de8000}, {0x45dea000}, {0x45dec000}, {0x45dee000}, 
-    {0x45df0000}, {0x45df2000}, {0x45df4000}, {0x45df6000}, 
-    {0x45df8000}, {0x45dfa000}, {0x45dfc000}, {0x45dfe000}, 
-    {0x45e00000}, {0x45e02000}, {0x45e04000}, {0x45e06000}, 
-    {0x45e08000}, {0x45e0a000}, {0x45e0c000}, {0x45e0e000}, 
-    {0x45e10000}, {0x45e12000}, {0x45e14000}, {0x45e16000}, 
-    {0x45e18000}, {0x45e1a000}, {0x45e1c000}, {0x45e1e000}, 
-    {0x45e20000}, {0x45e22000}, {0x45e24000}, {0x45e26000}, 
-    {0x45e28000}, {0x45e2a000}, {0x45e2c000}, {0x45e2e000}, 
-    {0x45e30000}, {0x45e32000}, {0x45e34000}, {0x45e36000}, 
-    {0x45e38000}, {0x45e3a000}, {0x45e3c000}, {0x45e3e000}, 
-    {0x45e40000}, {0x45e42000}, {0x45e44000}, {0x45e46000}, 
-    {0x45e48000}, {0x45e4a000}, {0x45e4c000}, {0x45e4e000}, 
-    {0x45e50000}, {0x45e52000}, {0x45e54000}, {0x45e56000}, 
-    {0x45e58000}, {0x45e5a000}, {0x45e5c000}, {0x45e5e000}, 
-    {0x45e60000}, {0x45e62000}, {0x45e64000}, {0x45e66000}, 
-    {0x45e68000}, {0x45e6a000}, {0x45e6c000}, {0x45e6e000}, 
-    {0x45e70000}, {0x45e72000}, {0x45e74000}, {0x45e76000}, 
-    {0x45e78000}, {0x45e7a000}, {0x45e7c000}, {0x45e7e000}, 
-    {0x45e80000}, {0x45e82000}, {0x45e84000}, {0x45e86000}, 
-    {0x45e88000}, {0x45e8a000}, {0x45e8c000}, {0x45e8e000}, 
-    {0x45e90000}, {0x45e92000}, {0x45e94000}, {0x45e96000}, 
-    {0x45e98000}, {0x45e9a000}, {0x45e9c000}, {0x45e9e000}, 
-    {0x45ea0000}, {0x45ea2000}, {0x45ea4000}, {0x45ea6000}, 
-    {0x45ea8000}, {0x45eaa000}, {0x45eac000}, {0x45eae000}, 
-    {0x45eb0000}, {0x45eb2000}, {0x45eb4000}, {0x45eb6000}, 
-    {0x45eb8000}, {0x45eba000}, {0x45ebc000}, {0x45ebe000}, 
-    {0x45ec0000}, {0x45ec2000}, {0x45ec4000}, {0x45ec6000}, 
-    {0x45ec8000}, {0x45eca000}, {0x45ecc000}, {0x45ece000}, 
-    {0x45ed0000}, {0x45ed2000}, {0x45ed4000}, {0x45ed6000}, 
-    {0x45ed8000}, {0x45eda000}, {0x45edc000}, {0x45ede000}, 
-    {0x45ee0000}, {0x45ee2000}, {0x45ee4000}, {0x45ee6000}, 
-    {0x45ee8000}, {0x45eea000}, {0x45eec000}, {0x45eee000}, 
-    {0x45ef0000}, {0x45ef2000}, {0x45ef4000}, {0x45ef6000}, 
-    {0x45ef8000}, {0x45efa000}, {0x45efc000}, {0x45efe000}, 
-    {0x45f00000}, {0x45f02000}, {0x45f04000}, {0x45f06000}, 
-    {0x45f08000}, {0x45f0a000}, {0x45f0c000}, {0x45f0e000}, 
-    {0x45f10000}, {0x45f12000}, {0x45f14000}, {0x45f16000}, 
-    {0x45f18000}, {0x45f1a000}, {0x45f1c000}, {0x45f1e000}, 
-    {0x45f20000}, {0x45f22000}, {0x45f24000}, {0x45f26000}, 
-    {0x45f28000}, {0x45f2a000}, {0x45f2c000}, {0x45f2e000}, 
-    {0x45f30000}, {0x45f32000}, {0x45f34000}, {0x45f36000}, 
-    {0x45f38000}, {0x45f3a000}, {0x45f3c000}, {0x45f3e000}, 
-    {0x45f40000}, {0x45f42000}, {0x45f44000}, {0x45f46000}, 
-    {0x45f48000}, {0x45f4a000}, {0x45f4c000}, {0x45f4e000}, 
-    {0x45f50000}, {0x45f52000}, {0x45f54000}, {0x45f56000}, 
-    {0x45f58000}, {0x45f5a000}, {0x45f5c000}, {0x45f5e000}, 
-    {0x45f60000}, {0x45f62000}, {0x45f64000}, {0x45f66000}, 
-    {0x45f68000}, {0x45f6a000}, {0x45f6c000}, {0x45f6e000}, 
-    {0x45f70000}, {0x45f72000}, {0x45f74000}, {0x45f76000}, 
-    {0x45f78000}, {0x45f7a000}, {0x45f7c000}, {0x45f7e000}, 
-    {0x45f80000}, {0x45f82000}, {0x45f84000}, {0x45f86000}, 
-    {0x45f88000}, {0x45f8a000}, {0x45f8c000}, {0x45f8e000}, 
-    {0x45f90000}, {0x45f92000}, {0x45f94000}, {0x45f96000}, 
-    {0x45f98000}, {0x45f9a000}, {0x45f9c000}, {0x45f9e000}, 
-    {0x45fa0000}, {0x45fa2000}, {0x45fa4000}, {0x45fa6000}, 
-    {0x45fa8000}, {0x45faa000}, {0x45fac000}, {0x45fae000}, 
-    {0x45fb0000}, {0x45fb2000}, {0x45fb4000}, {0x45fb6000}, 
-    {0x45fb8000}, {0x45fba000}, {0x45fbc000}, {0x45fbe000}, 
-    {0x45fc0000}, {0x45fc2000}, {0x45fc4000}, {0x45fc6000}, 
-    {0x45fc8000}, {0x45fca000}, {0x45fcc000}, {0x45fce000}, 
-    {0x45fd0000}, {0x45fd2000}, {0x45fd4000}, {0x45fd6000}, 
-    {0x45fd8000}, {0x45fda000}, {0x45fdc000}, {0x45fde000}, 
-    {0x45fe0000}, {0x45fe2000}, {0x45fe4000}, {0x45fe6000}, 
-    {0x45fe8000}, {0x45fea000}, {0x45fec000}, {0x45fee000}, 
-    {0x45ff0000}, {0x45ff2000}, {0x45ff4000}, {0x45ff6000}, 
-    {0x45ff8000}, {0x45ffa000}, {0x45ffc000}, {0x45ffe000}, 
-    {0x46000000}, {0x46002000}, {0x46004000}, {0x46006000}, 
-    {0x46008000}, {0x4600a000}, {0x4600c000}, {0x4600e000}, 
-    {0x46010000}, {0x46012000}, {0x46014000}, {0x46016000}, 
-    {0x46018000}, {0x4601a000}, {0x4601c000}, {0x4601e000}, 
-    {0x46020000}, {0x46022000}, {0x46024000}, {0x46026000}, 
-    {0x46028000}, {0x4602a000}, {0x4602c000}, {0x4602e000}, 
-    {0x46030000}, {0x46032000}, {0x46034000}, {0x46036000}, 
-    {0x46038000}, {0x4603a000}, {0x4603c000}, {0x4603e000}, 
-    {0x46040000}, {0x46042000}, {0x46044000}, {0x46046000}, 
-    {0x46048000}, {0x4604a000}, {0x4604c000}, {0x4604e000}, 
-    {0x46050000}, {0x46052000}, {0x46054000}, {0x46056000}, 
-    {0x46058000}, {0x4605a000}, {0x4605c000}, {0x4605e000}, 
-    {0x46060000}, {0x46062000}, {0x46064000}, {0x46066000}, 
-    {0x46068000}, {0x4606a000}, {0x4606c000}, {0x4606e000}, 
-    {0x46070000}, {0x46072000}, {0x46074000}, {0x46076000}, 
-    {0x46078000}, {0x4607a000}, {0x4607c000}, {0x4607e000}, 
-    {0x46080000}, {0x46082000}, {0x46084000}, {0x46086000}, 
-    {0x46088000}, {0x4608a000}, {0x4608c000}, {0x4608e000}, 
-    {0x46090000}, {0x46092000}, {0x46094000}, {0x46096000}, 
-    {0x46098000}, {0x4609a000}, {0x4609c000}, {0x4609e000}, 
-    {0x460a0000}, {0x460a2000}, {0x460a4000}, {0x460a6000}, 
-    {0x460a8000}, {0x460aa000}, {0x460ac000}, {0x460ae000}, 
-    {0x460b0000}, {0x460b2000}, {0x460b4000}, {0x460b6000}, 
-    {0x460b8000}, {0x460ba000}, {0x460bc000}, {0x460be000}, 
-    {0x460c0000}, {0x460c2000}, {0x460c4000}, {0x460c6000}, 
-    {0x460c8000}, {0x460ca000}, {0x460cc000}, {0x460ce000}, 
-    {0x460d0000}, {0x460d2000}, {0x460d4000}, {0x460d6000}, 
-    {0x460d8000}, {0x460da000}, {0x460dc000}, {0x460de000}, 
-    {0x460e0000}, {0x460e2000}, {0x460e4000}, {0x460e6000}, 
-    {0x460e8000}, {0x460ea000}, {0x460ec000}, {0x460ee000}, 
-    {0x460f0000}, {0x460f2000}, {0x460f4000}, {0x460f6000}, 
-    {0x460f8000}, {0x460fa000}, {0x460fc000}, {0x460fe000}, 
-    {0x46100000}, {0x46102000}, {0x46104000}, {0x46106000}, 
-    {0x46108000}, {0x4610a000}, {0x4610c000}, {0x4610e000}, 
-    {0x46110000}, {0x46112000}, {0x46114000}, {0x46116000}, 
-    {0x46118000}, {0x4611a000}, {0x4611c000}, {0x4611e000}, 
-    {0x46120000}, {0x46122000}, {0x46124000}, {0x46126000}, 
-    {0x46128000}, {0x4612a000}, {0x4612c000}, {0x4612e000}, 
-    {0x46130000}, {0x46132000}, {0x46134000}, {0x46136000}, 
-    {0x46138000}, {0x4613a000}, {0x4613c000}, {0x4613e000}, 
-    {0x46140000}, {0x46142000}, {0x46144000}, {0x46146000}, 
-    {0x46148000}, {0x4614a000}, {0x4614c000}, {0x4614e000}, 
-    {0x46150000}, {0x46152000}, {0x46154000}, {0x46156000}, 
-    {0x46158000}, {0x4615a000}, {0x4615c000}, {0x4615e000}, 
-    {0x46160000}, {0x46162000}, {0x46164000}, {0x46166000}, 
-    {0x46168000}, {0x4616a000}, {0x4616c000}, {0x4616e000}, 
-    {0x46170000}, {0x46172000}, {0x46174000}, {0x46176000}, 
-    {0x46178000}, {0x4617a000}, {0x4617c000}, {0x4617e000}, 
-    {0x46180000}, {0x46182000}, {0x46184000}, {0x46186000}, 
-    {0x46188000}, {0x4618a000}, {0x4618c000}, {0x4618e000}, 
-    {0x46190000}, {0x46192000}, {0x46194000}, {0x46196000}, 
-    {0x46198000}, {0x4619a000}, {0x4619c000}, {0x4619e000}, 
-    {0x461a0000}, {0x461a2000}, {0x461a4000}, {0x461a6000}, 
-    {0x461a8000}, {0x461aa000}, {0x461ac000}, {0x461ae000}, 
-    {0x461b0000}, {0x461b2000}, {0x461b4000}, {0x461b6000}, 
-    {0x461b8000}, {0x461ba000}, {0x461bc000}, {0x461be000}, 
-    {0x461c0000}, {0x461c2000}, {0x461c4000}, {0x461c6000}, 
-    {0x461c8000}, {0x461ca000}, {0x461cc000}, {0x461ce000}, 
-    {0x461d0000}, {0x461d2000}, {0x461d4000}, {0x461d6000}, 
-    {0x461d8000}, {0x461da000}, {0x461dc000}, {0x461de000}, 
-    {0x461e0000}, {0x461e2000}, {0x461e4000}, {0x461e6000}, 
-    {0x461e8000}, {0x461ea000}, {0x461ec000}, {0x461ee000}, 
-    {0x461f0000}, {0x461f2000}, {0x461f4000}, {0x461f6000}, 
-    {0x461f8000}, {0x461fa000}, {0x461fc000}, {0x461fe000}, 
-    {0x46200000}, {0x46202000}, {0x46204000}, {0x46206000}, 
-    {0x46208000}, {0x4620a000}, {0x4620c000}, {0x4620e000}, 
-    {0x46210000}, {0x46212000}, {0x46214000}, {0x46216000}, 
-    {0x46218000}, {0x4621a000}, {0x4621c000}, {0x4621e000}, 
-    {0x46220000}, {0x46222000}, {0x46224000}, {0x46226000}, 
-    {0x46228000}, {0x4622a000}, {0x4622c000}, {0x4622e000}, 
-    {0x46230000}, {0x46232000}, {0x46234000}, {0x46236000}, 
-    {0x46238000}, {0x4623a000}, {0x4623c000}, {0x4623e000}, 
-    {0x46240000}, {0x46242000}, {0x46244000}, {0x46246000}, 
-    {0x46248000}, {0x4624a000}, {0x4624c000}, {0x4624e000}, 
-    {0x46250000}, {0x46252000}, {0x46254000}, {0x46256000}, 
-    {0x46258000}, {0x4625a000}, {0x4625c000}, {0x4625e000}, 
-    {0x46260000}, {0x46262000}, {0x46264000}, {0x46266000}, 
-    {0x46268000}, {0x4626a000}, {0x4626c000}, {0x4626e000}, 
-    {0x46270000}, {0x46272000}, {0x46274000}, {0x46276000}, 
-    {0x46278000}, {0x4627a000}, {0x4627c000}, {0x4627e000}, 
-    {0x46280000}, {0x46282000}, {0x46284000}, {0x46286000}, 
-    {0x46288000}, {0x4628a000}, {0x4628c000}, {0x4628e000}, 
-    {0x46290000}, {0x46292000}, {0x46294000}, {0x46296000}, 
-    {0x46298000}, {0x4629a000}, {0x4629c000}, {0x4629e000}, 
-    {0x462a0000}, {0x462a2000}, {0x462a4000}, {0x462a6000}, 
-    {0x462a8000}, {0x462aa000}, {0x462ac000}, {0x462ae000}, 
-    {0x462b0000}, {0x462b2000}, {0x462b4000}, {0x462b6000}, 
-    {0x462b8000}, {0x462ba000}, {0x462bc000}, {0x462be000}, 
-    {0x462c0000}, {0x462c2000}, {0x462c4000}, {0x462c6000}, 
-    {0x462c8000}, {0x462ca000}, {0x462cc000}, {0x462ce000}, 
-    {0x462d0000}, {0x462d2000}, {0x462d4000}, {0x462d6000}, 
-    {0x462d8000}, {0x462da000}, {0x462dc000}, {0x462de000}, 
-    {0x462e0000}, {0x462e2000}, {0x462e4000}, {0x462e6000}, 
-    {0x462e8000}, {0x462ea000}, {0x462ec000}, {0x462ee000}, 
-    {0x462f0000}, {0x462f2000}, {0x462f4000}, {0x462f6000}, 
-    {0x462f8000}, {0x462fa000}, {0x462fc000}, {0x462fe000}, 
-    {0x46300000}, {0x46302000}, {0x46304000}, {0x46306000}, 
-    {0x46308000}, {0x4630a000}, {0x4630c000}, {0x4630e000}, 
-    {0x46310000}, {0x46312000}, {0x46314000}, {0x46316000}, 
-    {0x46318000}, {0x4631a000}, {0x4631c000}, {0x4631e000}, 
-    {0x46320000}, {0x46322000}, {0x46324000}, {0x46326000}, 
-    {0x46328000}, {0x4632a000}, {0x4632c000}, {0x4632e000}, 
-    {0x46330000}, {0x46332000}, {0x46334000}, {0x46336000}, 
-    {0x46338000}, {0x4633a000}, {0x4633c000}, {0x4633e000}, 
-    {0x46340000}, {0x46342000}, {0x46344000}, {0x46346000}, 
-    {0x46348000}, {0x4634a000}, {0x4634c000}, {0x4634e000}, 
-    {0x46350000}, {0x46352000}, {0x46354000}, {0x46356000}, 
-    {0x46358000}, {0x4635a000}, {0x4635c000}, {0x4635e000}, 
-    {0x46360000}, {0x46362000}, {0x46364000}, {0x46366000}, 
-    {0x46368000}, {0x4636a000}, {0x4636c000}, {0x4636e000}, 
-    {0x46370000}, {0x46372000}, {0x46374000}, {0x46376000}, 
-    {0x46378000}, {0x4637a000}, {0x4637c000}, {0x4637e000}, 
-    {0x46380000}, {0x46382000}, {0x46384000}, {0x46386000}, 
-    {0x46388000}, {0x4638a000}, {0x4638c000}, {0x4638e000}, 
-    {0x46390000}, {0x46392000}, {0x46394000}, {0x46396000}, 
-    {0x46398000}, {0x4639a000}, {0x4639c000}, {0x4639e000}, 
-    {0x463a0000}, {0x463a2000}, {0x463a4000}, {0x463a6000}, 
-    {0x463a8000}, {0x463aa000}, {0x463ac000}, {0x463ae000}, 
-    {0x463b0000}, {0x463b2000}, {0x463b4000}, {0x463b6000}, 
-    {0x463b8000}, {0x463ba000}, {0x463bc000}, {0x463be000}, 
-    {0x463c0000}, {0x463c2000}, {0x463c4000}, {0x463c6000}, 
-    {0x463c8000}, {0x463ca000}, {0x463cc000}, {0x463ce000}, 
-    {0x463d0000}, {0x463d2000}, {0x463d4000}, {0x463d6000}, 
-    {0x463d8000}, {0x463da000}, {0x463dc000}, {0x463de000}, 
-    {0x463e0000}, {0x463e2000}, {0x463e4000}, {0x463e6000}, 
-    {0x463e8000}, {0x463ea000}, {0x463ec000}, {0x463ee000}, 
-    {0x463f0000}, {0x463f2000}, {0x463f4000}, {0x463f6000}, 
-    {0x463f8000}, {0x463fa000}, {0x463fc000}, {0x463fe000}, 
-    {0x46400000}, {0x46402000}, {0x46404000}, {0x46406000}, 
-    {0x46408000}, {0x4640a000}, {0x4640c000}, {0x4640e000}, 
-    {0x46410000}, {0x46412000}, {0x46414000}, {0x46416000}, 
-    {0x46418000}, {0x4641a000}, {0x4641c000}, {0x4641e000}, 
-    {0x46420000}, {0x46422000}, {0x46424000}, {0x46426000}, 
-    {0x46428000}, {0x4642a000}, {0x4642c000}, {0x4642e000}, 
-    {0x46430000}, {0x46432000}, {0x46434000}, {0x46436000}, 
-    {0x46438000}, {0x4643a000}, {0x4643c000}, {0x4643e000}, 
-    {0x46440000}, {0x46442000}, {0x46444000}, {0x46446000}, 
-    {0x46448000}, {0x4644a000}, {0x4644c000}, {0x4644e000}, 
-    {0x46450000}, {0x46452000}, {0x46454000}, {0x46456000}, 
-    {0x46458000}, {0x4645a000}, {0x4645c000}, {0x4645e000}, 
-    {0x46460000}, {0x46462000}, {0x46464000}, {0x46466000}, 
-    {0x46468000}, {0x4646a000}, {0x4646c000}, {0x4646e000}, 
-    {0x46470000}, {0x46472000}, {0x46474000}, {0x46476000}, 
-    {0x46478000}, {0x4647a000}, {0x4647c000}, {0x4647e000}, 
-    {0x46480000}, {0x46482000}, {0x46484000}, {0x46486000}, 
-    {0x46488000}, {0x4648a000}, {0x4648c000}, {0x4648e000}, 
-    {0x46490000}, {0x46492000}, {0x46494000}, {0x46496000}, 
-    {0x46498000}, {0x4649a000}, {0x4649c000}, {0x4649e000}, 
-    {0x464a0000}, {0x464a2000}, {0x464a4000}, {0x464a6000}, 
-    {0x464a8000}, {0x464aa000}, {0x464ac000}, {0x464ae000}, 
-    {0x464b0000}, {0x464b2000}, {0x464b4000}, {0x464b6000}, 
-    {0x464b8000}, {0x464ba000}, {0x464bc000}, {0x464be000}, 
-    {0x464c0000}, {0x464c2000}, {0x464c4000}, {0x464c6000}, 
-    {0x464c8000}, {0x464ca000}, {0x464cc000}, {0x464ce000}, 
-    {0x464d0000}, {0x464d2000}, {0x464d4000}, {0x464d6000}, 
-    {0x464d8000}, {0x464da000}, {0x464dc000}, {0x464de000}, 
-    {0x464e0000}, {0x464e2000}, {0x464e4000}, {0x464e6000}, 
-    {0x464e8000}, {0x464ea000}, {0x464ec000}, {0x464ee000}, 
-    {0x464f0000}, {0x464f2000}, {0x464f4000}, {0x464f6000}, 
-    {0x464f8000}, {0x464fa000}, {0x464fc000}, {0x464fe000}, 
-    {0x46500000}, {0x46502000}, {0x46504000}, {0x46506000}, 
-    {0x46508000}, {0x4650a000}, {0x4650c000}, {0x4650e000}, 
-    {0x46510000}, {0x46512000}, {0x46514000}, {0x46516000}, 
-    {0x46518000}, {0x4651a000}, {0x4651c000}, {0x4651e000}, 
-    {0x46520000}, {0x46522000}, {0x46524000}, {0x46526000}, 
-    {0x46528000}, {0x4652a000}, {0x4652c000}, {0x4652e000}, 
-    {0x46530000}, {0x46532000}, {0x46534000}, {0x46536000}, 
-    {0x46538000}, {0x4653a000}, {0x4653c000}, {0x4653e000}, 
-    {0x46540000}, {0x46542000}, {0x46544000}, {0x46546000}, 
-    {0x46548000}, {0x4654a000}, {0x4654c000}, {0x4654e000}, 
-    {0x46550000}, {0x46552000}, {0x46554000}, {0x46556000}, 
-    {0x46558000}, {0x4655a000}, {0x4655c000}, {0x4655e000}, 
-    {0x46560000}, {0x46562000}, {0x46564000}, {0x46566000}, 
-    {0x46568000}, {0x4656a000}, {0x4656c000}, {0x4656e000}, 
-    {0x46570000}, {0x46572000}, {0x46574000}, {0x46576000}, 
-    {0x46578000}, {0x4657a000}, {0x4657c000}, {0x4657e000}, 
-    {0x46580000}, {0x46582000}, {0x46584000}, {0x46586000}, 
-    {0x46588000}, {0x4658a000}, {0x4658c000}, {0x4658e000}, 
-    {0x46590000}, {0x46592000}, {0x46594000}, {0x46596000}, 
-    {0x46598000}, {0x4659a000}, {0x4659c000}, {0x4659e000}, 
-    {0x465a0000}, {0x465a2000}, {0x465a4000}, {0x465a6000}, 
-    {0x465a8000}, {0x465aa000}, {0x465ac000}, {0x465ae000}, 
-    {0x465b0000}, {0x465b2000}, {0x465b4000}, {0x465b6000}, 
-    {0x465b8000}, {0x465ba000}, {0x465bc000}, {0x465be000}, 
-    {0x465c0000}, {0x465c2000}, {0x465c4000}, {0x465c6000}, 
-    {0x465c8000}, {0x465ca000}, {0x465cc000}, {0x465ce000}, 
-    {0x465d0000}, {0x465d2000}, {0x465d4000}, {0x465d6000}, 
-    {0x465d8000}, {0x465da000}, {0x465dc000}, {0x465de000}, 
-    {0x465e0000}, {0x465e2000}, {0x465e4000}, {0x465e6000}, 
-    {0x465e8000}, {0x465ea000}, {0x465ec000}, {0x465ee000}, 
-    {0x465f0000}, {0x465f2000}, {0x465f4000}, {0x465f6000}, 
-    {0x465f8000}, {0x465fa000}, {0x465fc000}, {0x465fe000}, 
-    {0x46600000}, {0x46602000}, {0x46604000}, {0x46606000}, 
-    {0x46608000}, {0x4660a000}, {0x4660c000}, {0x4660e000}, 
-    {0x46610000}, {0x46612000}, {0x46614000}, {0x46616000}, 
-    {0x46618000}, {0x4661a000}, {0x4661c000}, {0x4661e000}, 
-    {0x46620000}, {0x46622000}, {0x46624000}, {0x46626000}, 
-    {0x46628000}, {0x4662a000}, {0x4662c000}, {0x4662e000}, 
-    {0x46630000}, {0x46632000}, {0x46634000}, {0x46636000}, 
-    {0x46638000}, {0x4663a000}, {0x4663c000}, {0x4663e000}, 
-    {0x46640000}, {0x46642000}, {0x46644000}, {0x46646000}, 
-    {0x46648000}, {0x4664a000}, {0x4664c000}, {0x4664e000}, 
-    {0x46650000}, {0x46652000}, {0x46654000}, {0x46656000}, 
-    {0x46658000}, {0x4665a000}, {0x4665c000}, {0x4665e000}, 
-    {0x46660000}, {0x46662000}, {0x46664000}, {0x46666000}, 
-    {0x46668000}, {0x4666a000}, {0x4666c000}, {0x4666e000}, 
-    {0x46670000}, {0x46672000}, {0x46674000}, {0x46676000}, 
-    {0x46678000}, {0x4667a000}, {0x4667c000}, {0x4667e000}, 
-    {0x46680000}, {0x46682000}, {0x46684000}, {0x46686000}, 
-    {0x46688000}, {0x4668a000}, {0x4668c000}, {0x4668e000}, 
-    {0x46690000}, {0x46692000}, {0x46694000}, {0x46696000}, 
-    {0x46698000}, {0x4669a000}, {0x4669c000}, {0x4669e000}, 
-    {0x466a0000}, {0x466a2000}, {0x466a4000}, {0x466a6000}, 
-    {0x466a8000}, {0x466aa000}, {0x466ac000}, {0x466ae000}, 
-    {0x466b0000}, {0x466b2000}, {0x466b4000}, {0x466b6000}, 
-    {0x466b8000}, {0x466ba000}, {0x466bc000}, {0x466be000}, 
-    {0x466c0000}, {0x466c2000}, {0x466c4000}, {0x466c6000}, 
-    {0x466c8000}, {0x466ca000}, {0x466cc000}, {0x466ce000}, 
-    {0x466d0000}, {0x466d2000}, {0x466d4000}, {0x466d6000}, 
-    {0x466d8000}, {0x466da000}, {0x466dc000}, {0x466de000}, 
-    {0x466e0000}, {0x466e2000}, {0x466e4000}, {0x466e6000}, 
-    {0x466e8000}, {0x466ea000}, {0x466ec000}, {0x466ee000}, 
-    {0x466f0000}, {0x466f2000}, {0x466f4000}, {0x466f6000}, 
-    {0x466f8000}, {0x466fa000}, {0x466fc000}, {0x466fe000}, 
-    {0x46700000}, {0x46702000}, {0x46704000}, {0x46706000}, 
-    {0x46708000}, {0x4670a000}, {0x4670c000}, {0x4670e000}, 
-    {0x46710000}, {0x46712000}, {0x46714000}, {0x46716000}, 
-    {0x46718000}, {0x4671a000}, {0x4671c000}, {0x4671e000}, 
-    {0x46720000}, {0x46722000}, {0x46724000}, {0x46726000}, 
-    {0x46728000}, {0x4672a000}, {0x4672c000}, {0x4672e000}, 
-    {0x46730000}, {0x46732000}, {0x46734000}, {0x46736000}, 
-    {0x46738000}, {0x4673a000}, {0x4673c000}, {0x4673e000}, 
-    {0x46740000}, {0x46742000}, {0x46744000}, {0x46746000}, 
-    {0x46748000}, {0x4674a000}, {0x4674c000}, {0x4674e000}, 
-    {0x46750000}, {0x46752000}, {0x46754000}, {0x46756000}, 
-    {0x46758000}, {0x4675a000}, {0x4675c000}, {0x4675e000}, 
-    {0x46760000}, {0x46762000}, {0x46764000}, {0x46766000}, 
-    {0x46768000}, {0x4676a000}, {0x4676c000}, {0x4676e000}, 
-    {0x46770000}, {0x46772000}, {0x46774000}, {0x46776000}, 
-    {0x46778000}, {0x4677a000}, {0x4677c000}, {0x4677e000}, 
-    {0x46780000}, {0x46782000}, {0x46784000}, {0x46786000}, 
-    {0x46788000}, {0x4678a000}, {0x4678c000}, {0x4678e000}, 
-    {0x46790000}, {0x46792000}, {0x46794000}, {0x46796000}, 
-    {0x46798000}, {0x4679a000}, {0x4679c000}, {0x4679e000}, 
-    {0x467a0000}, {0x467a2000}, {0x467a4000}, {0x467a6000}, 
-    {0x467a8000}, {0x467aa000}, {0x467ac000}, {0x467ae000}, 
-    {0x467b0000}, {0x467b2000}, {0x467b4000}, {0x467b6000}, 
-    {0x467b8000}, {0x467ba000}, {0x467bc000}, {0x467be000}, 
-    {0x467c0000}, {0x467c2000}, {0x467c4000}, {0x467c6000}, 
-    {0x467c8000}, {0x467ca000}, {0x467cc000}, {0x467ce000}, 
-    {0x467d0000}, {0x467d2000}, {0x467d4000}, {0x467d6000}, 
-    {0x467d8000}, {0x467da000}, {0x467dc000}, {0x467de000}, 
-    {0x467e0000}, {0x467e2000}, {0x467e4000}, {0x467e6000}, 
-    {0x467e8000}, {0x467ea000}, {0x467ec000}, {0x467ee000}, 
-    {0x467f0000}, {0x467f2000}, {0x467f4000}, {0x467f6000}, 
-    {0x467f8000}, {0x467fa000}, {0x467fc000}, {0x467fe000}, 
-    {0x46800000}, {0x46802000}, {0x46804000}, {0x46806000}, 
-    {0x46808000}, {0x4680a000}, {0x4680c000}, {0x4680e000}, 
-    {0x46810000}, {0x46812000}, {0x46814000}, {0x46816000}, 
-    {0x46818000}, {0x4681a000}, {0x4681c000}, {0x4681e000}, 
-    {0x46820000}, {0x46822000}, {0x46824000}, {0x46826000}, 
-    {0x46828000}, {0x4682a000}, {0x4682c000}, {0x4682e000}, 
-    {0x46830000}, {0x46832000}, {0x46834000}, {0x46836000}, 
-    {0x46838000}, {0x4683a000}, {0x4683c000}, {0x4683e000}, 
-    {0x46840000}, {0x46842000}, {0x46844000}, {0x46846000}, 
-    {0x46848000}, {0x4684a000}, {0x4684c000}, {0x4684e000}, 
-    {0x46850000}, {0x46852000}, {0x46854000}, {0x46856000}, 
-    {0x46858000}, {0x4685a000}, {0x4685c000}, {0x4685e000}, 
-    {0x46860000}, {0x46862000}, {0x46864000}, {0x46866000}, 
-    {0x46868000}, {0x4686a000}, {0x4686c000}, {0x4686e000}, 
-    {0x46870000}, {0x46872000}, {0x46874000}, {0x46876000}, 
-    {0x46878000}, {0x4687a000}, {0x4687c000}, {0x4687e000}, 
-    {0x46880000}, {0x46882000}, {0x46884000}, {0x46886000}, 
-    {0x46888000}, {0x4688a000}, {0x4688c000}, {0x4688e000}, 
-    {0x46890000}, {0x46892000}, {0x46894000}, {0x46896000}, 
-    {0x46898000}, {0x4689a000}, {0x4689c000}, {0x4689e000}, 
-    {0x468a0000}, {0x468a2000}, {0x468a4000}, {0x468a6000}, 
-    {0x468a8000}, {0x468aa000}, {0x468ac000}, {0x468ae000}, 
-    {0x468b0000}, {0x468b2000}, {0x468b4000}, {0x468b6000}, 
-    {0x468b8000}, {0x468ba000}, {0x468bc000}, {0x468be000}, 
-    {0x468c0000}, {0x468c2000}, {0x468c4000}, {0x468c6000}, 
-    {0x468c8000}, {0x468ca000}, {0x468cc000}, {0x468ce000}, 
-    {0x468d0000}, {0x468d2000}, {0x468d4000}, {0x468d6000}, 
-    {0x468d8000}, {0x468da000}, {0x468dc000}, {0x468de000}, 
-    {0x468e0000}, {0x468e2000}, {0x468e4000}, {0x468e6000}, 
-    {0x468e8000}, {0x468ea000}, {0x468ec000}, {0x468ee000}, 
-    {0x468f0000}, {0x468f2000}, {0x468f4000}, {0x468f6000}, 
-    {0x468f8000}, {0x468fa000}, {0x468fc000}, {0x468fe000}, 
-    {0x46900000}, {0x46902000}, {0x46904000}, {0x46906000}, 
-    {0x46908000}, {0x4690a000}, {0x4690c000}, {0x4690e000}, 
-    {0x46910000}, {0x46912000}, {0x46914000}, {0x46916000}, 
-    {0x46918000}, {0x4691a000}, {0x4691c000}, {0x4691e000}, 
-    {0x46920000}, {0x46922000}, {0x46924000}, {0x46926000}, 
-    {0x46928000}, {0x4692a000}, {0x4692c000}, {0x4692e000}, 
-    {0x46930000}, {0x46932000}, {0x46934000}, {0x46936000}, 
-    {0x46938000}, {0x4693a000}, {0x4693c000}, {0x4693e000}, 
-    {0x46940000}, {0x46942000}, {0x46944000}, {0x46946000}, 
-    {0x46948000}, {0x4694a000}, {0x4694c000}, {0x4694e000}, 
-    {0x46950000}, {0x46952000}, {0x46954000}, {0x46956000}, 
-    {0x46958000}, {0x4695a000}, {0x4695c000}, {0x4695e000}, 
-    {0x46960000}, {0x46962000}, {0x46964000}, {0x46966000}, 
-    {0x46968000}, {0x4696a000}, {0x4696c000}, {0x4696e000}, 
-    {0x46970000}, {0x46972000}, {0x46974000}, {0x46976000}, 
-    {0x46978000}, {0x4697a000}, {0x4697c000}, {0x4697e000}, 
-    {0x46980000}, {0x46982000}, {0x46984000}, {0x46986000}, 
-    {0x46988000}, {0x4698a000}, {0x4698c000}, {0x4698e000}, 
-    {0x46990000}, {0x46992000}, {0x46994000}, {0x46996000}, 
-    {0x46998000}, {0x4699a000}, {0x4699c000}, {0x4699e000}, 
-    {0x469a0000}, {0x469a2000}, {0x469a4000}, {0x469a6000}, 
-    {0x469a8000}, {0x469aa000}, {0x469ac000}, {0x469ae000}, 
-    {0x469b0000}, {0x469b2000}, {0x469b4000}, {0x469b6000}, 
-    {0x469b8000}, {0x469ba000}, {0x469bc000}, {0x469be000}, 
-    {0x469c0000}, {0x469c2000}, {0x469c4000}, {0x469c6000}, 
-    {0x469c8000}, {0x469ca000}, {0x469cc000}, {0x469ce000}, 
-    {0x469d0000}, {0x469d2000}, {0x469d4000}, {0x469d6000}, 
-    {0x469d8000}, {0x469da000}, {0x469dc000}, {0x469de000}, 
-    {0x469e0000}, {0x469e2000}, {0x469e4000}, {0x469e6000}, 
-    {0x469e8000}, {0x469ea000}, {0x469ec000}, {0x469ee000}, 
-    {0x469f0000}, {0x469f2000}, {0x469f4000}, {0x469f6000}, 
-    {0x469f8000}, {0x469fa000}, {0x469fc000}, {0x469fe000}, 
-    {0x46a00000}, {0x46a02000}, {0x46a04000}, {0x46a06000}, 
-    {0x46a08000}, {0x46a0a000}, {0x46a0c000}, {0x46a0e000}, 
-    {0x46a10000}, {0x46a12000}, {0x46a14000}, {0x46a16000}, 
-    {0x46a18000}, {0x46a1a000}, {0x46a1c000}, {0x46a1e000}, 
-    {0x46a20000}, {0x46a22000}, {0x46a24000}, {0x46a26000}, 
-    {0x46a28000}, {0x46a2a000}, {0x46a2c000}, {0x46a2e000}, 
-    {0x46a30000}, {0x46a32000}, {0x46a34000}, {0x46a36000}, 
-    {0x46a38000}, {0x46a3a000}, {0x46a3c000}, {0x46a3e000}, 
-    {0x46a40000}, {0x46a42000}, {0x46a44000}, {0x46a46000}, 
-    {0x46a48000}, {0x46a4a000}, {0x46a4c000}, {0x46a4e000}, 
-    {0x46a50000}, {0x46a52000}, {0x46a54000}, {0x46a56000}, 
-    {0x46a58000}, {0x46a5a000}, {0x46a5c000}, {0x46a5e000}, 
-    {0x46a60000}, {0x46a62000}, {0x46a64000}, {0x46a66000}, 
-    {0x46a68000}, {0x46a6a000}, {0x46a6c000}, {0x46a6e000}, 
-    {0x46a70000}, {0x46a72000}, {0x46a74000}, {0x46a76000}, 
-    {0x46a78000}, {0x46a7a000}, {0x46a7c000}, {0x46a7e000}, 
-    {0x46a80000}, {0x46a82000}, {0x46a84000}, {0x46a86000}, 
-    {0x46a88000}, {0x46a8a000}, {0x46a8c000}, {0x46a8e000}, 
-    {0x46a90000}, {0x46a92000}, {0x46a94000}, {0x46a96000}, 
-    {0x46a98000}, {0x46a9a000}, {0x46a9c000}, {0x46a9e000}, 
-    {0x46aa0000}, {0x46aa2000}, {0x46aa4000}, {0x46aa6000}, 
-    {0x46aa8000}, {0x46aaa000}, {0x46aac000}, {0x46aae000}, 
-    {0x46ab0000}, {0x46ab2000}, {0x46ab4000}, {0x46ab6000}, 
-    {0x46ab8000}, {0x46aba000}, {0x46abc000}, {0x46abe000}, 
-    {0x46ac0000}, {0x46ac2000}, {0x46ac4000}, {0x46ac6000}, 
-    {0x46ac8000}, {0x46aca000}, {0x46acc000}, {0x46ace000}, 
-    {0x46ad0000}, {0x46ad2000}, {0x46ad4000}, {0x46ad6000}, 
-    {0x46ad8000}, {0x46ada000}, {0x46adc000}, {0x46ade000}, 
-    {0x46ae0000}, {0x46ae2000}, {0x46ae4000}, {0x46ae6000}, 
-    {0x46ae8000}, {0x46aea000}, {0x46aec000}, {0x46aee000}, 
-    {0x46af0000}, {0x46af2000}, {0x46af4000}, {0x46af6000}, 
-    {0x46af8000}, {0x46afa000}, {0x46afc000}, {0x46afe000}, 
-    {0x46b00000}, {0x46b02000}, {0x46b04000}, {0x46b06000}, 
-    {0x46b08000}, {0x46b0a000}, {0x46b0c000}, {0x46b0e000}, 
-    {0x46b10000}, {0x46b12000}, {0x46b14000}, {0x46b16000}, 
-    {0x46b18000}, {0x46b1a000}, {0x46b1c000}, {0x46b1e000}, 
-    {0x46b20000}, {0x46b22000}, {0x46b24000}, {0x46b26000}, 
-    {0x46b28000}, {0x46b2a000}, {0x46b2c000}, {0x46b2e000}, 
-    {0x46b30000}, {0x46b32000}, {0x46b34000}, {0x46b36000}, 
-    {0x46b38000}, {0x46b3a000}, {0x46b3c000}, {0x46b3e000}, 
-    {0x46b40000}, {0x46b42000}, {0x46b44000}, {0x46b46000}, 
-    {0x46b48000}, {0x46b4a000}, {0x46b4c000}, {0x46b4e000}, 
-    {0x46b50000}, {0x46b52000}, {0x46b54000}, {0x46b56000}, 
-    {0x46b58000}, {0x46b5a000}, {0x46b5c000}, {0x46b5e000}, 
-    {0x46b60000}, {0x46b62000}, {0x46b64000}, {0x46b66000}, 
-    {0x46b68000}, {0x46b6a000}, {0x46b6c000}, {0x46b6e000}, 
-    {0x46b70000}, {0x46b72000}, {0x46b74000}, {0x46b76000}, 
-    {0x46b78000}, {0x46b7a000}, {0x46b7c000}, {0x46b7e000}, 
-    {0x46b80000}, {0x46b82000}, {0x46b84000}, {0x46b86000}, 
-    {0x46b88000}, {0x46b8a000}, {0x46b8c000}, {0x46b8e000}, 
-    {0x46b90000}, {0x46b92000}, {0x46b94000}, {0x46b96000}, 
-    {0x46b98000}, {0x46b9a000}, {0x46b9c000}, {0x46b9e000}, 
-    {0x46ba0000}, {0x46ba2000}, {0x46ba4000}, {0x46ba6000}, 
-    {0x46ba8000}, {0x46baa000}, {0x46bac000}, {0x46bae000}, 
-    {0x46bb0000}, {0x46bb2000}, {0x46bb4000}, {0x46bb6000}, 
-    {0x46bb8000}, {0x46bba000}, {0x46bbc000}, {0x46bbe000}, 
-    {0x46bc0000}, {0x46bc2000}, {0x46bc4000}, {0x46bc6000}, 
-    {0x46bc8000}, {0x46bca000}, {0x46bcc000}, {0x46bce000}, 
-    {0x46bd0000}, {0x46bd2000}, {0x46bd4000}, {0x46bd6000}, 
-    {0x46bd8000}, {0x46bda000}, {0x46bdc000}, {0x46bde000}, 
-    {0x46be0000}, {0x46be2000}, {0x46be4000}, {0x46be6000}, 
-    {0x46be8000}, {0x46bea000}, {0x46bec000}, {0x46bee000}, 
-    {0x46bf0000}, {0x46bf2000}, {0x46bf4000}, {0x46bf6000}, 
-    {0x46bf8000}, {0x46bfa000}, {0x46bfc000}, {0x46bfe000}, 
-    {0x46c00000}, {0x46c02000}, {0x46c04000}, {0x46c06000}, 
-    {0x46c08000}, {0x46c0a000}, {0x46c0c000}, {0x46c0e000}, 
-    {0x46c10000}, {0x46c12000}, {0x46c14000}, {0x46c16000}, 
-    {0x46c18000}, {0x46c1a000}, {0x46c1c000}, {0x46c1e000}, 
-    {0x46c20000}, {0x46c22000}, {0x46c24000}, {0x46c26000}, 
-    {0x46c28000}, {0x46c2a000}, {0x46c2c000}, {0x46c2e000}, 
-    {0x46c30000}, {0x46c32000}, {0x46c34000}, {0x46c36000}, 
-    {0x46c38000}, {0x46c3a000}, {0x46c3c000}, {0x46c3e000}, 
-    {0x46c40000}, {0x46c42000}, {0x46c44000}, {0x46c46000}, 
-    {0x46c48000}, {0x46c4a000}, {0x46c4c000}, {0x46c4e000}, 
-    {0x46c50000}, {0x46c52000}, {0x46c54000}, {0x46c56000}, 
-    {0x46c58000}, {0x46c5a000}, {0x46c5c000}, {0x46c5e000}, 
-    {0x46c60000}, {0x46c62000}, {0x46c64000}, {0x46c66000}, 
-    {0x46c68000}, {0x46c6a000}, {0x46c6c000}, {0x46c6e000}, 
-    {0x46c70000}, {0x46c72000}, {0x46c74000}, {0x46c76000}, 
-    {0x46c78000}, {0x46c7a000}, {0x46c7c000}, {0x46c7e000}, 
-    {0x46c80000}, {0x46c82000}, {0x46c84000}, {0x46c86000}, 
-    {0x46c88000}, {0x46c8a000}, {0x46c8c000}, {0x46c8e000}, 
-    {0x46c90000}, {0x46c92000}, {0x46c94000}, {0x46c96000}, 
-    {0x46c98000}, {0x46c9a000}, {0x46c9c000}, {0x46c9e000}, 
-    {0x46ca0000}, {0x46ca2000}, {0x46ca4000}, {0x46ca6000}, 
-    {0x46ca8000}, {0x46caa000}, {0x46cac000}, {0x46cae000}, 
-    {0x46cb0000}, {0x46cb2000}, {0x46cb4000}, {0x46cb6000}, 
-    {0x46cb8000}, {0x46cba000}, {0x46cbc000}, {0x46cbe000}, 
-    {0x46cc0000}, {0x46cc2000}, {0x46cc4000}, {0x46cc6000}, 
-    {0x46cc8000}, {0x46cca000}, {0x46ccc000}, {0x46cce000}, 
-    {0x46cd0000}, {0x46cd2000}, {0x46cd4000}, {0x46cd6000}, 
-    {0x46cd8000}, {0x46cda000}, {0x46cdc000}, {0x46cde000}, 
-    {0x46ce0000}, {0x46ce2000}, {0x46ce4000}, {0x46ce6000}, 
-    {0x46ce8000}, {0x46cea000}, {0x46cec000}, {0x46cee000}, 
-    {0x46cf0000}, {0x46cf2000}, {0x46cf4000}, {0x46cf6000}, 
-    {0x46cf8000}, {0x46cfa000}, {0x46cfc000}, {0x46cfe000}, 
-    {0x46d00000}, {0x46d02000}, {0x46d04000}, {0x46d06000}, 
-    {0x46d08000}, {0x46d0a000}, {0x46d0c000}, {0x46d0e000}, 
-    {0x46d10000}, {0x46d12000}, {0x46d14000}, {0x46d16000}, 
-    {0x46d18000}, {0x46d1a000}, {0x46d1c000}, {0x46d1e000}, 
-    {0x46d20000}, {0x46d22000}, {0x46d24000}, {0x46d26000}, 
-    {0x46d28000}, {0x46d2a000}, {0x46d2c000}, {0x46d2e000}, 
-    {0x46d30000}, {0x46d32000}, {0x46d34000}, {0x46d36000}, 
-    {0x46d38000}, {0x46d3a000}, {0x46d3c000}, {0x46d3e000}, 
-    {0x46d40000}, {0x46d42000}, {0x46d44000}, {0x46d46000}, 
-    {0x46d48000}, {0x46d4a000}, {0x46d4c000}, {0x46d4e000}, 
-    {0x46d50000}, {0x46d52000}, {0x46d54000}, {0x46d56000}, 
-    {0x46d58000}, {0x46d5a000}, {0x46d5c000}, {0x46d5e000}, 
-    {0x46d60000}, {0x46d62000}, {0x46d64000}, {0x46d66000}, 
-    {0x46d68000}, {0x46d6a000}, {0x46d6c000}, {0x46d6e000}, 
-    {0x46d70000}, {0x46d72000}, {0x46d74000}, {0x46d76000}, 
-    {0x46d78000}, {0x46d7a000}, {0x46d7c000}, {0x46d7e000}, 
-    {0x46d80000}, {0x46d82000}, {0x46d84000}, {0x46d86000}, 
-    {0x46d88000}, {0x46d8a000}, {0x46d8c000}, {0x46d8e000}, 
-    {0x46d90000}, {0x46d92000}, {0x46d94000}, {0x46d96000}, 
-    {0x46d98000}, {0x46d9a000}, {0x46d9c000}, {0x46d9e000}, 
-    {0x46da0000}, {0x46da2000}, {0x46da4000}, {0x46da6000}, 
-    {0x46da8000}, {0x46daa000}, {0x46dac000}, {0x46dae000}, 
-    {0x46db0000}, {0x46db2000}, {0x46db4000}, {0x46db6000}, 
-    {0x46db8000}, {0x46dba000}, {0x46dbc000}, {0x46dbe000}, 
-    {0x46dc0000}, {0x46dc2000}, {0x46dc4000}, {0x46dc6000}, 
-    {0x46dc8000}, {0x46dca000}, {0x46dcc000}, {0x46dce000}, 
-    {0x46dd0000}, {0x46dd2000}, {0x46dd4000}, {0x46dd6000}, 
-    {0x46dd8000}, {0x46dda000}, {0x46ddc000}, {0x46dde000}, 
-    {0x46de0000}, {0x46de2000}, {0x46de4000}, {0x46de6000}, 
-    {0x46de8000}, {0x46dea000}, {0x46dec000}, {0x46dee000}, 
-    {0x46df0000}, {0x46df2000}, {0x46df4000}, {0x46df6000}, 
-    {0x46df8000}, {0x46dfa000}, {0x46dfc000}, {0x46dfe000}, 
-    {0x46e00000}, {0x46e02000}, {0x46e04000}, {0x46e06000}, 
-    {0x46e08000}, {0x46e0a000}, {0x46e0c000}, {0x46e0e000}, 
-    {0x46e10000}, {0x46e12000}, {0x46e14000}, {0x46e16000}, 
-    {0x46e18000}, {0x46e1a000}, {0x46e1c000}, {0x46e1e000}, 
-    {0x46e20000}, {0x46e22000}, {0x46e24000}, {0x46e26000}, 
-    {0x46e28000}, {0x46e2a000}, {0x46e2c000}, {0x46e2e000}, 
-    {0x46e30000}, {0x46e32000}, {0x46e34000}, {0x46e36000}, 
-    {0x46e38000}, {0x46e3a000}, {0x46e3c000}, {0x46e3e000}, 
-    {0x46e40000}, {0x46e42000}, {0x46e44000}, {0x46e46000}, 
-    {0x46e48000}, {0x46e4a000}, {0x46e4c000}, {0x46e4e000}, 
-    {0x46e50000}, {0x46e52000}, {0x46e54000}, {0x46e56000}, 
-    {0x46e58000}, {0x46e5a000}, {0x46e5c000}, {0x46e5e000}, 
-    {0x46e60000}, {0x46e62000}, {0x46e64000}, {0x46e66000}, 
-    {0x46e68000}, {0x46e6a000}, {0x46e6c000}, {0x46e6e000}, 
-    {0x46e70000}, {0x46e72000}, {0x46e74000}, {0x46e76000}, 
-    {0x46e78000}, {0x46e7a000}, {0x46e7c000}, {0x46e7e000}, 
-    {0x46e80000}, {0x46e82000}, {0x46e84000}, {0x46e86000}, 
-    {0x46e88000}, {0x46e8a000}, {0x46e8c000}, {0x46e8e000}, 
-    {0x46e90000}, {0x46e92000}, {0x46e94000}, {0x46e96000}, 
-    {0x46e98000}, {0x46e9a000}, {0x46e9c000}, {0x46e9e000}, 
-    {0x46ea0000}, {0x46ea2000}, {0x46ea4000}, {0x46ea6000}, 
-    {0x46ea8000}, {0x46eaa000}, {0x46eac000}, {0x46eae000}, 
-    {0x46eb0000}, {0x46eb2000}, {0x46eb4000}, {0x46eb6000}, 
-    {0x46eb8000}, {0x46eba000}, {0x46ebc000}, {0x46ebe000}, 
-    {0x46ec0000}, {0x46ec2000}, {0x46ec4000}, {0x46ec6000}, 
-    {0x46ec8000}, {0x46eca000}, {0x46ecc000}, {0x46ece000}, 
-    {0x46ed0000}, {0x46ed2000}, {0x46ed4000}, {0x46ed6000}, 
-    {0x46ed8000}, {0x46eda000}, {0x46edc000}, {0x46ede000}, 
-    {0x46ee0000}, {0x46ee2000}, {0x46ee4000}, {0x46ee6000}, 
-    {0x46ee8000}, {0x46eea000}, {0x46eec000}, {0x46eee000}, 
-    {0x46ef0000}, {0x46ef2000}, {0x46ef4000}, {0x46ef6000}, 
-    {0x46ef8000}, {0x46efa000}, {0x46efc000}, {0x46efe000}, 
-    {0x46f00000}, {0x46f02000}, {0x46f04000}, {0x46f06000}, 
-    {0x46f08000}, {0x46f0a000}, {0x46f0c000}, {0x46f0e000}, 
-    {0x46f10000}, {0x46f12000}, {0x46f14000}, {0x46f16000}, 
-    {0x46f18000}, {0x46f1a000}, {0x46f1c000}, {0x46f1e000}, 
-    {0x46f20000}, {0x46f22000}, {0x46f24000}, {0x46f26000}, 
-    {0x46f28000}, {0x46f2a000}, {0x46f2c000}, {0x46f2e000}, 
-    {0x46f30000}, {0x46f32000}, {0x46f34000}, {0x46f36000}, 
-    {0x46f38000}, {0x46f3a000}, {0x46f3c000}, {0x46f3e000}, 
-    {0x46f40000}, {0x46f42000}, {0x46f44000}, {0x46f46000}, 
-    {0x46f48000}, {0x46f4a000}, {0x46f4c000}, {0x46f4e000}, 
-    {0x46f50000}, {0x46f52000}, {0x46f54000}, {0x46f56000}, 
-    {0x46f58000}, {0x46f5a000}, {0x46f5c000}, {0x46f5e000}, 
-    {0x46f60000}, {0x46f62000}, {0x46f64000}, {0x46f66000}, 
-    {0x46f68000}, {0x46f6a000}, {0x46f6c000}, {0x46f6e000}, 
-    {0x46f70000}, {0x46f72000}, {0x46f74000}, {0x46f76000}, 
-    {0x46f78000}, {0x46f7a000}, {0x46f7c000}, {0x46f7e000}, 
-    {0x46f80000}, {0x46f82000}, {0x46f84000}, {0x46f86000}, 
-    {0x46f88000}, {0x46f8a000}, {0x46f8c000}, {0x46f8e000}, 
-    {0x46f90000}, {0x46f92000}, {0x46f94000}, {0x46f96000}, 
-    {0x46f98000}, {0x46f9a000}, {0x46f9c000}, {0x46f9e000}, 
-    {0x46fa0000}, {0x46fa2000}, {0x46fa4000}, {0x46fa6000}, 
-    {0x46fa8000}, {0x46faa000}, {0x46fac000}, {0x46fae000}, 
-    {0x46fb0000}, {0x46fb2000}, {0x46fb4000}, {0x46fb6000}, 
-    {0x46fb8000}, {0x46fba000}, {0x46fbc000}, {0x46fbe000}, 
-    {0x46fc0000}, {0x46fc2000}, {0x46fc4000}, {0x46fc6000}, 
-    {0x46fc8000}, {0x46fca000}, {0x46fcc000}, {0x46fce000}, 
-    {0x46fd0000}, {0x46fd2000}, {0x46fd4000}, {0x46fd6000}, 
-    {0x46fd8000}, {0x46fda000}, {0x46fdc000}, {0x46fde000}, 
-    {0x46fe0000}, {0x46fe2000}, {0x46fe4000}, {0x46fe6000}, 
-    {0x46fe8000}, {0x46fea000}, {0x46fec000}, {0x46fee000}, 
-    {0x46ff0000}, {0x46ff2000}, {0x46ff4000}, {0x46ff6000}, 
-    {0x46ff8000}, {0x46ffa000}, {0x46ffc000}, {0x46ffe000}, 
-    {0x47000000}, {0x47002000}, {0x47004000}, {0x47006000}, 
-    {0x47008000}, {0x4700a000}, {0x4700c000}, {0x4700e000}, 
-    {0x47010000}, {0x47012000}, {0x47014000}, {0x47016000}, 
-    {0x47018000}, {0x4701a000}, {0x4701c000}, {0x4701e000}, 
-    {0x47020000}, {0x47022000}, {0x47024000}, {0x47026000}, 
-    {0x47028000}, {0x4702a000}, {0x4702c000}, {0x4702e000}, 
-    {0x47030000}, {0x47032000}, {0x47034000}, {0x47036000}, 
-    {0x47038000}, {0x4703a000}, {0x4703c000}, {0x4703e000}, 
-    {0x47040000}, {0x47042000}, {0x47044000}, {0x47046000}, 
-    {0x47048000}, {0x4704a000}, {0x4704c000}, {0x4704e000}, 
-    {0x47050000}, {0x47052000}, {0x47054000}, {0x47056000}, 
-    {0x47058000}, {0x4705a000}, {0x4705c000}, {0x4705e000}, 
-    {0x47060000}, {0x47062000}, {0x47064000}, {0x47066000}, 
-    {0x47068000}, {0x4706a000}, {0x4706c000}, {0x4706e000}, 
-    {0x47070000}, {0x47072000}, {0x47074000}, {0x47076000}, 
-    {0x47078000}, {0x4707a000}, {0x4707c000}, {0x4707e000}, 
-    {0x47080000}, {0x47082000}, {0x47084000}, {0x47086000}, 
-    {0x47088000}, {0x4708a000}, {0x4708c000}, {0x4708e000}, 
-    {0x47090000}, {0x47092000}, {0x47094000}, {0x47096000}, 
-    {0x47098000}, {0x4709a000}, {0x4709c000}, {0x4709e000}, 
-    {0x470a0000}, {0x470a2000}, {0x470a4000}, {0x470a6000}, 
-    {0x470a8000}, {0x470aa000}, {0x470ac000}, {0x470ae000}, 
-    {0x470b0000}, {0x470b2000}, {0x470b4000}, {0x470b6000}, 
-    {0x470b8000}, {0x470ba000}, {0x470bc000}, {0x470be000}, 
-    {0x470c0000}, {0x470c2000}, {0x470c4000}, {0x470c6000}, 
-    {0x470c8000}, {0x470ca000}, {0x470cc000}, {0x470ce000}, 
-    {0x470d0000}, {0x470d2000}, {0x470d4000}, {0x470d6000}, 
-    {0x470d8000}, {0x470da000}, {0x470dc000}, {0x470de000}, 
-    {0x470e0000}, {0x470e2000}, {0x470e4000}, {0x470e6000}, 
-    {0x470e8000}, {0x470ea000}, {0x470ec000}, {0x470ee000}, 
-    {0x470f0000}, {0x470f2000}, {0x470f4000}, {0x470f6000}, 
-    {0x470f8000}, {0x470fa000}, {0x470fc000}, {0x470fe000}, 
-    {0x47100000}, {0x47102000}, {0x47104000}, {0x47106000}, 
-    {0x47108000}, {0x4710a000}, {0x4710c000}, {0x4710e000}, 
-    {0x47110000}, {0x47112000}, {0x47114000}, {0x47116000}, 
-    {0x47118000}, {0x4711a000}, {0x4711c000}, {0x4711e000}, 
-    {0x47120000}, {0x47122000}, {0x47124000}, {0x47126000}, 
-    {0x47128000}, {0x4712a000}, {0x4712c000}, {0x4712e000}, 
-    {0x47130000}, {0x47132000}, {0x47134000}, {0x47136000}, 
-    {0x47138000}, {0x4713a000}, {0x4713c000}, {0x4713e000}, 
-    {0x47140000}, {0x47142000}, {0x47144000}, {0x47146000}, 
-    {0x47148000}, {0x4714a000}, {0x4714c000}, {0x4714e000}, 
-    {0x47150000}, {0x47152000}, {0x47154000}, {0x47156000}, 
-    {0x47158000}, {0x4715a000}, {0x4715c000}, {0x4715e000}, 
-    {0x47160000}, {0x47162000}, {0x47164000}, {0x47166000}, 
-    {0x47168000}, {0x4716a000}, {0x4716c000}, {0x4716e000}, 
-    {0x47170000}, {0x47172000}, {0x47174000}, {0x47176000}, 
-    {0x47178000}, {0x4717a000}, {0x4717c000}, {0x4717e000}, 
-    {0x47180000}, {0x47182000}, {0x47184000}, {0x47186000}, 
-    {0x47188000}, {0x4718a000}, {0x4718c000}, {0x4718e000}, 
-    {0x47190000}, {0x47192000}, {0x47194000}, {0x47196000}, 
-    {0x47198000}, {0x4719a000}, {0x4719c000}, {0x4719e000}, 
-    {0x471a0000}, {0x471a2000}, {0x471a4000}, {0x471a6000}, 
-    {0x471a8000}, {0x471aa000}, {0x471ac000}, {0x471ae000}, 
-    {0x471b0000}, {0x471b2000}, {0x471b4000}, {0x471b6000}, 
-    {0x471b8000}, {0x471ba000}, {0x471bc000}, {0x471be000}, 
-    {0x471c0000}, {0x471c2000}, {0x471c4000}, {0x471c6000}, 
-    {0x471c8000}, {0x471ca000}, {0x471cc000}, {0x471ce000}, 
-    {0x471d0000}, {0x471d2000}, {0x471d4000}, {0x471d6000}, 
-    {0x471d8000}, {0x471da000}, {0x471dc000}, {0x471de000}, 
-    {0x471e0000}, {0x471e2000}, {0x471e4000}, {0x471e6000}, 
-    {0x471e8000}, {0x471ea000}, {0x471ec000}, {0x471ee000}, 
-    {0x471f0000}, {0x471f2000}, {0x471f4000}, {0x471f6000}, 
-    {0x471f8000}, {0x471fa000}, {0x471fc000}, {0x471fe000}, 
-    {0x47200000}, {0x47202000}, {0x47204000}, {0x47206000}, 
-    {0x47208000}, {0x4720a000}, {0x4720c000}, {0x4720e000}, 
-    {0x47210000}, {0x47212000}, {0x47214000}, {0x47216000}, 
-    {0x47218000}, {0x4721a000}, {0x4721c000}, {0x4721e000}, 
-    {0x47220000}, {0x47222000}, {0x47224000}, {0x47226000}, 
-    {0x47228000}, {0x4722a000}, {0x4722c000}, {0x4722e000}, 
-    {0x47230000}, {0x47232000}, {0x47234000}, {0x47236000}, 
-    {0x47238000}, {0x4723a000}, {0x4723c000}, {0x4723e000}, 
-    {0x47240000}, {0x47242000}, {0x47244000}, {0x47246000}, 
-    {0x47248000}, {0x4724a000}, {0x4724c000}, {0x4724e000}, 
-    {0x47250000}, {0x47252000}, {0x47254000}, {0x47256000}, 
-    {0x47258000}, {0x4725a000}, {0x4725c000}, {0x4725e000}, 
-    {0x47260000}, {0x47262000}, {0x47264000}, {0x47266000}, 
-    {0x47268000}, {0x4726a000}, {0x4726c000}, {0x4726e000}, 
-    {0x47270000}, {0x47272000}, {0x47274000}, {0x47276000}, 
-    {0x47278000}, {0x4727a000}, {0x4727c000}, {0x4727e000}, 
-    {0x47280000}, {0x47282000}, {0x47284000}, {0x47286000}, 
-    {0x47288000}, {0x4728a000}, {0x4728c000}, {0x4728e000}, 
-    {0x47290000}, {0x47292000}, {0x47294000}, {0x47296000}, 
-    {0x47298000}, {0x4729a000}, {0x4729c000}, {0x4729e000}, 
-    {0x472a0000}, {0x472a2000}, {0x472a4000}, {0x472a6000}, 
-    {0x472a8000}, {0x472aa000}, {0x472ac000}, {0x472ae000}, 
-    {0x472b0000}, {0x472b2000}, {0x472b4000}, {0x472b6000}, 
-    {0x472b8000}, {0x472ba000}, {0x472bc000}, {0x472be000}, 
-    {0x472c0000}, {0x472c2000}, {0x472c4000}, {0x472c6000}, 
-    {0x472c8000}, {0x472ca000}, {0x472cc000}, {0x472ce000}, 
-    {0x472d0000}, {0x472d2000}, {0x472d4000}, {0x472d6000}, 
-    {0x472d8000}, {0x472da000}, {0x472dc000}, {0x472de000}, 
-    {0x472e0000}, {0x472e2000}, {0x472e4000}, {0x472e6000}, 
-    {0x472e8000}, {0x472ea000}, {0x472ec000}, {0x472ee000}, 
-    {0x472f0000}, {0x472f2000}, {0x472f4000}, {0x472f6000}, 
-    {0x472f8000}, {0x472fa000}, {0x472fc000}, {0x472fe000}, 
-    {0x47300000}, {0x47302000}, {0x47304000}, {0x47306000}, 
-    {0x47308000}, {0x4730a000}, {0x4730c000}, {0x4730e000}, 
-    {0x47310000}, {0x47312000}, {0x47314000}, {0x47316000}, 
-    {0x47318000}, {0x4731a000}, {0x4731c000}, {0x4731e000}, 
-    {0x47320000}, {0x47322000}, {0x47324000}, {0x47326000}, 
-    {0x47328000}, {0x4732a000}, {0x4732c000}, {0x4732e000}, 
-    {0x47330000}, {0x47332000}, {0x47334000}, {0x47336000}, 
-    {0x47338000}, {0x4733a000}, {0x4733c000}, {0x4733e000}, 
-    {0x47340000}, {0x47342000}, {0x47344000}, {0x47346000}, 
-    {0x47348000}, {0x4734a000}, {0x4734c000}, {0x4734e000}, 
-    {0x47350000}, {0x47352000}, {0x47354000}, {0x47356000}, 
-    {0x47358000}, {0x4735a000}, {0x4735c000}, {0x4735e000}, 
-    {0x47360000}, {0x47362000}, {0x47364000}, {0x47366000}, 
-    {0x47368000}, {0x4736a000}, {0x4736c000}, {0x4736e000}, 
-    {0x47370000}, {0x47372000}, {0x47374000}, {0x47376000}, 
-    {0x47378000}, {0x4737a000}, {0x4737c000}, {0x4737e000}, 
-    {0x47380000}, {0x47382000}, {0x47384000}, {0x47386000}, 
-    {0x47388000}, {0x4738a000}, {0x4738c000}, {0x4738e000}, 
-    {0x47390000}, {0x47392000}, {0x47394000}, {0x47396000}, 
-    {0x47398000}, {0x4739a000}, {0x4739c000}, {0x4739e000}, 
-    {0x473a0000}, {0x473a2000}, {0x473a4000}, {0x473a6000}, 
-    {0x473a8000}, {0x473aa000}, {0x473ac000}, {0x473ae000}, 
-    {0x473b0000}, {0x473b2000}, {0x473b4000}, {0x473b6000}, 
-    {0x473b8000}, {0x473ba000}, {0x473bc000}, {0x473be000}, 
-    {0x473c0000}, {0x473c2000}, {0x473c4000}, {0x473c6000}, 
-    {0x473c8000}, {0x473ca000}, {0x473cc000}, {0x473ce000}, 
-    {0x473d0000}, {0x473d2000}, {0x473d4000}, {0x473d6000}, 
-    {0x473d8000}, {0x473da000}, {0x473dc000}, {0x473de000}, 
-    {0x473e0000}, {0x473e2000}, {0x473e4000}, {0x473e6000}, 
-    {0x473e8000}, {0x473ea000}, {0x473ec000}, {0x473ee000}, 
-    {0x473f0000}, {0x473f2000}, {0x473f4000}, {0x473f6000}, 
-    {0x473f8000}, {0x473fa000}, {0x473fc000}, {0x473fe000}, 
-    {0x47400000}, {0x47402000}, {0x47404000}, {0x47406000}, 
-    {0x47408000}, {0x4740a000}, {0x4740c000}, {0x4740e000}, 
-    {0x47410000}, {0x47412000}, {0x47414000}, {0x47416000}, 
-    {0x47418000}, {0x4741a000}, {0x4741c000}, {0x4741e000}, 
-    {0x47420000}, {0x47422000}, {0x47424000}, {0x47426000}, 
-    {0x47428000}, {0x4742a000}, {0x4742c000}, {0x4742e000}, 
-    {0x47430000}, {0x47432000}, {0x47434000}, {0x47436000}, 
-    {0x47438000}, {0x4743a000}, {0x4743c000}, {0x4743e000}, 
-    {0x47440000}, {0x47442000}, {0x47444000}, {0x47446000}, 
-    {0x47448000}, {0x4744a000}, {0x4744c000}, {0x4744e000}, 
-    {0x47450000}, {0x47452000}, {0x47454000}, {0x47456000}, 
-    {0x47458000}, {0x4745a000}, {0x4745c000}, {0x4745e000}, 
-    {0x47460000}, {0x47462000}, {0x47464000}, {0x47466000}, 
-    {0x47468000}, {0x4746a000}, {0x4746c000}, {0x4746e000}, 
-    {0x47470000}, {0x47472000}, {0x47474000}, {0x47476000}, 
-    {0x47478000}, {0x4747a000}, {0x4747c000}, {0x4747e000}, 
-    {0x47480000}, {0x47482000}, {0x47484000}, {0x47486000}, 
-    {0x47488000}, {0x4748a000}, {0x4748c000}, {0x4748e000}, 
-    {0x47490000}, {0x47492000}, {0x47494000}, {0x47496000}, 
-    {0x47498000}, {0x4749a000}, {0x4749c000}, {0x4749e000}, 
-    {0x474a0000}, {0x474a2000}, {0x474a4000}, {0x474a6000}, 
-    {0x474a8000}, {0x474aa000}, {0x474ac000}, {0x474ae000}, 
-    {0x474b0000}, {0x474b2000}, {0x474b4000}, {0x474b6000}, 
-    {0x474b8000}, {0x474ba000}, {0x474bc000}, {0x474be000}, 
-    {0x474c0000}, {0x474c2000}, {0x474c4000}, {0x474c6000}, 
-    {0x474c8000}, {0x474ca000}, {0x474cc000}, {0x474ce000}, 
-    {0x474d0000}, {0x474d2000}, {0x474d4000}, {0x474d6000}, 
-    {0x474d8000}, {0x474da000}, {0x474dc000}, {0x474de000}, 
-    {0x474e0000}, {0x474e2000}, {0x474e4000}, {0x474e6000}, 
-    {0x474e8000}, {0x474ea000}, {0x474ec000}, {0x474ee000}, 
-    {0x474f0000}, {0x474f2000}, {0x474f4000}, {0x474f6000}, 
-    {0x474f8000}, {0x474fa000}, {0x474fc000}, {0x474fe000}, 
-    {0x47500000}, {0x47502000}, {0x47504000}, {0x47506000}, 
-    {0x47508000}, {0x4750a000}, {0x4750c000}, {0x4750e000}, 
-    {0x47510000}, {0x47512000}, {0x47514000}, {0x47516000}, 
-    {0x47518000}, {0x4751a000}, {0x4751c000}, {0x4751e000}, 
-    {0x47520000}, {0x47522000}, {0x47524000}, {0x47526000}, 
-    {0x47528000}, {0x4752a000}, {0x4752c000}, {0x4752e000}, 
-    {0x47530000}, {0x47532000}, {0x47534000}, {0x47536000}, 
-    {0x47538000}, {0x4753a000}, {0x4753c000}, {0x4753e000}, 
-    {0x47540000}, {0x47542000}, {0x47544000}, {0x47546000}, 
-    {0x47548000}, {0x4754a000}, {0x4754c000}, {0x4754e000}, 
-    {0x47550000}, {0x47552000}, {0x47554000}, {0x47556000}, 
-    {0x47558000}, {0x4755a000}, {0x4755c000}, {0x4755e000}, 
-    {0x47560000}, {0x47562000}, {0x47564000}, {0x47566000}, 
-    {0x47568000}, {0x4756a000}, {0x4756c000}, {0x4756e000}, 
-    {0x47570000}, {0x47572000}, {0x47574000}, {0x47576000}, 
-    {0x47578000}, {0x4757a000}, {0x4757c000}, {0x4757e000}, 
-    {0x47580000}, {0x47582000}, {0x47584000}, {0x47586000}, 
-    {0x47588000}, {0x4758a000}, {0x4758c000}, {0x4758e000}, 
-    {0x47590000}, {0x47592000}, {0x47594000}, {0x47596000}, 
-    {0x47598000}, {0x4759a000}, {0x4759c000}, {0x4759e000}, 
-    {0x475a0000}, {0x475a2000}, {0x475a4000}, {0x475a6000}, 
-    {0x475a8000}, {0x475aa000}, {0x475ac000}, {0x475ae000}, 
-    {0x475b0000}, {0x475b2000}, {0x475b4000}, {0x475b6000}, 
-    {0x475b8000}, {0x475ba000}, {0x475bc000}, {0x475be000}, 
-    {0x475c0000}, {0x475c2000}, {0x475c4000}, {0x475c6000}, 
-    {0x475c8000}, {0x475ca000}, {0x475cc000}, {0x475ce000}, 
-    {0x475d0000}, {0x475d2000}, {0x475d4000}, {0x475d6000}, 
-    {0x475d8000}, {0x475da000}, {0x475dc000}, {0x475de000}, 
-    {0x475e0000}, {0x475e2000}, {0x475e4000}, {0x475e6000}, 
-    {0x475e8000}, {0x475ea000}, {0x475ec000}, {0x475ee000}, 
-    {0x475f0000}, {0x475f2000}, {0x475f4000}, {0x475f6000}, 
-    {0x475f8000}, {0x475fa000}, {0x475fc000}, {0x475fe000}, 
-    {0x47600000}, {0x47602000}, {0x47604000}, {0x47606000}, 
-    {0x47608000}, {0x4760a000}, {0x4760c000}, {0x4760e000}, 
-    {0x47610000}, {0x47612000}, {0x47614000}, {0x47616000}, 
-    {0x47618000}, {0x4761a000}, {0x4761c000}, {0x4761e000}, 
-    {0x47620000}, {0x47622000}, {0x47624000}, {0x47626000}, 
-    {0x47628000}, {0x4762a000}, {0x4762c000}, {0x4762e000}, 
-    {0x47630000}, {0x47632000}, {0x47634000}, {0x47636000}, 
-    {0x47638000}, {0x4763a000}, {0x4763c000}, {0x4763e000}, 
-    {0x47640000}, {0x47642000}, {0x47644000}, {0x47646000}, 
-    {0x47648000}, {0x4764a000}, {0x4764c000}, {0x4764e000}, 
-    {0x47650000}, {0x47652000}, {0x47654000}, {0x47656000}, 
-    {0x47658000}, {0x4765a000}, {0x4765c000}, {0x4765e000}, 
-    {0x47660000}, {0x47662000}, {0x47664000}, {0x47666000}, 
-    {0x47668000}, {0x4766a000}, {0x4766c000}, {0x4766e000}, 
-    {0x47670000}, {0x47672000}, {0x47674000}, {0x47676000}, 
-    {0x47678000}, {0x4767a000}, {0x4767c000}, {0x4767e000}, 
-    {0x47680000}, {0x47682000}, {0x47684000}, {0x47686000}, 
-    {0x47688000}, {0x4768a000}, {0x4768c000}, {0x4768e000}, 
-    {0x47690000}, {0x47692000}, {0x47694000}, {0x47696000}, 
-    {0x47698000}, {0x4769a000}, {0x4769c000}, {0x4769e000}, 
-    {0x476a0000}, {0x476a2000}, {0x476a4000}, {0x476a6000}, 
-    {0x476a8000}, {0x476aa000}, {0x476ac000}, {0x476ae000}, 
-    {0x476b0000}, {0x476b2000}, {0x476b4000}, {0x476b6000}, 
-    {0x476b8000}, {0x476ba000}, {0x476bc000}, {0x476be000}, 
-    {0x476c0000}, {0x476c2000}, {0x476c4000}, {0x476c6000}, 
-    {0x476c8000}, {0x476ca000}, {0x476cc000}, {0x476ce000}, 
-    {0x476d0000}, {0x476d2000}, {0x476d4000}, {0x476d6000}, 
-    {0x476d8000}, {0x476da000}, {0x476dc000}, {0x476de000}, 
-    {0x476e0000}, {0x476e2000}, {0x476e4000}, {0x476e6000}, 
-    {0x476e8000}, {0x476ea000}, {0x476ec000}, {0x476ee000}, 
-    {0x476f0000}, {0x476f2000}, {0x476f4000}, {0x476f6000}, 
-    {0x476f8000}, {0x476fa000}, {0x476fc000}, {0x476fe000}, 
-    {0x47700000}, {0x47702000}, {0x47704000}, {0x47706000}, 
-    {0x47708000}, {0x4770a000}, {0x4770c000}, {0x4770e000}, 
-    {0x47710000}, {0x47712000}, {0x47714000}, {0x47716000}, 
-    {0x47718000}, {0x4771a000}, {0x4771c000}, {0x4771e000}, 
-    {0x47720000}, {0x47722000}, {0x47724000}, {0x47726000}, 
-    {0x47728000}, {0x4772a000}, {0x4772c000}, {0x4772e000}, 
-    {0x47730000}, {0x47732000}, {0x47734000}, {0x47736000}, 
-    {0x47738000}, {0x4773a000}, {0x4773c000}, {0x4773e000}, 
-    {0x47740000}, {0x47742000}, {0x47744000}, {0x47746000}, 
-    {0x47748000}, {0x4774a000}, {0x4774c000}, {0x4774e000}, 
-    {0x47750000}, {0x47752000}, {0x47754000}, {0x47756000}, 
-    {0x47758000}, {0x4775a000}, {0x4775c000}, {0x4775e000}, 
-    {0x47760000}, {0x47762000}, {0x47764000}, {0x47766000}, 
-    {0x47768000}, {0x4776a000}, {0x4776c000}, {0x4776e000}, 
-    {0x47770000}, {0x47772000}, {0x47774000}, {0x47776000}, 
-    {0x47778000}, {0x4777a000}, {0x4777c000}, {0x4777e000}, 
-    {0x47780000}, {0x47782000}, {0x47784000}, {0x47786000}, 
-    {0x47788000}, {0x4778a000}, {0x4778c000}, {0x4778e000}, 
-    {0x47790000}, {0x47792000}, {0x47794000}, {0x47796000}, 
-    {0x47798000}, {0x4779a000}, {0x4779c000}, {0x4779e000}, 
-    {0x477a0000}, {0x477a2000}, {0x477a4000}, {0x477a6000}, 
-    {0x477a8000}, {0x477aa000}, {0x477ac000}, {0x477ae000}, 
-    {0x477b0000}, {0x477b2000}, {0x477b4000}, {0x477b6000}, 
-    {0x477b8000}, {0x477ba000}, {0x477bc000}, {0x477be000}, 
-    {0x477c0000}, {0x477c2000}, {0x477c4000}, {0x477c6000}, 
-    {0x477c8000}, {0x477ca000}, {0x477cc000}, {0x477ce000}, 
-    {0x477d0000}, {0x477d2000}, {0x477d4000}, {0x477d6000}, 
-    {0x477d8000}, {0x477da000}, {0x477dc000}, {0x477de000}, 
-    {0x477e0000}, {0x477e2000}, {0x477e4000}, {0x477e6000}, 
-    {0x477e8000}, {0x477ea000}, {0x477ec000}, {0x477ee000}, 
-    {0x477f0000}, {0x477f2000}, {0x477f4000}, {0x477f6000}, 
-    {0x477f8000}, {0x477fa000}, {0x477fc000}, {0x477fe000}, 
-    {0x7f800000}, {0x7f802000}, {0x7f804000}, {0x7f806000}, 
-    {0x7f808000}, {0x7f80a000}, {0x7f80c000}, {0x7f80e000}, 
-    {0x7f810000}, {0x7f812000}, {0x7f814000}, {0x7f816000}, 
-    {0x7f818000}, {0x7f81a000}, {0x7f81c000}, {0x7f81e000}, 
-    {0x7f820000}, {0x7f822000}, {0x7f824000}, {0x7f826000}, 
-    {0x7f828000}, {0x7f82a000}, {0x7f82c000}, {0x7f82e000}, 
-    {0x7f830000}, {0x7f832000}, {0x7f834000}, {0x7f836000}, 
-    {0x7f838000}, {0x7f83a000}, {0x7f83c000}, {0x7f83e000}, 
-    {0x7f840000}, {0x7f842000}, {0x7f844000}, {0x7f846000}, 
-    {0x7f848000}, {0x7f84a000}, {0x7f84c000}, {0x7f84e000}, 
-    {0x7f850000}, {0x7f852000}, {0x7f854000}, {0x7f856000}, 
-    {0x7f858000}, {0x7f85a000}, {0x7f85c000}, {0x7f85e000}, 
-    {0x7f860000}, {0x7f862000}, {0x7f864000}, {0x7f866000}, 
-    {0x7f868000}, {0x7f86a000}, {0x7f86c000}, {0x7f86e000}, 
-    {0x7f870000}, {0x7f872000}, {0x7f874000}, {0x7f876000}, 
-    {0x7f878000}, {0x7f87a000}, {0x7f87c000}, {0x7f87e000}, 
-    {0x7f880000}, {0x7f882000}, {0x7f884000}, {0x7f886000}, 
-    {0x7f888000}, {0x7f88a000}, {0x7f88c000}, {0x7f88e000}, 
-    {0x7f890000}, {0x7f892000}, {0x7f894000}, {0x7f896000}, 
-    {0x7f898000}, {0x7f89a000}, {0x7f89c000}, {0x7f89e000}, 
-    {0x7f8a0000}, {0x7f8a2000}, {0x7f8a4000}, {0x7f8a6000}, 
-    {0x7f8a8000}, {0x7f8aa000}, {0x7f8ac000}, {0x7f8ae000}, 
-    {0x7f8b0000}, {0x7f8b2000}, {0x7f8b4000}, {0x7f8b6000}, 
-    {0x7f8b8000}, {0x7f8ba000}, {0x7f8bc000}, {0x7f8be000}, 
-    {0x7f8c0000}, {0x7f8c2000}, {0x7f8c4000}, {0x7f8c6000}, 
-    {0x7f8c8000}, {0x7f8ca000}, {0x7f8cc000}, {0x7f8ce000}, 
-    {0x7f8d0000}, {0x7f8d2000}, {0x7f8d4000}, {0x7f8d6000}, 
-    {0x7f8d8000}, {0x7f8da000}, {0x7f8dc000}, {0x7f8de000}, 
-    {0x7f8e0000}, {0x7f8e2000}, {0x7f8e4000}, {0x7f8e6000}, 
-    {0x7f8e8000}, {0x7f8ea000}, {0x7f8ec000}, {0x7f8ee000}, 
-    {0x7f8f0000}, {0x7f8f2000}, {0x7f8f4000}, {0x7f8f6000}, 
-    {0x7f8f8000}, {0x7f8fa000}, {0x7f8fc000}, {0x7f8fe000}, 
-    {0x7f900000}, {0x7f902000}, {0x7f904000}, {0x7f906000}, 
-    {0x7f908000}, {0x7f90a000}, {0x7f90c000}, {0x7f90e000}, 
-    {0x7f910000}, {0x7f912000}, {0x7f914000}, {0x7f916000}, 
-    {0x7f918000}, {0x7f91a000}, {0x7f91c000}, {0x7f91e000}, 
-    {0x7f920000}, {0x7f922000}, {0x7f924000}, {0x7f926000}, 
-    {0x7f928000}, {0x7f92a000}, {0x7f92c000}, {0x7f92e000}, 
-    {0x7f930000}, {0x7f932000}, {0x7f934000}, {0x7f936000}, 
-    {0x7f938000}, {0x7f93a000}, {0x7f93c000}, {0x7f93e000}, 
-    {0x7f940000}, {0x7f942000}, {0x7f944000}, {0x7f946000}, 
-    {0x7f948000}, {0x7f94a000}, {0x7f94c000}, {0x7f94e000}, 
-    {0x7f950000}, {0x7f952000}, {0x7f954000}, {0x7f956000}, 
-    {0x7f958000}, {0x7f95a000}, {0x7f95c000}, {0x7f95e000}, 
-    {0x7f960000}, {0x7f962000}, {0x7f964000}, {0x7f966000}, 
-    {0x7f968000}, {0x7f96a000}, {0x7f96c000}, {0x7f96e000}, 
-    {0x7f970000}, {0x7f972000}, {0x7f974000}, {0x7f976000}, 
-    {0x7f978000}, {0x7f97a000}, {0x7f97c000}, {0x7f97e000}, 
-    {0x7f980000}, {0x7f982000}, {0x7f984000}, {0x7f986000}, 
-    {0x7f988000}, {0x7f98a000}, {0x7f98c000}, {0x7f98e000}, 
-    {0x7f990000}, {0x7f992000}, {0x7f994000}, {0x7f996000}, 
-    {0x7f998000}, {0x7f99a000}, {0x7f99c000}, {0x7f99e000}, 
-    {0x7f9a0000}, {0x7f9a2000}, {0x7f9a4000}, {0x7f9a6000}, 
-    {0x7f9a8000}, {0x7f9aa000}, {0x7f9ac000}, {0x7f9ae000}, 
-    {0x7f9b0000}, {0x7f9b2000}, {0x7f9b4000}, {0x7f9b6000}, 
-    {0x7f9b8000}, {0x7f9ba000}, {0x7f9bc000}, {0x7f9be000}, 
-    {0x7f9c0000}, {0x7f9c2000}, {0x7f9c4000}, {0x7f9c6000}, 
-    {0x7f9c8000}, {0x7f9ca000}, {0x7f9cc000}, {0x7f9ce000}, 
-    {0x7f9d0000}, {0x7f9d2000}, {0x7f9d4000}, {0x7f9d6000}, 
-    {0x7f9d8000}, {0x7f9da000}, {0x7f9dc000}, {0x7f9de000}, 
-    {0x7f9e0000}, {0x7f9e2000}, {0x7f9e4000}, {0x7f9e6000}, 
-    {0x7f9e8000}, {0x7f9ea000}, {0x7f9ec000}, {0x7f9ee000}, 
-    {0x7f9f0000}, {0x7f9f2000}, {0x7f9f4000}, {0x7f9f6000}, 
-    {0x7f9f8000}, {0x7f9fa000}, {0x7f9fc000}, {0x7f9fe000}, 
-    {0x7fa00000}, {0x7fa02000}, {0x7fa04000}, {0x7fa06000}, 
-    {0x7fa08000}, {0x7fa0a000}, {0x7fa0c000}, {0x7fa0e000}, 
-    {0x7fa10000}, {0x7fa12000}, {0x7fa14000}, {0x7fa16000}, 
-    {0x7fa18000}, {0x7fa1a000}, {0x7fa1c000}, {0x7fa1e000}, 
-    {0x7fa20000}, {0x7fa22000}, {0x7fa24000}, {0x7fa26000}, 
-    {0x7fa28000}, {0x7fa2a000}, {0x7fa2c000}, {0x7fa2e000}, 
-    {0x7fa30000}, {0x7fa32000}, {0x7fa34000}, {0x7fa36000}, 
-    {0x7fa38000}, {0x7fa3a000}, {0x7fa3c000}, {0x7fa3e000}, 
-    {0x7fa40000}, {0x7fa42000}, {0x7fa44000}, {0x7fa46000}, 
-    {0x7fa48000}, {0x7fa4a000}, {0x7fa4c000}, {0x7fa4e000}, 
-    {0x7fa50000}, {0x7fa52000}, {0x7fa54000}, {0x7fa56000}, 
-    {0x7fa58000}, {0x7fa5a000}, {0x7fa5c000}, {0x7fa5e000}, 
-    {0x7fa60000}, {0x7fa62000}, {0x7fa64000}, {0x7fa66000}, 
-    {0x7fa68000}, {0x7fa6a000}, {0x7fa6c000}, {0x7fa6e000}, 
-    {0x7fa70000}, {0x7fa72000}, {0x7fa74000}, {0x7fa76000}, 
-    {0x7fa78000}, {0x7fa7a000}, {0x7fa7c000}, {0x7fa7e000}, 
-    {0x7fa80000}, {0x7fa82000}, {0x7fa84000}, {0x7fa86000}, 
-    {0x7fa88000}, {0x7fa8a000}, {0x7fa8c000}, {0x7fa8e000}, 
-    {0x7fa90000}, {0x7fa92000}, {0x7fa94000}, {0x7fa96000}, 
-    {0x7fa98000}, {0x7fa9a000}, {0x7fa9c000}, {0x7fa9e000}, 
-    {0x7faa0000}, {0x7faa2000}, {0x7faa4000}, {0x7faa6000}, 
-    {0x7faa8000}, {0x7faaa000}, {0x7faac000}, {0x7faae000}, 
-    {0x7fab0000}, {0x7fab2000}, {0x7fab4000}, {0x7fab6000}, 
-    {0x7fab8000}, {0x7faba000}, {0x7fabc000}, {0x7fabe000}, 
-    {0x7fac0000}, {0x7fac2000}, {0x7fac4000}, {0x7fac6000}, 
-    {0x7fac8000}, {0x7faca000}, {0x7facc000}, {0x7face000}, 
-    {0x7fad0000}, {0x7fad2000}, {0x7fad4000}, {0x7fad6000}, 
-    {0x7fad8000}, {0x7fada000}, {0x7fadc000}, {0x7fade000}, 
-    {0x7fae0000}, {0x7fae2000}, {0x7fae4000}, {0x7fae6000}, 
-    {0x7fae8000}, {0x7faea000}, {0x7faec000}, {0x7faee000}, 
-    {0x7faf0000}, {0x7faf2000}, {0x7faf4000}, {0x7faf6000}, 
-    {0x7faf8000}, {0x7fafa000}, {0x7fafc000}, {0x7fafe000}, 
-    {0x7fb00000}, {0x7fb02000}, {0x7fb04000}, {0x7fb06000}, 
-    {0x7fb08000}, {0x7fb0a000}, {0x7fb0c000}, {0x7fb0e000}, 
-    {0x7fb10000}, {0x7fb12000}, {0x7fb14000}, {0x7fb16000}, 
-    {0x7fb18000}, {0x7fb1a000}, {0x7fb1c000}, {0x7fb1e000}, 
-    {0x7fb20000}, {0x7fb22000}, {0x7fb24000}, {0x7fb26000}, 
-    {0x7fb28000}, {0x7fb2a000}, {0x7fb2c000}, {0x7fb2e000}, 
-    {0x7fb30000}, {0x7fb32000}, {0x7fb34000}, {0x7fb36000}, 
-    {0x7fb38000}, {0x7fb3a000}, {0x7fb3c000}, {0x7fb3e000}, 
-    {0x7fb40000}, {0x7fb42000}, {0x7fb44000}, {0x7fb46000}, 
-    {0x7fb48000}, {0x7fb4a000}, {0x7fb4c000}, {0x7fb4e000}, 
-    {0x7fb50000}, {0x7fb52000}, {0x7fb54000}, {0x7fb56000}, 
-    {0x7fb58000}, {0x7fb5a000}, {0x7fb5c000}, {0x7fb5e000}, 
-    {0x7fb60000}, {0x7fb62000}, {0x7fb64000}, {0x7fb66000}, 
-    {0x7fb68000}, {0x7fb6a000}, {0x7fb6c000}, {0x7fb6e000}, 
-    {0x7fb70000}, {0x7fb72000}, {0x7fb74000}, {0x7fb76000}, 
-    {0x7fb78000}, {0x7fb7a000}, {0x7fb7c000}, {0x7fb7e000}, 
-    {0x7fb80000}, {0x7fb82000}, {0x7fb84000}, {0x7fb86000}, 
-    {0x7fb88000}, {0x7fb8a000}, {0x7fb8c000}, {0x7fb8e000}, 
-    {0x7fb90000}, {0x7fb92000}, {0x7fb94000}, {0x7fb96000}, 
-    {0x7fb98000}, {0x7fb9a000}, {0x7fb9c000}, {0x7fb9e000}, 
-    {0x7fba0000}, {0x7fba2000}, {0x7fba4000}, {0x7fba6000}, 
-    {0x7fba8000}, {0x7fbaa000}, {0x7fbac000}, {0x7fbae000}, 
-    {0x7fbb0000}, {0x7fbb2000}, {0x7fbb4000}, {0x7fbb6000}, 
-    {0x7fbb8000}, {0x7fbba000}, {0x7fbbc000}, {0x7fbbe000}, 
-    {0x7fbc0000}, {0x7fbc2000}, {0x7fbc4000}, {0x7fbc6000}, 
-    {0x7fbc8000}, {0x7fbca000}, {0x7fbcc000}, {0x7fbce000}, 
-    {0x7fbd0000}, {0x7fbd2000}, {0x7fbd4000}, {0x7fbd6000}, 
-    {0x7fbd8000}, {0x7fbda000}, {0x7fbdc000}, {0x7fbde000}, 
-    {0x7fbe0000}, {0x7fbe2000}, {0x7fbe4000}, {0x7fbe6000}, 
-    {0x7fbe8000}, {0x7fbea000}, {0x7fbec000}, {0x7fbee000}, 
-    {0x7fbf0000}, {0x7fbf2000}, {0x7fbf4000}, {0x7fbf6000}, 
-    {0x7fbf8000}, {0x7fbfa000}, {0x7fbfc000}, {0x7fbfe000}, 
-    {0x7fc00000}, {0x7fc02000}, {0x7fc04000}, {0x7fc06000}, 
-    {0x7fc08000}, {0x7fc0a000}, {0x7fc0c000}, {0x7fc0e000}, 
-    {0x7fc10000}, {0x7fc12000}, {0x7fc14000}, {0x7fc16000}, 
-    {0x7fc18000}, {0x7fc1a000}, {0x7fc1c000}, {0x7fc1e000}, 
-    {0x7fc20000}, {0x7fc22000}, {0x7fc24000}, {0x7fc26000}, 
-    {0x7fc28000}, {0x7fc2a000}, {0x7fc2c000}, {0x7fc2e000}, 
-    {0x7fc30000}, {0x7fc32000}, {0x7fc34000}, {0x7fc36000}, 
-    {0x7fc38000}, {0x7fc3a000}, {0x7fc3c000}, {0x7fc3e000}, 
-    {0x7fc40000}, {0x7fc42000}, {0x7fc44000}, {0x7fc46000}, 
-    {0x7fc48000}, {0x7fc4a000}, {0x7fc4c000}, {0x7fc4e000}, 
-    {0x7fc50000}, {0x7fc52000}, {0x7fc54000}, {0x7fc56000}, 
-    {0x7fc58000}, {0x7fc5a000}, {0x7fc5c000}, {0x7fc5e000}, 
-    {0x7fc60000}, {0x7fc62000}, {0x7fc64000}, {0x7fc66000}, 
-    {0x7fc68000}, {0x7fc6a000}, {0x7fc6c000}, {0x7fc6e000}, 
-    {0x7fc70000}, {0x7fc72000}, {0x7fc74000}, {0x7fc76000}, 
-    {0x7fc78000}, {0x7fc7a000}, {0x7fc7c000}, {0x7fc7e000}, 
-    {0x7fc80000}, {0x7fc82000}, {0x7fc84000}, {0x7fc86000}, 
-    {0x7fc88000}, {0x7fc8a000}, {0x7fc8c000}, {0x7fc8e000}, 
-    {0x7fc90000}, {0x7fc92000}, {0x7fc94000}, {0x7fc96000}, 
-    {0x7fc98000}, {0x7fc9a000}, {0x7fc9c000}, {0x7fc9e000}, 
-    {0x7fca0000}, {0x7fca2000}, {0x7fca4000}, {0x7fca6000}, 
-    {0x7fca8000}, {0x7fcaa000}, {0x7fcac000}, {0x7fcae000}, 
-    {0x7fcb0000}, {0x7fcb2000}, {0x7fcb4000}, {0x7fcb6000}, 
-    {0x7fcb8000}, {0x7fcba000}, {0x7fcbc000}, {0x7fcbe000}, 
-    {0x7fcc0000}, {0x7fcc2000}, {0x7fcc4000}, {0x7fcc6000}, 
-    {0x7fcc8000}, {0x7fcca000}, {0x7fccc000}, {0x7fcce000}, 
-    {0x7fcd0000}, {0x7fcd2000}, {0x7fcd4000}, {0x7fcd6000}, 
-    {0x7fcd8000}, {0x7fcda000}, {0x7fcdc000}, {0x7fcde000}, 
-    {0x7fce0000}, {0x7fce2000}, {0x7fce4000}, {0x7fce6000}, 
-    {0x7fce8000}, {0x7fcea000}, {0x7fcec000}, {0x7fcee000}, 
-    {0x7fcf0000}, {0x7fcf2000}, {0x7fcf4000}, {0x7fcf6000}, 
-    {0x7fcf8000}, {0x7fcfa000}, {0x7fcfc000}, {0x7fcfe000}, 
-    {0x7fd00000}, {0x7fd02000}, {0x7fd04000}, {0x7fd06000}, 
-    {0x7fd08000}, {0x7fd0a000}, {0x7fd0c000}, {0x7fd0e000}, 
-    {0x7fd10000}, {0x7fd12000}, {0x7fd14000}, {0x7fd16000}, 
-    {0x7fd18000}, {0x7fd1a000}, {0x7fd1c000}, {0x7fd1e000}, 
-    {0x7fd20000}, {0x7fd22000}, {0x7fd24000}, {0x7fd26000}, 
-    {0x7fd28000}, {0x7fd2a000}, {0x7fd2c000}, {0x7fd2e000}, 
-    {0x7fd30000}, {0x7fd32000}, {0x7fd34000}, {0x7fd36000}, 
-    {0x7fd38000}, {0x7fd3a000}, {0x7fd3c000}, {0x7fd3e000}, 
-    {0x7fd40000}, {0x7fd42000}, {0x7fd44000}, {0x7fd46000}, 
-    {0x7fd48000}, {0x7fd4a000}, {0x7fd4c000}, {0x7fd4e000}, 
-    {0x7fd50000}, {0x7fd52000}, {0x7fd54000}, {0x7fd56000}, 
-    {0x7fd58000}, {0x7fd5a000}, {0x7fd5c000}, {0x7fd5e000}, 
-    {0x7fd60000}, {0x7fd62000}, {0x7fd64000}, {0x7fd66000}, 
-    {0x7fd68000}, {0x7fd6a000}, {0x7fd6c000}, {0x7fd6e000}, 
-    {0x7fd70000}, {0x7fd72000}, {0x7fd74000}, {0x7fd76000}, 
-    {0x7fd78000}, {0x7fd7a000}, {0x7fd7c000}, {0x7fd7e000}, 
-    {0x7fd80000}, {0x7fd82000}, {0x7fd84000}, {0x7fd86000}, 
-    {0x7fd88000}, {0x7fd8a000}, {0x7fd8c000}, {0x7fd8e000}, 
-    {0x7fd90000}, {0x7fd92000}, {0x7fd94000}, {0x7fd96000}, 
-    {0x7fd98000}, {0x7fd9a000}, {0x7fd9c000}, {0x7fd9e000}, 
-    {0x7fda0000}, {0x7fda2000}, {0x7fda4000}, {0x7fda6000}, 
-    {0x7fda8000}, {0x7fdaa000}, {0x7fdac000}, {0x7fdae000}, 
-    {0x7fdb0000}, {0x7fdb2000}, {0x7fdb4000}, {0x7fdb6000}, 
-    {0x7fdb8000}, {0x7fdba000}, {0x7fdbc000}, {0x7fdbe000}, 
-    {0x7fdc0000}, {0x7fdc2000}, {0x7fdc4000}, {0x7fdc6000}, 
-    {0x7fdc8000}, {0x7fdca000}, {0x7fdcc000}, {0x7fdce000}, 
-    {0x7fdd0000}, {0x7fdd2000}, {0x7fdd4000}, {0x7fdd6000}, 
-    {0x7fdd8000}, {0x7fdda000}, {0x7fddc000}, {0x7fdde000}, 
-    {0x7fde0000}, {0x7fde2000}, {0x7fde4000}, {0x7fde6000}, 
-    {0x7fde8000}, {0x7fdea000}, {0x7fdec000}, {0x7fdee000}, 
-    {0x7fdf0000}, {0x7fdf2000}, {0x7fdf4000}, {0x7fdf6000}, 
-    {0x7fdf8000}, {0x7fdfa000}, {0x7fdfc000}, {0x7fdfe000}, 
-    {0x7fe00000}, {0x7fe02000}, {0x7fe04000}, {0x7fe06000}, 
-    {0x7fe08000}, {0x7fe0a000}, {0x7fe0c000}, {0x7fe0e000}, 
-    {0x7fe10000}, {0x7fe12000}, {0x7fe14000}, {0x7fe16000}, 
-    {0x7fe18000}, {0x7fe1a000}, {0x7fe1c000}, {0x7fe1e000}, 
-    {0x7fe20000}, {0x7fe22000}, {0x7fe24000}, {0x7fe26000}, 
-    {0x7fe28000}, {0x7fe2a000}, {0x7fe2c000}, {0x7fe2e000}, 
-    {0x7fe30000}, {0x7fe32000}, {0x7fe34000}, {0x7fe36000}, 
-    {0x7fe38000}, {0x7fe3a000}, {0x7fe3c000}, {0x7fe3e000}, 
-    {0x7fe40000}, {0x7fe42000}, {0x7fe44000}, {0x7fe46000}, 
-    {0x7fe48000}, {0x7fe4a000}, {0x7fe4c000}, {0x7fe4e000}, 
-    {0x7fe50000}, {0x7fe52000}, {0x7fe54000}, {0x7fe56000}, 
-    {0x7fe58000}, {0x7fe5a000}, {0x7fe5c000}, {0x7fe5e000}, 
-    {0x7fe60000}, {0x7fe62000}, {0x7fe64000}, {0x7fe66000}, 
-    {0x7fe68000}, {0x7fe6a000}, {0x7fe6c000}, {0x7fe6e000}, 
-    {0x7fe70000}, {0x7fe72000}, {0x7fe74000}, {0x7fe76000}, 
-    {0x7fe78000}, {0x7fe7a000}, {0x7fe7c000}, {0x7fe7e000}, 
-    {0x7fe80000}, {0x7fe82000}, {0x7fe84000}, {0x7fe86000}, 
-    {0x7fe88000}, {0x7fe8a000}, {0x7fe8c000}, {0x7fe8e000}, 
-    {0x7fe90000}, {0x7fe92000}, {0x7fe94000}, {0x7fe96000}, 
-    {0x7fe98000}, {0x7fe9a000}, {0x7fe9c000}, {0x7fe9e000}, 
-    {0x7fea0000}, {0x7fea2000}, {0x7fea4000}, {0x7fea6000}, 
-    {0x7fea8000}, {0x7feaa000}, {0x7feac000}, {0x7feae000}, 
-    {0x7feb0000}, {0x7feb2000}, {0x7feb4000}, {0x7feb6000}, 
-    {0x7feb8000}, {0x7feba000}, {0x7febc000}, {0x7febe000}, 
-    {0x7fec0000}, {0x7fec2000}, {0x7fec4000}, {0x7fec6000}, 
-    {0x7fec8000}, {0x7feca000}, {0x7fecc000}, {0x7fece000}, 
-    {0x7fed0000}, {0x7fed2000}, {0x7fed4000}, {0x7fed6000}, 
-    {0x7fed8000}, {0x7feda000}, {0x7fedc000}, {0x7fede000}, 
-    {0x7fee0000}, {0x7fee2000}, {0x7fee4000}, {0x7fee6000}, 
-    {0x7fee8000}, {0x7feea000}, {0x7feec000}, {0x7feee000}, 
-    {0x7fef0000}, {0x7fef2000}, {0x7fef4000}, {0x7fef6000}, 
-    {0x7fef8000}, {0x7fefa000}, {0x7fefc000}, {0x7fefe000}, 
-    {0x7ff00000}, {0x7ff02000}, {0x7ff04000}, {0x7ff06000}, 
-    {0x7ff08000}, {0x7ff0a000}, {0x7ff0c000}, {0x7ff0e000}, 
-    {0x7ff10000}, {0x7ff12000}, {0x7ff14000}, {0x7ff16000}, 
-    {0x7ff18000}, {0x7ff1a000}, {0x7ff1c000}, {0x7ff1e000}, 
-    {0x7ff20000}, {0x7ff22000}, {0x7ff24000}, {0x7ff26000}, 
-    {0x7ff28000}, {0x7ff2a000}, {0x7ff2c000}, {0x7ff2e000}, 
-    {0x7ff30000}, {0x7ff32000}, {0x7ff34000}, {0x7ff36000}, 
-    {0x7ff38000}, {0x7ff3a000}, {0x7ff3c000}, {0x7ff3e000}, 
-    {0x7ff40000}, {0x7ff42000}, {0x7ff44000}, {0x7ff46000}, 
-    {0x7ff48000}, {0x7ff4a000}, {0x7ff4c000}, {0x7ff4e000}, 
-    {0x7ff50000}, {0x7ff52000}, {0x7ff54000}, {0x7ff56000}, 
-    {0x7ff58000}, {0x7ff5a000}, {0x7ff5c000}, {0x7ff5e000}, 
-    {0x7ff60000}, {0x7ff62000}, {0x7ff64000}, {0x7ff66000}, 
-    {0x7ff68000}, {0x7ff6a000}, {0x7ff6c000}, {0x7ff6e000}, 
-    {0x7ff70000}, {0x7ff72000}, {0x7ff74000}, {0x7ff76000}, 
-    {0x7ff78000}, {0x7ff7a000}, {0x7ff7c000}, {0x7ff7e000}, 
-    {0x7ff80000}, {0x7ff82000}, {0x7ff84000}, {0x7ff86000}, 
-    {0x7ff88000}, {0x7ff8a000}, {0x7ff8c000}, {0x7ff8e000}, 
-    {0x7ff90000}, {0x7ff92000}, {0x7ff94000}, {0x7ff96000}, 
-    {0x7ff98000}, {0x7ff9a000}, {0x7ff9c000}, {0x7ff9e000}, 
-    {0x7ffa0000}, {0x7ffa2000}, {0x7ffa4000}, {0x7ffa6000}, 
-    {0x7ffa8000}, {0x7ffaa000}, {0x7ffac000}, {0x7ffae000}, 
-    {0x7ffb0000}, {0x7ffb2000}, {0x7ffb4000}, {0x7ffb6000}, 
-    {0x7ffb8000}, {0x7ffba000}, {0x7ffbc000}, {0x7ffbe000}, 
-    {0x7ffc0000}, {0x7ffc2000}, {0x7ffc4000}, {0x7ffc6000}, 
-    {0x7ffc8000}, {0x7ffca000}, {0x7ffcc000}, {0x7ffce000}, 
-    {0x7ffd0000}, {0x7ffd2000}, {0x7ffd4000}, {0x7ffd6000}, 
-    {0x7ffd8000}, {0x7ffda000}, {0x7ffdc000}, {0x7ffde000}, 
-    {0x7ffe0000}, {0x7ffe2000}, {0x7ffe4000}, {0x7ffe6000}, 
-    {0x7ffe8000}, {0x7ffea000}, {0x7ffec000}, {0x7ffee000}, 
-    {0x7fff0000}, {0x7fff2000}, {0x7fff4000}, {0x7fff6000}, 
-    {0x7fff8000}, {0x7fffa000}, {0x7fffc000}, {0x7fffe000}, 
-    {0x80000000}, {0xb3800000}, {0xb4000000}, {0xb4400000}, 
-    {0xb4800000}, {0xb4a00000}, {0xb4c00000}, {0xb4e00000}, 
-    {0xb5000000}, {0xb5100000}, {0xb5200000}, {0xb5300000}, 
-    {0xb5400000}, {0xb5500000}, {0xb5600000}, {0xb5700000}, 
-    {0xb5800000}, {0xb5880000}, {0xb5900000}, {0xb5980000}, 
-    {0xb5a00000}, {0xb5a80000}, {0xb5b00000}, {0xb5b80000}, 
-    {0xb5c00000}, {0xb5c80000}, {0xb5d00000}, {0xb5d80000}, 
-    {0xb5e00000}, {0xb5e80000}, {0xb5f00000}, {0xb5f80000}, 
-    {0xb6000000}, {0xb6040000}, {0xb6080000}, {0xb60c0000}, 
-    {0xb6100000}, {0xb6140000}, {0xb6180000}, {0xb61c0000}, 
-    {0xb6200000}, {0xb6240000}, {0xb6280000}, {0xb62c0000}, 
-    {0xb6300000}, {0xb6340000}, {0xb6380000}, {0xb63c0000}, 
-    {0xb6400000}, {0xb6440000}, {0xb6480000}, {0xb64c0000}, 
-    {0xb6500000}, {0xb6540000}, {0xb6580000}, {0xb65c0000}, 
-    {0xb6600000}, {0xb6640000}, {0xb6680000}, {0xb66c0000}, 
-    {0xb6700000}, {0xb6740000}, {0xb6780000}, {0xb67c0000}, 
-    {0xb6800000}, {0xb6820000}, {0xb6840000}, {0xb6860000}, 
-    {0xb6880000}, {0xb68a0000}, {0xb68c0000}, {0xb68e0000}, 
-    {0xb6900000}, {0xb6920000}, {0xb6940000}, {0xb6960000}, 
-    {0xb6980000}, {0xb69a0000}, {0xb69c0000}, {0xb69e0000}, 
-    {0xb6a00000}, {0xb6a20000}, {0xb6a40000}, {0xb6a60000}, 
-    {0xb6a80000}, {0xb6aa0000}, {0xb6ac0000}, {0xb6ae0000}, 
-    {0xb6b00000}, {0xb6b20000}, {0xb6b40000}, {0xb6b60000}, 
-    {0xb6b80000}, {0xb6ba0000}, {0xb6bc0000}, {0xb6be0000}, 
-    {0xb6c00000}, {0xb6c20000}, {0xb6c40000}, {0xb6c60000}, 
-    {0xb6c80000}, {0xb6ca0000}, {0xb6cc0000}, {0xb6ce0000}, 
-    {0xb6d00000}, {0xb6d20000}, {0xb6d40000}, {0xb6d60000}, 
-    {0xb6d80000}, {0xb6da0000}, {0xb6dc0000}, {0xb6de0000}, 
-    {0xb6e00000}, {0xb6e20000}, {0xb6e40000}, {0xb6e60000}, 
-    {0xb6e80000}, {0xb6ea0000}, {0xb6ec0000}, {0xb6ee0000}, 
-    {0xb6f00000}, {0xb6f20000}, {0xb6f40000}, {0xb6f60000}, 
-    {0xb6f80000}, {0xb6fa0000}, {0xb6fc0000}, {0xb6fe0000}, 
-    {0xb7000000}, {0xb7010000}, {0xb7020000}, {0xb7030000}, 
-    {0xb7040000}, {0xb7050000}, {0xb7060000}, {0xb7070000}, 
-    {0xb7080000}, {0xb7090000}, {0xb70a0000}, {0xb70b0000}, 
-    {0xb70c0000}, {0xb70d0000}, {0xb70e0000}, {0xb70f0000}, 
-    {0xb7100000}, {0xb7110000}, {0xb7120000}, {0xb7130000}, 
-    {0xb7140000}, {0xb7150000}, {0xb7160000}, {0xb7170000}, 
-    {0xb7180000}, {0xb7190000}, {0xb71a0000}, {0xb71b0000}, 
-    {0xb71c0000}, {0xb71d0000}, {0xb71e0000}, {0xb71f0000}, 
-    {0xb7200000}, {0xb7210000}, {0xb7220000}, {0xb7230000}, 
-    {0xb7240000}, {0xb7250000}, {0xb7260000}, {0xb7270000}, 
-    {0xb7280000}, {0xb7290000}, {0xb72a0000}, {0xb72b0000}, 
-    {0xb72c0000}, {0xb72d0000}, {0xb72e0000}, {0xb72f0000}, 
-    {0xb7300000}, {0xb7310000}, {0xb7320000}, {0xb7330000}, 
-    {0xb7340000}, {0xb7350000}, {0xb7360000}, {0xb7370000}, 
-    {0xb7380000}, {0xb7390000}, {0xb73a0000}, {0xb73b0000}, 
-    {0xb73c0000}, {0xb73d0000}, {0xb73e0000}, {0xb73f0000}, 
-    {0xb7400000}, {0xb7410000}, {0xb7420000}, {0xb7430000}, 
-    {0xb7440000}, {0xb7450000}, {0xb7460000}, {0xb7470000}, 
-    {0xb7480000}, {0xb7490000}, {0xb74a0000}, {0xb74b0000}, 
-    {0xb74c0000}, {0xb74d0000}, {0xb74e0000}, {0xb74f0000}, 
-    {0xb7500000}, {0xb7510000}, {0xb7520000}, {0xb7530000}, 
-    {0xb7540000}, {0xb7550000}, {0xb7560000}, {0xb7570000}, 
-    {0xb7580000}, {0xb7590000}, {0xb75a0000}, {0xb75b0000}, 
-    {0xb75c0000}, {0xb75d0000}, {0xb75e0000}, {0xb75f0000}, 
-    {0xb7600000}, {0xb7610000}, {0xb7620000}, {0xb7630000}, 
-    {0xb7640000}, {0xb7650000}, {0xb7660000}, {0xb7670000}, 
-    {0xb7680000}, {0xb7690000}, {0xb76a0000}, {0xb76b0000}, 
-    {0xb76c0000}, {0xb76d0000}, {0xb76e0000}, {0xb76f0000}, 
-    {0xb7700000}, {0xb7710000}, {0xb7720000}, {0xb7730000}, 
-    {0xb7740000}, {0xb7750000}, {0xb7760000}, {0xb7770000}, 
-    {0xb7780000}, {0xb7790000}, {0xb77a0000}, {0xb77b0000}, 
-    {0xb77c0000}, {0xb77d0000}, {0xb77e0000}, {0xb77f0000}, 
-    {0xb7800000}, {0xb7808000}, {0xb7810000}, {0xb7818000}, 
-    {0xb7820000}, {0xb7828000}, {0xb7830000}, {0xb7838000}, 
-    {0xb7840000}, {0xb7848000}, {0xb7850000}, {0xb7858000}, 
-    {0xb7860000}, {0xb7868000}, {0xb7870000}, {0xb7878000}, 
-    {0xb7880000}, {0xb7888000}, {0xb7890000}, {0xb7898000}, 
-    {0xb78a0000}, {0xb78a8000}, {0xb78b0000}, {0xb78b8000}, 
-    {0xb78c0000}, {0xb78c8000}, {0xb78d0000}, {0xb78d8000}, 
-    {0xb78e0000}, {0xb78e8000}, {0xb78f0000}, {0xb78f8000}, 
-    {0xb7900000}, {0xb7908000}, {0xb7910000}, {0xb7918000}, 
-    {0xb7920000}, {0xb7928000}, {0xb7930000}, {0xb7938000}, 
-    {0xb7940000}, {0xb7948000}, {0xb7950000}, {0xb7958000}, 
-    {0xb7960000}, {0xb7968000}, {0xb7970000}, {0xb7978000}, 
-    {0xb7980000}, {0xb7988000}, {0xb7990000}, {0xb7998000}, 
-    {0xb79a0000}, {0xb79a8000}, {0xb79b0000}, {0xb79b8000}, 
-    {0xb79c0000}, {0xb79c8000}, {0xb79d0000}, {0xb79d8000}, 
-    {0xb79e0000}, {0xb79e8000}, {0xb79f0000}, {0xb79f8000}, 
-    {0xb7a00000}, {0xb7a08000}, {0xb7a10000}, {0xb7a18000}, 
-    {0xb7a20000}, {0xb7a28000}, {0xb7a30000}, {0xb7a38000}, 
-    {0xb7a40000}, {0xb7a48000}, {0xb7a50000}, {0xb7a58000}, 
-    {0xb7a60000}, {0xb7a68000}, {0xb7a70000}, {0xb7a78000}, 
-    {0xb7a80000}, {0xb7a88000}, {0xb7a90000}, {0xb7a98000}, 
-    {0xb7aa0000}, {0xb7aa8000}, {0xb7ab0000}, {0xb7ab8000}, 
-    {0xb7ac0000}, {0xb7ac8000}, {0xb7ad0000}, {0xb7ad8000}, 
-    {0xb7ae0000}, {0xb7ae8000}, {0xb7af0000}, {0xb7af8000}, 
-    {0xb7b00000}, {0xb7b08000}, {0xb7b10000}, {0xb7b18000}, 
-    {0xb7b20000}, {0xb7b28000}, {0xb7b30000}, {0xb7b38000}, 
-    {0xb7b40000}, {0xb7b48000}, {0xb7b50000}, {0xb7b58000}, 
-    {0xb7b60000}, {0xb7b68000}, {0xb7b70000}, {0xb7b78000}, 
-    {0xb7b80000}, {0xb7b88000}, {0xb7b90000}, {0xb7b98000}, 
-    {0xb7ba0000}, {0xb7ba8000}, {0xb7bb0000}, {0xb7bb8000}, 
-    {0xb7bc0000}, {0xb7bc8000}, {0xb7bd0000}, {0xb7bd8000}, 
-    {0xb7be0000}, {0xb7be8000}, {0xb7bf0000}, {0xb7bf8000}, 
-    {0xb7c00000}, {0xb7c08000}, {0xb7c10000}, {0xb7c18000}, 
-    {0xb7c20000}, {0xb7c28000}, {0xb7c30000}, {0xb7c38000}, 
-    {0xb7c40000}, {0xb7c48000}, {0xb7c50000}, {0xb7c58000}, 
-    {0xb7c60000}, {0xb7c68000}, {0xb7c70000}, {0xb7c78000}, 
-    {0xb7c80000}, {0xb7c88000}, {0xb7c90000}, {0xb7c98000}, 
-    {0xb7ca0000}, {0xb7ca8000}, {0xb7cb0000}, {0xb7cb8000}, 
-    {0xb7cc0000}, {0xb7cc8000}, {0xb7cd0000}, {0xb7cd8000}, 
-    {0xb7ce0000}, {0xb7ce8000}, {0xb7cf0000}, {0xb7cf8000}, 
-    {0xb7d00000}, {0xb7d08000}, {0xb7d10000}, {0xb7d18000}, 
-    {0xb7d20000}, {0xb7d28000}, {0xb7d30000}, {0xb7d38000}, 
-    {0xb7d40000}, {0xb7d48000}, {0xb7d50000}, {0xb7d58000}, 
-    {0xb7d60000}, {0xb7d68000}, {0xb7d70000}, {0xb7d78000}, 
-    {0xb7d80000}, {0xb7d88000}, {0xb7d90000}, {0xb7d98000}, 
-    {0xb7da0000}, {0xb7da8000}, {0xb7db0000}, {0xb7db8000}, 
-    {0xb7dc0000}, {0xb7dc8000}, {0xb7dd0000}, {0xb7dd8000}, 
-    {0xb7de0000}, {0xb7de8000}, {0xb7df0000}, {0xb7df8000}, 
-    {0xb7e00000}, {0xb7e08000}, {0xb7e10000}, {0xb7e18000}, 
-    {0xb7e20000}, {0xb7e28000}, {0xb7e30000}, {0xb7e38000}, 
-    {0xb7e40000}, {0xb7e48000}, {0xb7e50000}, {0xb7e58000}, 
-    {0xb7e60000}, {0xb7e68000}, {0xb7e70000}, {0xb7e78000}, 
-    {0xb7e80000}, {0xb7e88000}, {0xb7e90000}, {0xb7e98000}, 
-    {0xb7ea0000}, {0xb7ea8000}, {0xb7eb0000}, {0xb7eb8000}, 
-    {0xb7ec0000}, {0xb7ec8000}, {0xb7ed0000}, {0xb7ed8000}, 
-    {0xb7ee0000}, {0xb7ee8000}, {0xb7ef0000}, {0xb7ef8000}, 
-    {0xb7f00000}, {0xb7f08000}, {0xb7f10000}, {0xb7f18000}, 
-    {0xb7f20000}, {0xb7f28000}, {0xb7f30000}, {0xb7f38000}, 
-    {0xb7f40000}, {0xb7f48000}, {0xb7f50000}, {0xb7f58000}, 
-    {0xb7f60000}, {0xb7f68000}, {0xb7f70000}, {0xb7f78000}, 
-    {0xb7f80000}, {0xb7f88000}, {0xb7f90000}, {0xb7f98000}, 
-    {0xb7fa0000}, {0xb7fa8000}, {0xb7fb0000}, {0xb7fb8000}, 
-    {0xb7fc0000}, {0xb7fc8000}, {0xb7fd0000}, {0xb7fd8000}, 
-    {0xb7fe0000}, {0xb7fe8000}, {0xb7ff0000}, {0xb7ff8000}, 
-    {0xb8000000}, {0xb8004000}, {0xb8008000}, {0xb800c000}, 
-    {0xb8010000}, {0xb8014000}, {0xb8018000}, {0xb801c000}, 
-    {0xb8020000}, {0xb8024000}, {0xb8028000}, {0xb802c000}, 
-    {0xb8030000}, {0xb8034000}, {0xb8038000}, {0xb803c000}, 
-    {0xb8040000}, {0xb8044000}, {0xb8048000}, {0xb804c000}, 
-    {0xb8050000}, {0xb8054000}, {0xb8058000}, {0xb805c000}, 
-    {0xb8060000}, {0xb8064000}, {0xb8068000}, {0xb806c000}, 
-    {0xb8070000}, {0xb8074000}, {0xb8078000}, {0xb807c000}, 
-    {0xb8080000}, {0xb8084000}, {0xb8088000}, {0xb808c000}, 
-    {0xb8090000}, {0xb8094000}, {0xb8098000}, {0xb809c000}, 
-    {0xb80a0000}, {0xb80a4000}, {0xb80a8000}, {0xb80ac000}, 
-    {0xb80b0000}, {0xb80b4000}, {0xb80b8000}, {0xb80bc000}, 
-    {0xb80c0000}, {0xb80c4000}, {0xb80c8000}, {0xb80cc000}, 
-    {0xb80d0000}, {0xb80d4000}, {0xb80d8000}, {0xb80dc000}, 
-    {0xb80e0000}, {0xb80e4000}, {0xb80e8000}, {0xb80ec000}, 
-    {0xb80f0000}, {0xb80f4000}, {0xb80f8000}, {0xb80fc000}, 
-    {0xb8100000}, {0xb8104000}, {0xb8108000}, {0xb810c000}, 
-    {0xb8110000}, {0xb8114000}, {0xb8118000}, {0xb811c000}, 
-    {0xb8120000}, {0xb8124000}, {0xb8128000}, {0xb812c000}, 
-    {0xb8130000}, {0xb8134000}, {0xb8138000}, {0xb813c000}, 
-    {0xb8140000}, {0xb8144000}, {0xb8148000}, {0xb814c000}, 
-    {0xb8150000}, {0xb8154000}, {0xb8158000}, {0xb815c000}, 
-    {0xb8160000}, {0xb8164000}, {0xb8168000}, {0xb816c000}, 
-    {0xb8170000}, {0xb8174000}, {0xb8178000}, {0xb817c000}, 
-    {0xb8180000}, {0xb8184000}, {0xb8188000}, {0xb818c000}, 
-    {0xb8190000}, {0xb8194000}, {0xb8198000}, {0xb819c000}, 
-    {0xb81a0000}, {0xb81a4000}, {0xb81a8000}, {0xb81ac000}, 
-    {0xb81b0000}, {0xb81b4000}, {0xb81b8000}, {0xb81bc000}, 
-    {0xb81c0000}, {0xb81c4000}, {0xb81c8000}, {0xb81cc000}, 
-    {0xb81d0000}, {0xb81d4000}, {0xb81d8000}, {0xb81dc000}, 
-    {0xb81e0000}, {0xb81e4000}, {0xb81e8000}, {0xb81ec000}, 
-    {0xb81f0000}, {0xb81f4000}, {0xb81f8000}, {0xb81fc000}, 
-    {0xb8200000}, {0xb8204000}, {0xb8208000}, {0xb820c000}, 
-    {0xb8210000}, {0xb8214000}, {0xb8218000}, {0xb821c000}, 
-    {0xb8220000}, {0xb8224000}, {0xb8228000}, {0xb822c000}, 
-    {0xb8230000}, {0xb8234000}, {0xb8238000}, {0xb823c000}, 
-    {0xb8240000}, {0xb8244000}, {0xb8248000}, {0xb824c000}, 
-    {0xb8250000}, {0xb8254000}, {0xb8258000}, {0xb825c000}, 
-    {0xb8260000}, {0xb8264000}, {0xb8268000}, {0xb826c000}, 
-    {0xb8270000}, {0xb8274000}, {0xb8278000}, {0xb827c000}, 
-    {0xb8280000}, {0xb8284000}, {0xb8288000}, {0xb828c000}, 
-    {0xb8290000}, {0xb8294000}, {0xb8298000}, {0xb829c000}, 
-    {0xb82a0000}, {0xb82a4000}, {0xb82a8000}, {0xb82ac000}, 
-    {0xb82b0000}, {0xb82b4000}, {0xb82b8000}, {0xb82bc000}, 
-    {0xb82c0000}, {0xb82c4000}, {0xb82c8000}, {0xb82cc000}, 
-    {0xb82d0000}, {0xb82d4000}, {0xb82d8000}, {0xb82dc000}, 
-    {0xb82e0000}, {0xb82e4000}, {0xb82e8000}, {0xb82ec000}, 
-    {0xb82f0000}, {0xb82f4000}, {0xb82f8000}, {0xb82fc000}, 
-    {0xb8300000}, {0xb8304000}, {0xb8308000}, {0xb830c000}, 
-    {0xb8310000}, {0xb8314000}, {0xb8318000}, {0xb831c000}, 
-    {0xb8320000}, {0xb8324000}, {0xb8328000}, {0xb832c000}, 
-    {0xb8330000}, {0xb8334000}, {0xb8338000}, {0xb833c000}, 
-    {0xb8340000}, {0xb8344000}, {0xb8348000}, {0xb834c000}, 
-    {0xb8350000}, {0xb8354000}, {0xb8358000}, {0xb835c000}, 
-    {0xb8360000}, {0xb8364000}, {0xb8368000}, {0xb836c000}, 
-    {0xb8370000}, {0xb8374000}, {0xb8378000}, {0xb837c000}, 
-    {0xb8380000}, {0xb8384000}, {0xb8388000}, {0xb838c000}, 
-    {0xb8390000}, {0xb8394000}, {0xb8398000}, {0xb839c000}, 
-    {0xb83a0000}, {0xb83a4000}, {0xb83a8000}, {0xb83ac000}, 
-    {0xb83b0000}, {0xb83b4000}, {0xb83b8000}, {0xb83bc000}, 
-    {0xb83c0000}, {0xb83c4000}, {0xb83c8000}, {0xb83cc000}, 
-    {0xb83d0000}, {0xb83d4000}, {0xb83d8000}, {0xb83dc000}, 
-    {0xb83e0000}, {0xb83e4000}, {0xb83e8000}, {0xb83ec000}, 
-    {0xb83f0000}, {0xb83f4000}, {0xb83f8000}, {0xb83fc000}, 
-    {0xb8400000}, {0xb8404000}, {0xb8408000}, {0xb840c000}, 
-    {0xb8410000}, {0xb8414000}, {0xb8418000}, {0xb841c000}, 
-    {0xb8420000}, {0xb8424000}, {0xb8428000}, {0xb842c000}, 
-    {0xb8430000}, {0xb8434000}, {0xb8438000}, {0xb843c000}, 
-    {0xb8440000}, {0xb8444000}, {0xb8448000}, {0xb844c000}, 
-    {0xb8450000}, {0xb8454000}, {0xb8458000}, {0xb845c000}, 
-    {0xb8460000}, {0xb8464000}, {0xb8468000}, {0xb846c000}, 
-    {0xb8470000}, {0xb8474000}, {0xb8478000}, {0xb847c000}, 
-    {0xb8480000}, {0xb8484000}, {0xb8488000}, {0xb848c000}, 
-    {0xb8490000}, {0xb8494000}, {0xb8498000}, {0xb849c000}, 
-    {0xb84a0000}, {0xb84a4000}, {0xb84a8000}, {0xb84ac000}, 
-    {0xb84b0000}, {0xb84b4000}, {0xb84b8000}, {0xb84bc000}, 
-    {0xb84c0000}, {0xb84c4000}, {0xb84c8000}, {0xb84cc000}, 
-    {0xb84d0000}, {0xb84d4000}, {0xb84d8000}, {0xb84dc000}, 
-    {0xb84e0000}, {0xb84e4000}, {0xb84e8000}, {0xb84ec000}, 
-    {0xb84f0000}, {0xb84f4000}, {0xb84f8000}, {0xb84fc000}, 
-    {0xb8500000}, {0xb8504000}, {0xb8508000}, {0xb850c000}, 
-    {0xb8510000}, {0xb8514000}, {0xb8518000}, {0xb851c000}, 
-    {0xb8520000}, {0xb8524000}, {0xb8528000}, {0xb852c000}, 
-    {0xb8530000}, {0xb8534000}, {0xb8538000}, {0xb853c000}, 
-    {0xb8540000}, {0xb8544000}, {0xb8548000}, {0xb854c000}, 
-    {0xb8550000}, {0xb8554000}, {0xb8558000}, {0xb855c000}, 
-    {0xb8560000}, {0xb8564000}, {0xb8568000}, {0xb856c000}, 
-    {0xb8570000}, {0xb8574000}, {0xb8578000}, {0xb857c000}, 
-    {0xb8580000}, {0xb8584000}, {0xb8588000}, {0xb858c000}, 
-    {0xb8590000}, {0xb8594000}, {0xb8598000}, {0xb859c000}, 
-    {0xb85a0000}, {0xb85a4000}, {0xb85a8000}, {0xb85ac000}, 
-    {0xb85b0000}, {0xb85b4000}, {0xb85b8000}, {0xb85bc000}, 
-    {0xb85c0000}, {0xb85c4000}, {0xb85c8000}, {0xb85cc000}, 
-    {0xb85d0000}, {0xb85d4000}, {0xb85d8000}, {0xb85dc000}, 
-    {0xb85e0000}, {0xb85e4000}, {0xb85e8000}, {0xb85ec000}, 
-    {0xb85f0000}, {0xb85f4000}, {0xb85f8000}, {0xb85fc000}, 
-    {0xb8600000}, {0xb8604000}, {0xb8608000}, {0xb860c000}, 
-    {0xb8610000}, {0xb8614000}, {0xb8618000}, {0xb861c000}, 
-    {0xb8620000}, {0xb8624000}, {0xb8628000}, {0xb862c000}, 
-    {0xb8630000}, {0xb8634000}, {0xb8638000}, {0xb863c000}, 
-    {0xb8640000}, {0xb8644000}, {0xb8648000}, {0xb864c000}, 
-    {0xb8650000}, {0xb8654000}, {0xb8658000}, {0xb865c000}, 
-    {0xb8660000}, {0xb8664000}, {0xb8668000}, {0xb866c000}, 
-    {0xb8670000}, {0xb8674000}, {0xb8678000}, {0xb867c000}, 
-    {0xb8680000}, {0xb8684000}, {0xb8688000}, {0xb868c000}, 
-    {0xb8690000}, {0xb8694000}, {0xb8698000}, {0xb869c000}, 
-    {0xb86a0000}, {0xb86a4000}, {0xb86a8000}, {0xb86ac000}, 
-    {0xb86b0000}, {0xb86b4000}, {0xb86b8000}, {0xb86bc000}, 
-    {0xb86c0000}, {0xb86c4000}, {0xb86c8000}, {0xb86cc000}, 
-    {0xb86d0000}, {0xb86d4000}, {0xb86d8000}, {0xb86dc000}, 
-    {0xb86e0000}, {0xb86e4000}, {0xb86e8000}, {0xb86ec000}, 
-    {0xb86f0000}, {0xb86f4000}, {0xb86f8000}, {0xb86fc000}, 
-    {0xb8700000}, {0xb8704000}, {0xb8708000}, {0xb870c000}, 
-    {0xb8710000}, {0xb8714000}, {0xb8718000}, {0xb871c000}, 
-    {0xb8720000}, {0xb8724000}, {0xb8728000}, {0xb872c000}, 
-    {0xb8730000}, {0xb8734000}, {0xb8738000}, {0xb873c000}, 
-    {0xb8740000}, {0xb8744000}, {0xb8748000}, {0xb874c000}, 
-    {0xb8750000}, {0xb8754000}, {0xb8758000}, {0xb875c000}, 
-    {0xb8760000}, {0xb8764000}, {0xb8768000}, {0xb876c000}, 
-    {0xb8770000}, {0xb8774000}, {0xb8778000}, {0xb877c000}, 
-    {0xb8780000}, {0xb8784000}, {0xb8788000}, {0xb878c000}, 
-    {0xb8790000}, {0xb8794000}, {0xb8798000}, {0xb879c000}, 
-    {0xb87a0000}, {0xb87a4000}, {0xb87a8000}, {0xb87ac000}, 
-    {0xb87b0000}, {0xb87b4000}, {0xb87b8000}, {0xb87bc000}, 
-    {0xb87c0000}, {0xb87c4000}, {0xb87c8000}, {0xb87cc000}, 
-    {0xb87d0000}, {0xb87d4000}, {0xb87d8000}, {0xb87dc000}, 
-    {0xb87e0000}, {0xb87e4000}, {0xb87e8000}, {0xb87ec000}, 
-    {0xb87f0000}, {0xb87f4000}, {0xb87f8000}, {0xb87fc000}, 
-    {0xb8800000}, {0xb8802000}, {0xb8804000}, {0xb8806000}, 
-    {0xb8808000}, {0xb880a000}, {0xb880c000}, {0xb880e000}, 
-    {0xb8810000}, {0xb8812000}, {0xb8814000}, {0xb8816000}, 
-    {0xb8818000}, {0xb881a000}, {0xb881c000}, {0xb881e000}, 
-    {0xb8820000}, {0xb8822000}, {0xb8824000}, {0xb8826000}, 
-    {0xb8828000}, {0xb882a000}, {0xb882c000}, {0xb882e000}, 
-    {0xb8830000}, {0xb8832000}, {0xb8834000}, {0xb8836000}, 
-    {0xb8838000}, {0xb883a000}, {0xb883c000}, {0xb883e000}, 
-    {0xb8840000}, {0xb8842000}, {0xb8844000}, {0xb8846000}, 
-    {0xb8848000}, {0xb884a000}, {0xb884c000}, {0xb884e000}, 
-    {0xb8850000}, {0xb8852000}, {0xb8854000}, {0xb8856000}, 
-    {0xb8858000}, {0xb885a000}, {0xb885c000}, {0xb885e000}, 
-    {0xb8860000}, {0xb8862000}, {0xb8864000}, {0xb8866000}, 
-    {0xb8868000}, {0xb886a000}, {0xb886c000}, {0xb886e000}, 
-    {0xb8870000}, {0xb8872000}, {0xb8874000}, {0xb8876000}, 
-    {0xb8878000}, {0xb887a000}, {0xb887c000}, {0xb887e000}, 
-    {0xb8880000}, {0xb8882000}, {0xb8884000}, {0xb8886000}, 
-    {0xb8888000}, {0xb888a000}, {0xb888c000}, {0xb888e000}, 
-    {0xb8890000}, {0xb8892000}, {0xb8894000}, {0xb8896000}, 
-    {0xb8898000}, {0xb889a000}, {0xb889c000}, {0xb889e000}, 
-    {0xb88a0000}, {0xb88a2000}, {0xb88a4000}, {0xb88a6000}, 
-    {0xb88a8000}, {0xb88aa000}, {0xb88ac000}, {0xb88ae000}, 
-    {0xb88b0000}, {0xb88b2000}, {0xb88b4000}, {0xb88b6000}, 
-    {0xb88b8000}, {0xb88ba000}, {0xb88bc000}, {0xb88be000}, 
-    {0xb88c0000}, {0xb88c2000}, {0xb88c4000}, {0xb88c6000}, 
-    {0xb88c8000}, {0xb88ca000}, {0xb88cc000}, {0xb88ce000}, 
-    {0xb88d0000}, {0xb88d2000}, {0xb88d4000}, {0xb88d6000}, 
-    {0xb88d8000}, {0xb88da000}, {0xb88dc000}, {0xb88de000}, 
-    {0xb88e0000}, {0xb88e2000}, {0xb88e4000}, {0xb88e6000}, 
-    {0xb88e8000}, {0xb88ea000}, {0xb88ec000}, {0xb88ee000}, 
-    {0xb88f0000}, {0xb88f2000}, {0xb88f4000}, {0xb88f6000}, 
-    {0xb88f8000}, {0xb88fa000}, {0xb88fc000}, {0xb88fe000}, 
-    {0xb8900000}, {0xb8902000}, {0xb8904000}, {0xb8906000}, 
-    {0xb8908000}, {0xb890a000}, {0xb890c000}, {0xb890e000}, 
-    {0xb8910000}, {0xb8912000}, {0xb8914000}, {0xb8916000}, 
-    {0xb8918000}, {0xb891a000}, {0xb891c000}, {0xb891e000}, 
-    {0xb8920000}, {0xb8922000}, {0xb8924000}, {0xb8926000}, 
-    {0xb8928000}, {0xb892a000}, {0xb892c000}, {0xb892e000}, 
-    {0xb8930000}, {0xb8932000}, {0xb8934000}, {0xb8936000}, 
-    {0xb8938000}, {0xb893a000}, {0xb893c000}, {0xb893e000}, 
-    {0xb8940000}, {0xb8942000}, {0xb8944000}, {0xb8946000}, 
-    {0xb8948000}, {0xb894a000}, {0xb894c000}, {0xb894e000}, 
-    {0xb8950000}, {0xb8952000}, {0xb8954000}, {0xb8956000}, 
-    {0xb8958000}, {0xb895a000}, {0xb895c000}, {0xb895e000}, 
-    {0xb8960000}, {0xb8962000}, {0xb8964000}, {0xb8966000}, 
-    {0xb8968000}, {0xb896a000}, {0xb896c000}, {0xb896e000}, 
-    {0xb8970000}, {0xb8972000}, {0xb8974000}, {0xb8976000}, 
-    {0xb8978000}, {0xb897a000}, {0xb897c000}, {0xb897e000}, 
-    {0xb8980000}, {0xb8982000}, {0xb8984000}, {0xb8986000}, 
-    {0xb8988000}, {0xb898a000}, {0xb898c000}, {0xb898e000}, 
-    {0xb8990000}, {0xb8992000}, {0xb8994000}, {0xb8996000}, 
-    {0xb8998000}, {0xb899a000}, {0xb899c000}, {0xb899e000}, 
-    {0xb89a0000}, {0xb89a2000}, {0xb89a4000}, {0xb89a6000}, 
-    {0xb89a8000}, {0xb89aa000}, {0xb89ac000}, {0xb89ae000}, 
-    {0xb89b0000}, {0xb89b2000}, {0xb89b4000}, {0xb89b6000}, 
-    {0xb89b8000}, {0xb89ba000}, {0xb89bc000}, {0xb89be000}, 
-    {0xb89c0000}, {0xb89c2000}, {0xb89c4000}, {0xb89c6000}, 
-    {0xb89c8000}, {0xb89ca000}, {0xb89cc000}, {0xb89ce000}, 
-    {0xb89d0000}, {0xb89d2000}, {0xb89d4000}, {0xb89d6000}, 
-    {0xb89d8000}, {0xb89da000}, {0xb89dc000}, {0xb89de000}, 
-    {0xb89e0000}, {0xb89e2000}, {0xb89e4000}, {0xb89e6000}, 
-    {0xb89e8000}, {0xb89ea000}, {0xb89ec000}, {0xb89ee000}, 
-    {0xb89f0000}, {0xb89f2000}, {0xb89f4000}, {0xb89f6000}, 
-    {0xb89f8000}, {0xb89fa000}, {0xb89fc000}, {0xb89fe000}, 
-    {0xb8a00000}, {0xb8a02000}, {0xb8a04000}, {0xb8a06000}, 
-    {0xb8a08000}, {0xb8a0a000}, {0xb8a0c000}, {0xb8a0e000}, 
-    {0xb8a10000}, {0xb8a12000}, {0xb8a14000}, {0xb8a16000}, 
-    {0xb8a18000}, {0xb8a1a000}, {0xb8a1c000}, {0xb8a1e000}, 
-    {0xb8a20000}, {0xb8a22000}, {0xb8a24000}, {0xb8a26000}, 
-    {0xb8a28000}, {0xb8a2a000}, {0xb8a2c000}, {0xb8a2e000}, 
-    {0xb8a30000}, {0xb8a32000}, {0xb8a34000}, {0xb8a36000}, 
-    {0xb8a38000}, {0xb8a3a000}, {0xb8a3c000}, {0xb8a3e000}, 
-    {0xb8a40000}, {0xb8a42000}, {0xb8a44000}, {0xb8a46000}, 
-    {0xb8a48000}, {0xb8a4a000}, {0xb8a4c000}, {0xb8a4e000}, 
-    {0xb8a50000}, {0xb8a52000}, {0xb8a54000}, {0xb8a56000}, 
-    {0xb8a58000}, {0xb8a5a000}, {0xb8a5c000}, {0xb8a5e000}, 
-    {0xb8a60000}, {0xb8a62000}, {0xb8a64000}, {0xb8a66000}, 
-    {0xb8a68000}, {0xb8a6a000}, {0xb8a6c000}, {0xb8a6e000}, 
-    {0xb8a70000}, {0xb8a72000}, {0xb8a74000}, {0xb8a76000}, 
-    {0xb8a78000}, {0xb8a7a000}, {0xb8a7c000}, {0xb8a7e000}, 
-    {0xb8a80000}, {0xb8a82000}, {0xb8a84000}, {0xb8a86000}, 
-    {0xb8a88000}, {0xb8a8a000}, {0xb8a8c000}, {0xb8a8e000}, 
-    {0xb8a90000}, {0xb8a92000}, {0xb8a94000}, {0xb8a96000}, 
-    {0xb8a98000}, {0xb8a9a000}, {0xb8a9c000}, {0xb8a9e000}, 
-    {0xb8aa0000}, {0xb8aa2000}, {0xb8aa4000}, {0xb8aa6000}, 
-    {0xb8aa8000}, {0xb8aaa000}, {0xb8aac000}, {0xb8aae000}, 
-    {0xb8ab0000}, {0xb8ab2000}, {0xb8ab4000}, {0xb8ab6000}, 
-    {0xb8ab8000}, {0xb8aba000}, {0xb8abc000}, {0xb8abe000}, 
-    {0xb8ac0000}, {0xb8ac2000}, {0xb8ac4000}, {0xb8ac6000}, 
-    {0xb8ac8000}, {0xb8aca000}, {0xb8acc000}, {0xb8ace000}, 
-    {0xb8ad0000}, {0xb8ad2000}, {0xb8ad4000}, {0xb8ad6000}, 
-    {0xb8ad8000}, {0xb8ada000}, {0xb8adc000}, {0xb8ade000}, 
-    {0xb8ae0000}, {0xb8ae2000}, {0xb8ae4000}, {0xb8ae6000}, 
-    {0xb8ae8000}, {0xb8aea000}, {0xb8aec000}, {0xb8aee000}, 
-    {0xb8af0000}, {0xb8af2000}, {0xb8af4000}, {0xb8af6000}, 
-    {0xb8af8000}, {0xb8afa000}, {0xb8afc000}, {0xb8afe000}, 
-    {0xb8b00000}, {0xb8b02000}, {0xb8b04000}, {0xb8b06000}, 
-    {0xb8b08000}, {0xb8b0a000}, {0xb8b0c000}, {0xb8b0e000}, 
-    {0xb8b10000}, {0xb8b12000}, {0xb8b14000}, {0xb8b16000}, 
-    {0xb8b18000}, {0xb8b1a000}, {0xb8b1c000}, {0xb8b1e000}, 
-    {0xb8b20000}, {0xb8b22000}, {0xb8b24000}, {0xb8b26000}, 
-    {0xb8b28000}, {0xb8b2a000}, {0xb8b2c000}, {0xb8b2e000}, 
-    {0xb8b30000}, {0xb8b32000}, {0xb8b34000}, {0xb8b36000}, 
-    {0xb8b38000}, {0xb8b3a000}, {0xb8b3c000}, {0xb8b3e000}, 
-    {0xb8b40000}, {0xb8b42000}, {0xb8b44000}, {0xb8b46000}, 
-    {0xb8b48000}, {0xb8b4a000}, {0xb8b4c000}, {0xb8b4e000}, 
-    {0xb8b50000}, {0xb8b52000}, {0xb8b54000}, {0xb8b56000}, 
-    {0xb8b58000}, {0xb8b5a000}, {0xb8b5c000}, {0xb8b5e000}, 
-    {0xb8b60000}, {0xb8b62000}, {0xb8b64000}, {0xb8b66000}, 
-    {0xb8b68000}, {0xb8b6a000}, {0xb8b6c000}, {0xb8b6e000}, 
-    {0xb8b70000}, {0xb8b72000}, {0xb8b74000}, {0xb8b76000}, 
-    {0xb8b78000}, {0xb8b7a000}, {0xb8b7c000}, {0xb8b7e000}, 
-    {0xb8b80000}, {0xb8b82000}, {0xb8b84000}, {0xb8b86000}, 
-    {0xb8b88000}, {0xb8b8a000}, {0xb8b8c000}, {0xb8b8e000}, 
-    {0xb8b90000}, {0xb8b92000}, {0xb8b94000}, {0xb8b96000}, 
-    {0xb8b98000}, {0xb8b9a000}, {0xb8b9c000}, {0xb8b9e000}, 
-    {0xb8ba0000}, {0xb8ba2000}, {0xb8ba4000}, {0xb8ba6000}, 
-    {0xb8ba8000}, {0xb8baa000}, {0xb8bac000}, {0xb8bae000}, 
-    {0xb8bb0000}, {0xb8bb2000}, {0xb8bb4000}, {0xb8bb6000}, 
-    {0xb8bb8000}, {0xb8bba000}, {0xb8bbc000}, {0xb8bbe000}, 
-    {0xb8bc0000}, {0xb8bc2000}, {0xb8bc4000}, {0xb8bc6000}, 
-    {0xb8bc8000}, {0xb8bca000}, {0xb8bcc000}, {0xb8bce000}, 
-    {0xb8bd0000}, {0xb8bd2000}, {0xb8bd4000}, {0xb8bd6000}, 
-    {0xb8bd8000}, {0xb8bda000}, {0xb8bdc000}, {0xb8bde000}, 
-    {0xb8be0000}, {0xb8be2000}, {0xb8be4000}, {0xb8be6000}, 
-    {0xb8be8000}, {0xb8bea000}, {0xb8bec000}, {0xb8bee000}, 
-    {0xb8bf0000}, {0xb8bf2000}, {0xb8bf4000}, {0xb8bf6000}, 
-    {0xb8bf8000}, {0xb8bfa000}, {0xb8bfc000}, {0xb8bfe000}, 
-    {0xb8c00000}, {0xb8c02000}, {0xb8c04000}, {0xb8c06000}, 
-    {0xb8c08000}, {0xb8c0a000}, {0xb8c0c000}, {0xb8c0e000}, 
-    {0xb8c10000}, {0xb8c12000}, {0xb8c14000}, {0xb8c16000}, 
-    {0xb8c18000}, {0xb8c1a000}, {0xb8c1c000}, {0xb8c1e000}, 
-    {0xb8c20000}, {0xb8c22000}, {0xb8c24000}, {0xb8c26000}, 
-    {0xb8c28000}, {0xb8c2a000}, {0xb8c2c000}, {0xb8c2e000}, 
-    {0xb8c30000}, {0xb8c32000}, {0xb8c34000}, {0xb8c36000}, 
-    {0xb8c38000}, {0xb8c3a000}, {0xb8c3c000}, {0xb8c3e000}, 
-    {0xb8c40000}, {0xb8c42000}, {0xb8c44000}, {0xb8c46000}, 
-    {0xb8c48000}, {0xb8c4a000}, {0xb8c4c000}, {0xb8c4e000}, 
-    {0xb8c50000}, {0xb8c52000}, {0xb8c54000}, {0xb8c56000}, 
-    {0xb8c58000}, {0xb8c5a000}, {0xb8c5c000}, {0xb8c5e000}, 
-    {0xb8c60000}, {0xb8c62000}, {0xb8c64000}, {0xb8c66000}, 
-    {0xb8c68000}, {0xb8c6a000}, {0xb8c6c000}, {0xb8c6e000}, 
-    {0xb8c70000}, {0xb8c72000}, {0xb8c74000}, {0xb8c76000}, 
-    {0xb8c78000}, {0xb8c7a000}, {0xb8c7c000}, {0xb8c7e000}, 
-    {0xb8c80000}, {0xb8c82000}, {0xb8c84000}, {0xb8c86000}, 
-    {0xb8c88000}, {0xb8c8a000}, {0xb8c8c000}, {0xb8c8e000}, 
-    {0xb8c90000}, {0xb8c92000}, {0xb8c94000}, {0xb8c96000}, 
-    {0xb8c98000}, {0xb8c9a000}, {0xb8c9c000}, {0xb8c9e000}, 
-    {0xb8ca0000}, {0xb8ca2000}, {0xb8ca4000}, {0xb8ca6000}, 
-    {0xb8ca8000}, {0xb8caa000}, {0xb8cac000}, {0xb8cae000}, 
-    {0xb8cb0000}, {0xb8cb2000}, {0xb8cb4000}, {0xb8cb6000}, 
-    {0xb8cb8000}, {0xb8cba000}, {0xb8cbc000}, {0xb8cbe000}, 
-    {0xb8cc0000}, {0xb8cc2000}, {0xb8cc4000}, {0xb8cc6000}, 
-    {0xb8cc8000}, {0xb8cca000}, {0xb8ccc000}, {0xb8cce000}, 
-    {0xb8cd0000}, {0xb8cd2000}, {0xb8cd4000}, {0xb8cd6000}, 
-    {0xb8cd8000}, {0xb8cda000}, {0xb8cdc000}, {0xb8cde000}, 
-    {0xb8ce0000}, {0xb8ce2000}, {0xb8ce4000}, {0xb8ce6000}, 
-    {0xb8ce8000}, {0xb8cea000}, {0xb8cec000}, {0xb8cee000}, 
-    {0xb8cf0000}, {0xb8cf2000}, {0xb8cf4000}, {0xb8cf6000}, 
-    {0xb8cf8000}, {0xb8cfa000}, {0xb8cfc000}, {0xb8cfe000}, 
-    {0xb8d00000}, {0xb8d02000}, {0xb8d04000}, {0xb8d06000}, 
-    {0xb8d08000}, {0xb8d0a000}, {0xb8d0c000}, {0xb8d0e000}, 
-    {0xb8d10000}, {0xb8d12000}, {0xb8d14000}, {0xb8d16000}, 
-    {0xb8d18000}, {0xb8d1a000}, {0xb8d1c000}, {0xb8d1e000}, 
-    {0xb8d20000}, {0xb8d22000}, {0xb8d24000}, {0xb8d26000}, 
-    {0xb8d28000}, {0xb8d2a000}, {0xb8d2c000}, {0xb8d2e000}, 
-    {0xb8d30000}, {0xb8d32000}, {0xb8d34000}, {0xb8d36000}, 
-    {0xb8d38000}, {0xb8d3a000}, {0xb8d3c000}, {0xb8d3e000}, 
-    {0xb8d40000}, {0xb8d42000}, {0xb8d44000}, {0xb8d46000}, 
-    {0xb8d48000}, {0xb8d4a000}, {0xb8d4c000}, {0xb8d4e000}, 
-    {0xb8d50000}, {0xb8d52000}, {0xb8d54000}, {0xb8d56000}, 
-    {0xb8d58000}, {0xb8d5a000}, {0xb8d5c000}, {0xb8d5e000}, 
-    {0xb8d60000}, {0xb8d62000}, {0xb8d64000}, {0xb8d66000}, 
-    {0xb8d68000}, {0xb8d6a000}, {0xb8d6c000}, {0xb8d6e000}, 
-    {0xb8d70000}, {0xb8d72000}, {0xb8d74000}, {0xb8d76000}, 
-    {0xb8d78000}, {0xb8d7a000}, {0xb8d7c000}, {0xb8d7e000}, 
-    {0xb8d80000}, {0xb8d82000}, {0xb8d84000}, {0xb8d86000}, 
-    {0xb8d88000}, {0xb8d8a000}, {0xb8d8c000}, {0xb8d8e000}, 
-    {0xb8d90000}, {0xb8d92000}, {0xb8d94000}, {0xb8d96000}, 
-    {0xb8d98000}, {0xb8d9a000}, {0xb8d9c000}, {0xb8d9e000}, 
-    {0xb8da0000}, {0xb8da2000}, {0xb8da4000}, {0xb8da6000}, 
-    {0xb8da8000}, {0xb8daa000}, {0xb8dac000}, {0xb8dae000}, 
-    {0xb8db0000}, {0xb8db2000}, {0xb8db4000}, {0xb8db6000}, 
-    {0xb8db8000}, {0xb8dba000}, {0xb8dbc000}, {0xb8dbe000}, 
-    {0xb8dc0000}, {0xb8dc2000}, {0xb8dc4000}, {0xb8dc6000}, 
-    {0xb8dc8000}, {0xb8dca000}, {0xb8dcc000}, {0xb8dce000}, 
-    {0xb8dd0000}, {0xb8dd2000}, {0xb8dd4000}, {0xb8dd6000}, 
-    {0xb8dd8000}, {0xb8dda000}, {0xb8ddc000}, {0xb8dde000}, 
-    {0xb8de0000}, {0xb8de2000}, {0xb8de4000}, {0xb8de6000}, 
-    {0xb8de8000}, {0xb8dea000}, {0xb8dec000}, {0xb8dee000}, 
-    {0xb8df0000}, {0xb8df2000}, {0xb8df4000}, {0xb8df6000}, 
-    {0xb8df8000}, {0xb8dfa000}, {0xb8dfc000}, {0xb8dfe000}, 
-    {0xb8e00000}, {0xb8e02000}, {0xb8e04000}, {0xb8e06000}, 
-    {0xb8e08000}, {0xb8e0a000}, {0xb8e0c000}, {0xb8e0e000}, 
-    {0xb8e10000}, {0xb8e12000}, {0xb8e14000}, {0xb8e16000}, 
-    {0xb8e18000}, {0xb8e1a000}, {0xb8e1c000}, {0xb8e1e000}, 
-    {0xb8e20000}, {0xb8e22000}, {0xb8e24000}, {0xb8e26000}, 
-    {0xb8e28000}, {0xb8e2a000}, {0xb8e2c000}, {0xb8e2e000}, 
-    {0xb8e30000}, {0xb8e32000}, {0xb8e34000}, {0xb8e36000}, 
-    {0xb8e38000}, {0xb8e3a000}, {0xb8e3c000}, {0xb8e3e000}, 
-    {0xb8e40000}, {0xb8e42000}, {0xb8e44000}, {0xb8e46000}, 
-    {0xb8e48000}, {0xb8e4a000}, {0xb8e4c000}, {0xb8e4e000}, 
-    {0xb8e50000}, {0xb8e52000}, {0xb8e54000}, {0xb8e56000}, 
-    {0xb8e58000}, {0xb8e5a000}, {0xb8e5c000}, {0xb8e5e000}, 
-    {0xb8e60000}, {0xb8e62000}, {0xb8e64000}, {0xb8e66000}, 
-    {0xb8e68000}, {0xb8e6a000}, {0xb8e6c000}, {0xb8e6e000}, 
-    {0xb8e70000}, {0xb8e72000}, {0xb8e74000}, {0xb8e76000}, 
-    {0xb8e78000}, {0xb8e7a000}, {0xb8e7c000}, {0xb8e7e000}, 
-    {0xb8e80000}, {0xb8e82000}, {0xb8e84000}, {0xb8e86000}, 
-    {0xb8e88000}, {0xb8e8a000}, {0xb8e8c000}, {0xb8e8e000}, 
-    {0xb8e90000}, {0xb8e92000}, {0xb8e94000}, {0xb8e96000}, 
-    {0xb8e98000}, {0xb8e9a000}, {0xb8e9c000}, {0xb8e9e000}, 
-    {0xb8ea0000}, {0xb8ea2000}, {0xb8ea4000}, {0xb8ea6000}, 
-    {0xb8ea8000}, {0xb8eaa000}, {0xb8eac000}, {0xb8eae000}, 
-    {0xb8eb0000}, {0xb8eb2000}, {0xb8eb4000}, {0xb8eb6000}, 
-    {0xb8eb8000}, {0xb8eba000}, {0xb8ebc000}, {0xb8ebe000}, 
-    {0xb8ec0000}, {0xb8ec2000}, {0xb8ec4000}, {0xb8ec6000}, 
-    {0xb8ec8000}, {0xb8eca000}, {0xb8ecc000}, {0xb8ece000}, 
-    {0xb8ed0000}, {0xb8ed2000}, {0xb8ed4000}, {0xb8ed6000}, 
-    {0xb8ed8000}, {0xb8eda000}, {0xb8edc000}, {0xb8ede000}, 
-    {0xb8ee0000}, {0xb8ee2000}, {0xb8ee4000}, {0xb8ee6000}, 
-    {0xb8ee8000}, {0xb8eea000}, {0xb8eec000}, {0xb8eee000}, 
-    {0xb8ef0000}, {0xb8ef2000}, {0xb8ef4000}, {0xb8ef6000}, 
-    {0xb8ef8000}, {0xb8efa000}, {0xb8efc000}, {0xb8efe000}, 
-    {0xb8f00000}, {0xb8f02000}, {0xb8f04000}, {0xb8f06000}, 
-    {0xb8f08000}, {0xb8f0a000}, {0xb8f0c000}, {0xb8f0e000}, 
-    {0xb8f10000}, {0xb8f12000}, {0xb8f14000}, {0xb8f16000}, 
-    {0xb8f18000}, {0xb8f1a000}, {0xb8f1c000}, {0xb8f1e000}, 
-    {0xb8f20000}, {0xb8f22000}, {0xb8f24000}, {0xb8f26000}, 
-    {0xb8f28000}, {0xb8f2a000}, {0xb8f2c000}, {0xb8f2e000}, 
-    {0xb8f30000}, {0xb8f32000}, {0xb8f34000}, {0xb8f36000}, 
-    {0xb8f38000}, {0xb8f3a000}, {0xb8f3c000}, {0xb8f3e000}, 
-    {0xb8f40000}, {0xb8f42000}, {0xb8f44000}, {0xb8f46000}, 
-    {0xb8f48000}, {0xb8f4a000}, {0xb8f4c000}, {0xb8f4e000}, 
-    {0xb8f50000}, {0xb8f52000}, {0xb8f54000}, {0xb8f56000}, 
-    {0xb8f58000}, {0xb8f5a000}, {0xb8f5c000}, {0xb8f5e000}, 
-    {0xb8f60000}, {0xb8f62000}, {0xb8f64000}, {0xb8f66000}, 
-    {0xb8f68000}, {0xb8f6a000}, {0xb8f6c000}, {0xb8f6e000}, 
-    {0xb8f70000}, {0xb8f72000}, {0xb8f74000}, {0xb8f76000}, 
-    {0xb8f78000}, {0xb8f7a000}, {0xb8f7c000}, {0xb8f7e000}, 
-    {0xb8f80000}, {0xb8f82000}, {0xb8f84000}, {0xb8f86000}, 
-    {0xb8f88000}, {0xb8f8a000}, {0xb8f8c000}, {0xb8f8e000}, 
-    {0xb8f90000}, {0xb8f92000}, {0xb8f94000}, {0xb8f96000}, 
-    {0xb8f98000}, {0xb8f9a000}, {0xb8f9c000}, {0xb8f9e000}, 
-    {0xb8fa0000}, {0xb8fa2000}, {0xb8fa4000}, {0xb8fa6000}, 
-    {0xb8fa8000}, {0xb8faa000}, {0xb8fac000}, {0xb8fae000}, 
-    {0xb8fb0000}, {0xb8fb2000}, {0xb8fb4000}, {0xb8fb6000}, 
-    {0xb8fb8000}, {0xb8fba000}, {0xb8fbc000}, {0xb8fbe000}, 
-    {0xb8fc0000}, {0xb8fc2000}, {0xb8fc4000}, {0xb8fc6000}, 
-    {0xb8fc8000}, {0xb8fca000}, {0xb8fcc000}, {0xb8fce000}, 
-    {0xb8fd0000}, {0xb8fd2000}, {0xb8fd4000}, {0xb8fd6000}, 
-    {0xb8fd8000}, {0xb8fda000}, {0xb8fdc000}, {0xb8fde000}, 
-    {0xb8fe0000}, {0xb8fe2000}, {0xb8fe4000}, {0xb8fe6000}, 
-    {0xb8fe8000}, {0xb8fea000}, {0xb8fec000}, {0xb8fee000}, 
-    {0xb8ff0000}, {0xb8ff2000}, {0xb8ff4000}, {0xb8ff6000}, 
-    {0xb8ff8000}, {0xb8ffa000}, {0xb8ffc000}, {0xb8ffe000}, 
-    {0xb9000000}, {0xb9002000}, {0xb9004000}, {0xb9006000}, 
-    {0xb9008000}, {0xb900a000}, {0xb900c000}, {0xb900e000}, 
-    {0xb9010000}, {0xb9012000}, {0xb9014000}, {0xb9016000}, 
-    {0xb9018000}, {0xb901a000}, {0xb901c000}, {0xb901e000}, 
-    {0xb9020000}, {0xb9022000}, {0xb9024000}, {0xb9026000}, 
-    {0xb9028000}, {0xb902a000}, {0xb902c000}, {0xb902e000}, 
-    {0xb9030000}, {0xb9032000}, {0xb9034000}, {0xb9036000}, 
-    {0xb9038000}, {0xb903a000}, {0xb903c000}, {0xb903e000}, 
-    {0xb9040000}, {0xb9042000}, {0xb9044000}, {0xb9046000}, 
-    {0xb9048000}, {0xb904a000}, {0xb904c000}, {0xb904e000}, 
-    {0xb9050000}, {0xb9052000}, {0xb9054000}, {0xb9056000}, 
-    {0xb9058000}, {0xb905a000}, {0xb905c000}, {0xb905e000}, 
-    {0xb9060000}, {0xb9062000}, {0xb9064000}, {0xb9066000}, 
-    {0xb9068000}, {0xb906a000}, {0xb906c000}, {0xb906e000}, 
-    {0xb9070000}, {0xb9072000}, {0xb9074000}, {0xb9076000}, 
-    {0xb9078000}, {0xb907a000}, {0xb907c000}, {0xb907e000}, 
-    {0xb9080000}, {0xb9082000}, {0xb9084000}, {0xb9086000}, 
-    {0xb9088000}, {0xb908a000}, {0xb908c000}, {0xb908e000}, 
-    {0xb9090000}, {0xb9092000}, {0xb9094000}, {0xb9096000}, 
-    {0xb9098000}, {0xb909a000}, {0xb909c000}, {0xb909e000}, 
-    {0xb90a0000}, {0xb90a2000}, {0xb90a4000}, {0xb90a6000}, 
-    {0xb90a8000}, {0xb90aa000}, {0xb90ac000}, {0xb90ae000}, 
-    {0xb90b0000}, {0xb90b2000}, {0xb90b4000}, {0xb90b6000}, 
-    {0xb90b8000}, {0xb90ba000}, {0xb90bc000}, {0xb90be000}, 
-    {0xb90c0000}, {0xb90c2000}, {0xb90c4000}, {0xb90c6000}, 
-    {0xb90c8000}, {0xb90ca000}, {0xb90cc000}, {0xb90ce000}, 
-    {0xb90d0000}, {0xb90d2000}, {0xb90d4000}, {0xb90d6000}, 
-    {0xb90d8000}, {0xb90da000}, {0xb90dc000}, {0xb90de000}, 
-    {0xb90e0000}, {0xb90e2000}, {0xb90e4000}, {0xb90e6000}, 
-    {0xb90e8000}, {0xb90ea000}, {0xb90ec000}, {0xb90ee000}, 
-    {0xb90f0000}, {0xb90f2000}, {0xb90f4000}, {0xb90f6000}, 
-    {0xb90f8000}, {0xb90fa000}, {0xb90fc000}, {0xb90fe000}, 
-    {0xb9100000}, {0xb9102000}, {0xb9104000}, {0xb9106000}, 
-    {0xb9108000}, {0xb910a000}, {0xb910c000}, {0xb910e000}, 
-    {0xb9110000}, {0xb9112000}, {0xb9114000}, {0xb9116000}, 
-    {0xb9118000}, {0xb911a000}, {0xb911c000}, {0xb911e000}, 
-    {0xb9120000}, {0xb9122000}, {0xb9124000}, {0xb9126000}, 
-    {0xb9128000}, {0xb912a000}, {0xb912c000}, {0xb912e000}, 
-    {0xb9130000}, {0xb9132000}, {0xb9134000}, {0xb9136000}, 
-    {0xb9138000}, {0xb913a000}, {0xb913c000}, {0xb913e000}, 
-    {0xb9140000}, {0xb9142000}, {0xb9144000}, {0xb9146000}, 
-    {0xb9148000}, {0xb914a000}, {0xb914c000}, {0xb914e000}, 
-    {0xb9150000}, {0xb9152000}, {0xb9154000}, {0xb9156000}, 
-    {0xb9158000}, {0xb915a000}, {0xb915c000}, {0xb915e000}, 
-    {0xb9160000}, {0xb9162000}, {0xb9164000}, {0xb9166000}, 
-    {0xb9168000}, {0xb916a000}, {0xb916c000}, {0xb916e000}, 
-    {0xb9170000}, {0xb9172000}, {0xb9174000}, {0xb9176000}, 
-    {0xb9178000}, {0xb917a000}, {0xb917c000}, {0xb917e000}, 
-    {0xb9180000}, {0xb9182000}, {0xb9184000}, {0xb9186000}, 
-    {0xb9188000}, {0xb918a000}, {0xb918c000}, {0xb918e000}, 
-    {0xb9190000}, {0xb9192000}, {0xb9194000}, {0xb9196000}, 
-    {0xb9198000}, {0xb919a000}, {0xb919c000}, {0xb919e000}, 
-    {0xb91a0000}, {0xb91a2000}, {0xb91a4000}, {0xb91a6000}, 
-    {0xb91a8000}, {0xb91aa000}, {0xb91ac000}, {0xb91ae000}, 
-    {0xb91b0000}, {0xb91b2000}, {0xb91b4000}, {0xb91b6000}, 
-    {0xb91b8000}, {0xb91ba000}, {0xb91bc000}, {0xb91be000}, 
-    {0xb91c0000}, {0xb91c2000}, {0xb91c4000}, {0xb91c6000}, 
-    {0xb91c8000}, {0xb91ca000}, {0xb91cc000}, {0xb91ce000}, 
-    {0xb91d0000}, {0xb91d2000}, {0xb91d4000}, {0xb91d6000}, 
-    {0xb91d8000}, {0xb91da000}, {0xb91dc000}, {0xb91de000}, 
-    {0xb91e0000}, {0xb91e2000}, {0xb91e4000}, {0xb91e6000}, 
-    {0xb91e8000}, {0xb91ea000}, {0xb91ec000}, {0xb91ee000}, 
-    {0xb91f0000}, {0xb91f2000}, {0xb91f4000}, {0xb91f6000}, 
-    {0xb91f8000}, {0xb91fa000}, {0xb91fc000}, {0xb91fe000}, 
-    {0xb9200000}, {0xb9202000}, {0xb9204000}, {0xb9206000}, 
-    {0xb9208000}, {0xb920a000}, {0xb920c000}, {0xb920e000}, 
-    {0xb9210000}, {0xb9212000}, {0xb9214000}, {0xb9216000}, 
-    {0xb9218000}, {0xb921a000}, {0xb921c000}, {0xb921e000}, 
-    {0xb9220000}, {0xb9222000}, {0xb9224000}, {0xb9226000}, 
-    {0xb9228000}, {0xb922a000}, {0xb922c000}, {0xb922e000}, 
-    {0xb9230000}, {0xb9232000}, {0xb9234000}, {0xb9236000}, 
-    {0xb9238000}, {0xb923a000}, {0xb923c000}, {0xb923e000}, 
-    {0xb9240000}, {0xb9242000}, {0xb9244000}, {0xb9246000}, 
-    {0xb9248000}, {0xb924a000}, {0xb924c000}, {0xb924e000}, 
-    {0xb9250000}, {0xb9252000}, {0xb9254000}, {0xb9256000}, 
-    {0xb9258000}, {0xb925a000}, {0xb925c000}, {0xb925e000}, 
-    {0xb9260000}, {0xb9262000}, {0xb9264000}, {0xb9266000}, 
-    {0xb9268000}, {0xb926a000}, {0xb926c000}, {0xb926e000}, 
-    {0xb9270000}, {0xb9272000}, {0xb9274000}, {0xb9276000}, 
-    {0xb9278000}, {0xb927a000}, {0xb927c000}, {0xb927e000}, 
-    {0xb9280000}, {0xb9282000}, {0xb9284000}, {0xb9286000}, 
-    {0xb9288000}, {0xb928a000}, {0xb928c000}, {0xb928e000}, 
-    {0xb9290000}, {0xb9292000}, {0xb9294000}, {0xb9296000}, 
-    {0xb9298000}, {0xb929a000}, {0xb929c000}, {0xb929e000}, 
-    {0xb92a0000}, {0xb92a2000}, {0xb92a4000}, {0xb92a6000}, 
-    {0xb92a8000}, {0xb92aa000}, {0xb92ac000}, {0xb92ae000}, 
-    {0xb92b0000}, {0xb92b2000}, {0xb92b4000}, {0xb92b6000}, 
-    {0xb92b8000}, {0xb92ba000}, {0xb92bc000}, {0xb92be000}, 
-    {0xb92c0000}, {0xb92c2000}, {0xb92c4000}, {0xb92c6000}, 
-    {0xb92c8000}, {0xb92ca000}, {0xb92cc000}, {0xb92ce000}, 
-    {0xb92d0000}, {0xb92d2000}, {0xb92d4000}, {0xb92d6000}, 
-    {0xb92d8000}, {0xb92da000}, {0xb92dc000}, {0xb92de000}, 
-    {0xb92e0000}, {0xb92e2000}, {0xb92e4000}, {0xb92e6000}, 
-    {0xb92e8000}, {0xb92ea000}, {0xb92ec000}, {0xb92ee000}, 
-    {0xb92f0000}, {0xb92f2000}, {0xb92f4000}, {0xb92f6000}, 
-    {0xb92f8000}, {0xb92fa000}, {0xb92fc000}, {0xb92fe000}, 
-    {0xb9300000}, {0xb9302000}, {0xb9304000}, {0xb9306000}, 
-    {0xb9308000}, {0xb930a000}, {0xb930c000}, {0xb930e000}, 
-    {0xb9310000}, {0xb9312000}, {0xb9314000}, {0xb9316000}, 
-    {0xb9318000}, {0xb931a000}, {0xb931c000}, {0xb931e000}, 
-    {0xb9320000}, {0xb9322000}, {0xb9324000}, {0xb9326000}, 
-    {0xb9328000}, {0xb932a000}, {0xb932c000}, {0xb932e000}, 
-    {0xb9330000}, {0xb9332000}, {0xb9334000}, {0xb9336000}, 
-    {0xb9338000}, {0xb933a000}, {0xb933c000}, {0xb933e000}, 
-    {0xb9340000}, {0xb9342000}, {0xb9344000}, {0xb9346000}, 
-    {0xb9348000}, {0xb934a000}, {0xb934c000}, {0xb934e000}, 
-    {0xb9350000}, {0xb9352000}, {0xb9354000}, {0xb9356000}, 
-    {0xb9358000}, {0xb935a000}, {0xb935c000}, {0xb935e000}, 
-    {0xb9360000}, {0xb9362000}, {0xb9364000}, {0xb9366000}, 
-    {0xb9368000}, {0xb936a000}, {0xb936c000}, {0xb936e000}, 
-    {0xb9370000}, {0xb9372000}, {0xb9374000}, {0xb9376000}, 
-    {0xb9378000}, {0xb937a000}, {0xb937c000}, {0xb937e000}, 
-    {0xb9380000}, {0xb9382000}, {0xb9384000}, {0xb9386000}, 
-    {0xb9388000}, {0xb938a000}, {0xb938c000}, {0xb938e000}, 
-    {0xb9390000}, {0xb9392000}, {0xb9394000}, {0xb9396000}, 
-    {0xb9398000}, {0xb939a000}, {0xb939c000}, {0xb939e000}, 
-    {0xb93a0000}, {0xb93a2000}, {0xb93a4000}, {0xb93a6000}, 
-    {0xb93a8000}, {0xb93aa000}, {0xb93ac000}, {0xb93ae000}, 
-    {0xb93b0000}, {0xb93b2000}, {0xb93b4000}, {0xb93b6000}, 
-    {0xb93b8000}, {0xb93ba000}, {0xb93bc000}, {0xb93be000}, 
-    {0xb93c0000}, {0xb93c2000}, {0xb93c4000}, {0xb93c6000}, 
-    {0xb93c8000}, {0xb93ca000}, {0xb93cc000}, {0xb93ce000}, 
-    {0xb93d0000}, {0xb93d2000}, {0xb93d4000}, {0xb93d6000}, 
-    {0xb93d8000}, {0xb93da000}, {0xb93dc000}, {0xb93de000}, 
-    {0xb93e0000}, {0xb93e2000}, {0xb93e4000}, {0xb93e6000}, 
-    {0xb93e8000}, {0xb93ea000}, {0xb93ec000}, {0xb93ee000}, 
-    {0xb93f0000}, {0xb93f2000}, {0xb93f4000}, {0xb93f6000}, 
-    {0xb93f8000}, {0xb93fa000}, {0xb93fc000}, {0xb93fe000}, 
-    {0xb9400000}, {0xb9402000}, {0xb9404000}, {0xb9406000}, 
-    {0xb9408000}, {0xb940a000}, {0xb940c000}, {0xb940e000}, 
-    {0xb9410000}, {0xb9412000}, {0xb9414000}, {0xb9416000}, 
-    {0xb9418000}, {0xb941a000}, {0xb941c000}, {0xb941e000}, 
-    {0xb9420000}, {0xb9422000}, {0xb9424000}, {0xb9426000}, 
-    {0xb9428000}, {0xb942a000}, {0xb942c000}, {0xb942e000}, 
-    {0xb9430000}, {0xb9432000}, {0xb9434000}, {0xb9436000}, 
-    {0xb9438000}, {0xb943a000}, {0xb943c000}, {0xb943e000}, 
-    {0xb9440000}, {0xb9442000}, {0xb9444000}, {0xb9446000}, 
-    {0xb9448000}, {0xb944a000}, {0xb944c000}, {0xb944e000}, 
-    {0xb9450000}, {0xb9452000}, {0xb9454000}, {0xb9456000}, 
-    {0xb9458000}, {0xb945a000}, {0xb945c000}, {0xb945e000}, 
-    {0xb9460000}, {0xb9462000}, {0xb9464000}, {0xb9466000}, 
-    {0xb9468000}, {0xb946a000}, {0xb946c000}, {0xb946e000}, 
-    {0xb9470000}, {0xb9472000}, {0xb9474000}, {0xb9476000}, 
-    {0xb9478000}, {0xb947a000}, {0xb947c000}, {0xb947e000}, 
-    {0xb9480000}, {0xb9482000}, {0xb9484000}, {0xb9486000}, 
-    {0xb9488000}, {0xb948a000}, {0xb948c000}, {0xb948e000}, 
-    {0xb9490000}, {0xb9492000}, {0xb9494000}, {0xb9496000}, 
-    {0xb9498000}, {0xb949a000}, {0xb949c000}, {0xb949e000}, 
-    {0xb94a0000}, {0xb94a2000}, {0xb94a4000}, {0xb94a6000}, 
-    {0xb94a8000}, {0xb94aa000}, {0xb94ac000}, {0xb94ae000}, 
-    {0xb94b0000}, {0xb94b2000}, {0xb94b4000}, {0xb94b6000}, 
-    {0xb94b8000}, {0xb94ba000}, {0xb94bc000}, {0xb94be000}, 
-    {0xb94c0000}, {0xb94c2000}, {0xb94c4000}, {0xb94c6000}, 
-    {0xb94c8000}, {0xb94ca000}, {0xb94cc000}, {0xb94ce000}, 
-    {0xb94d0000}, {0xb94d2000}, {0xb94d4000}, {0xb94d6000}, 
-    {0xb94d8000}, {0xb94da000}, {0xb94dc000}, {0xb94de000}, 
-    {0xb94e0000}, {0xb94e2000}, {0xb94e4000}, {0xb94e6000}, 
-    {0xb94e8000}, {0xb94ea000}, {0xb94ec000}, {0xb94ee000}, 
-    {0xb94f0000}, {0xb94f2000}, {0xb94f4000}, {0xb94f6000}, 
-    {0xb94f8000}, {0xb94fa000}, {0xb94fc000}, {0xb94fe000}, 
-    {0xb9500000}, {0xb9502000}, {0xb9504000}, {0xb9506000}, 
-    {0xb9508000}, {0xb950a000}, {0xb950c000}, {0xb950e000}, 
-    {0xb9510000}, {0xb9512000}, {0xb9514000}, {0xb9516000}, 
-    {0xb9518000}, {0xb951a000}, {0xb951c000}, {0xb951e000}, 
-    {0xb9520000}, {0xb9522000}, {0xb9524000}, {0xb9526000}, 
-    {0xb9528000}, {0xb952a000}, {0xb952c000}, {0xb952e000}, 
-    {0xb9530000}, {0xb9532000}, {0xb9534000}, {0xb9536000}, 
-    {0xb9538000}, {0xb953a000}, {0xb953c000}, {0xb953e000}, 
-    {0xb9540000}, {0xb9542000}, {0xb9544000}, {0xb9546000}, 
-    {0xb9548000}, {0xb954a000}, {0xb954c000}, {0xb954e000}, 
-    {0xb9550000}, {0xb9552000}, {0xb9554000}, {0xb9556000}, 
-    {0xb9558000}, {0xb955a000}, {0xb955c000}, {0xb955e000}, 
-    {0xb9560000}, {0xb9562000}, {0xb9564000}, {0xb9566000}, 
-    {0xb9568000}, {0xb956a000}, {0xb956c000}, {0xb956e000}, 
-    {0xb9570000}, {0xb9572000}, {0xb9574000}, {0xb9576000}, 
-    {0xb9578000}, {0xb957a000}, {0xb957c000}, {0xb957e000}, 
-    {0xb9580000}, {0xb9582000}, {0xb9584000}, {0xb9586000}, 
-    {0xb9588000}, {0xb958a000}, {0xb958c000}, {0xb958e000}, 
-    {0xb9590000}, {0xb9592000}, {0xb9594000}, {0xb9596000}, 
-    {0xb9598000}, {0xb959a000}, {0xb959c000}, {0xb959e000}, 
-    {0xb95a0000}, {0xb95a2000}, {0xb95a4000}, {0xb95a6000}, 
-    {0xb95a8000}, {0xb95aa000}, {0xb95ac000}, {0xb95ae000}, 
-    {0xb95b0000}, {0xb95b2000}, {0xb95b4000}, {0xb95b6000}, 
-    {0xb95b8000}, {0xb95ba000}, {0xb95bc000}, {0xb95be000}, 
-    {0xb95c0000}, {0xb95c2000}, {0xb95c4000}, {0xb95c6000}, 
-    {0xb95c8000}, {0xb95ca000}, {0xb95cc000}, {0xb95ce000}, 
-    {0xb95d0000}, {0xb95d2000}, {0xb95d4000}, {0xb95d6000}, 
-    {0xb95d8000}, {0xb95da000}, {0xb95dc000}, {0xb95de000}, 
-    {0xb95e0000}, {0xb95e2000}, {0xb95e4000}, {0xb95e6000}, 
-    {0xb95e8000}, {0xb95ea000}, {0xb95ec000}, {0xb95ee000}, 
-    {0xb95f0000}, {0xb95f2000}, {0xb95f4000}, {0xb95f6000}, 
-    {0xb95f8000}, {0xb95fa000}, {0xb95fc000}, {0xb95fe000}, 
-    {0xb9600000}, {0xb9602000}, {0xb9604000}, {0xb9606000}, 
-    {0xb9608000}, {0xb960a000}, {0xb960c000}, {0xb960e000}, 
-    {0xb9610000}, {0xb9612000}, {0xb9614000}, {0xb9616000}, 
-    {0xb9618000}, {0xb961a000}, {0xb961c000}, {0xb961e000}, 
-    {0xb9620000}, {0xb9622000}, {0xb9624000}, {0xb9626000}, 
-    {0xb9628000}, {0xb962a000}, {0xb962c000}, {0xb962e000}, 
-    {0xb9630000}, {0xb9632000}, {0xb9634000}, {0xb9636000}, 
-    {0xb9638000}, {0xb963a000}, {0xb963c000}, {0xb963e000}, 
-    {0xb9640000}, {0xb9642000}, {0xb9644000}, {0xb9646000}, 
-    {0xb9648000}, {0xb964a000}, {0xb964c000}, {0xb964e000}, 
-    {0xb9650000}, {0xb9652000}, {0xb9654000}, {0xb9656000}, 
-    {0xb9658000}, {0xb965a000}, {0xb965c000}, {0xb965e000}, 
-    {0xb9660000}, {0xb9662000}, {0xb9664000}, {0xb9666000}, 
-    {0xb9668000}, {0xb966a000}, {0xb966c000}, {0xb966e000}, 
-    {0xb9670000}, {0xb9672000}, {0xb9674000}, {0xb9676000}, 
-    {0xb9678000}, {0xb967a000}, {0xb967c000}, {0xb967e000}, 
-    {0xb9680000}, {0xb9682000}, {0xb9684000}, {0xb9686000}, 
-    {0xb9688000}, {0xb968a000}, {0xb968c000}, {0xb968e000}, 
-    {0xb9690000}, {0xb9692000}, {0xb9694000}, {0xb9696000}, 
-    {0xb9698000}, {0xb969a000}, {0xb969c000}, {0xb969e000}, 
-    {0xb96a0000}, {0xb96a2000}, {0xb96a4000}, {0xb96a6000}, 
-    {0xb96a8000}, {0xb96aa000}, {0xb96ac000}, {0xb96ae000}, 
-    {0xb96b0000}, {0xb96b2000}, {0xb96b4000}, {0xb96b6000}, 
-    {0xb96b8000}, {0xb96ba000}, {0xb96bc000}, {0xb96be000}, 
-    {0xb96c0000}, {0xb96c2000}, {0xb96c4000}, {0xb96c6000}, 
-    {0xb96c8000}, {0xb96ca000}, {0xb96cc000}, {0xb96ce000}, 
-    {0xb96d0000}, {0xb96d2000}, {0xb96d4000}, {0xb96d6000}, 
-    {0xb96d8000}, {0xb96da000}, {0xb96dc000}, {0xb96de000}, 
-    {0xb96e0000}, {0xb96e2000}, {0xb96e4000}, {0xb96e6000}, 
-    {0xb96e8000}, {0xb96ea000}, {0xb96ec000}, {0xb96ee000}, 
-    {0xb96f0000}, {0xb96f2000}, {0xb96f4000}, {0xb96f6000}, 
-    {0xb96f8000}, {0xb96fa000}, {0xb96fc000}, {0xb96fe000}, 
-    {0xb9700000}, {0xb9702000}, {0xb9704000}, {0xb9706000}, 
-    {0xb9708000}, {0xb970a000}, {0xb970c000}, {0xb970e000}, 
-    {0xb9710000}, {0xb9712000}, {0xb9714000}, {0xb9716000}, 
-    {0xb9718000}, {0xb971a000}, {0xb971c000}, {0xb971e000}, 
-    {0xb9720000}, {0xb9722000}, {0xb9724000}, {0xb9726000}, 
-    {0xb9728000}, {0xb972a000}, {0xb972c000}, {0xb972e000}, 
-    {0xb9730000}, {0xb9732000}, {0xb9734000}, {0xb9736000}, 
-    {0xb9738000}, {0xb973a000}, {0xb973c000}, {0xb973e000}, 
-    {0xb9740000}, {0xb9742000}, {0xb9744000}, {0xb9746000}, 
-    {0xb9748000}, {0xb974a000}, {0xb974c000}, {0xb974e000}, 
-    {0xb9750000}, {0xb9752000}, {0xb9754000}, {0xb9756000}, 
-    {0xb9758000}, {0xb975a000}, {0xb975c000}, {0xb975e000}, 
-    {0xb9760000}, {0xb9762000}, {0xb9764000}, {0xb9766000}, 
-    {0xb9768000}, {0xb976a000}, {0xb976c000}, {0xb976e000}, 
-    {0xb9770000}, {0xb9772000}, {0xb9774000}, {0xb9776000}, 
-    {0xb9778000}, {0xb977a000}, {0xb977c000}, {0xb977e000}, 
-    {0xb9780000}, {0xb9782000}, {0xb9784000}, {0xb9786000}, 
-    {0xb9788000}, {0xb978a000}, {0xb978c000}, {0xb978e000}, 
-    {0xb9790000}, {0xb9792000}, {0xb9794000}, {0xb9796000}, 
-    {0xb9798000}, {0xb979a000}, {0xb979c000}, {0xb979e000}, 
-    {0xb97a0000}, {0xb97a2000}, {0xb97a4000}, {0xb97a6000}, 
-    {0xb97a8000}, {0xb97aa000}, {0xb97ac000}, {0xb97ae000}, 
-    {0xb97b0000}, {0xb97b2000}, {0xb97b4000}, {0xb97b6000}, 
-    {0xb97b8000}, {0xb97ba000}, {0xb97bc000}, {0xb97be000}, 
-    {0xb97c0000}, {0xb97c2000}, {0xb97c4000}, {0xb97c6000}, 
-    {0xb97c8000}, {0xb97ca000}, {0xb97cc000}, {0xb97ce000}, 
-    {0xb97d0000}, {0xb97d2000}, {0xb97d4000}, {0xb97d6000}, 
-    {0xb97d8000}, {0xb97da000}, {0xb97dc000}, {0xb97de000}, 
-    {0xb97e0000}, {0xb97e2000}, {0xb97e4000}, {0xb97e6000}, 
-    {0xb97e8000}, {0xb97ea000}, {0xb97ec000}, {0xb97ee000}, 
-    {0xb97f0000}, {0xb97f2000}, {0xb97f4000}, {0xb97f6000}, 
-    {0xb97f8000}, {0xb97fa000}, {0xb97fc000}, {0xb97fe000}, 
-    {0xb9800000}, {0xb9802000}, {0xb9804000}, {0xb9806000}, 
-    {0xb9808000}, {0xb980a000}, {0xb980c000}, {0xb980e000}, 
-    {0xb9810000}, {0xb9812000}, {0xb9814000}, {0xb9816000}, 
-    {0xb9818000}, {0xb981a000}, {0xb981c000}, {0xb981e000}, 
-    {0xb9820000}, {0xb9822000}, {0xb9824000}, {0xb9826000}, 
-    {0xb9828000}, {0xb982a000}, {0xb982c000}, {0xb982e000}, 
-    {0xb9830000}, {0xb9832000}, {0xb9834000}, {0xb9836000}, 
-    {0xb9838000}, {0xb983a000}, {0xb983c000}, {0xb983e000}, 
-    {0xb9840000}, {0xb9842000}, {0xb9844000}, {0xb9846000}, 
-    {0xb9848000}, {0xb984a000}, {0xb984c000}, {0xb984e000}, 
-    {0xb9850000}, {0xb9852000}, {0xb9854000}, {0xb9856000}, 
-    {0xb9858000}, {0xb985a000}, {0xb985c000}, {0xb985e000}, 
-    {0xb9860000}, {0xb9862000}, {0xb9864000}, {0xb9866000}, 
-    {0xb9868000}, {0xb986a000}, {0xb986c000}, {0xb986e000}, 
-    {0xb9870000}, {0xb9872000}, {0xb9874000}, {0xb9876000}, 
-    {0xb9878000}, {0xb987a000}, {0xb987c000}, {0xb987e000}, 
-    {0xb9880000}, {0xb9882000}, {0xb9884000}, {0xb9886000}, 
-    {0xb9888000}, {0xb988a000}, {0xb988c000}, {0xb988e000}, 
-    {0xb9890000}, {0xb9892000}, {0xb9894000}, {0xb9896000}, 
-    {0xb9898000}, {0xb989a000}, {0xb989c000}, {0xb989e000}, 
-    {0xb98a0000}, {0xb98a2000}, {0xb98a4000}, {0xb98a6000}, 
-    {0xb98a8000}, {0xb98aa000}, {0xb98ac000}, {0xb98ae000}, 
-    {0xb98b0000}, {0xb98b2000}, {0xb98b4000}, {0xb98b6000}, 
-    {0xb98b8000}, {0xb98ba000}, {0xb98bc000}, {0xb98be000}, 
-    {0xb98c0000}, {0xb98c2000}, {0xb98c4000}, {0xb98c6000}, 
-    {0xb98c8000}, {0xb98ca000}, {0xb98cc000}, {0xb98ce000}, 
-    {0xb98d0000}, {0xb98d2000}, {0xb98d4000}, {0xb98d6000}, 
-    {0xb98d8000}, {0xb98da000}, {0xb98dc000}, {0xb98de000}, 
-    {0xb98e0000}, {0xb98e2000}, {0xb98e4000}, {0xb98e6000}, 
-    {0xb98e8000}, {0xb98ea000}, {0xb98ec000}, {0xb98ee000}, 
-    {0xb98f0000}, {0xb98f2000}, {0xb98f4000}, {0xb98f6000}, 
-    {0xb98f8000}, {0xb98fa000}, {0xb98fc000}, {0xb98fe000}, 
-    {0xb9900000}, {0xb9902000}, {0xb9904000}, {0xb9906000}, 
-    {0xb9908000}, {0xb990a000}, {0xb990c000}, {0xb990e000}, 
-    {0xb9910000}, {0xb9912000}, {0xb9914000}, {0xb9916000}, 
-    {0xb9918000}, {0xb991a000}, {0xb991c000}, {0xb991e000}, 
-    {0xb9920000}, {0xb9922000}, {0xb9924000}, {0xb9926000}, 
-    {0xb9928000}, {0xb992a000}, {0xb992c000}, {0xb992e000}, 
-    {0xb9930000}, {0xb9932000}, {0xb9934000}, {0xb9936000}, 
-    {0xb9938000}, {0xb993a000}, {0xb993c000}, {0xb993e000}, 
-    {0xb9940000}, {0xb9942000}, {0xb9944000}, {0xb9946000}, 
-    {0xb9948000}, {0xb994a000}, {0xb994c000}, {0xb994e000}, 
-    {0xb9950000}, {0xb9952000}, {0xb9954000}, {0xb9956000}, 
-    {0xb9958000}, {0xb995a000}, {0xb995c000}, {0xb995e000}, 
-    {0xb9960000}, {0xb9962000}, {0xb9964000}, {0xb9966000}, 
-    {0xb9968000}, {0xb996a000}, {0xb996c000}, {0xb996e000}, 
-    {0xb9970000}, {0xb9972000}, {0xb9974000}, {0xb9976000}, 
-    {0xb9978000}, {0xb997a000}, {0xb997c000}, {0xb997e000}, 
-    {0xb9980000}, {0xb9982000}, {0xb9984000}, {0xb9986000}, 
-    {0xb9988000}, {0xb998a000}, {0xb998c000}, {0xb998e000}, 
-    {0xb9990000}, {0xb9992000}, {0xb9994000}, {0xb9996000}, 
-    {0xb9998000}, {0xb999a000}, {0xb999c000}, {0xb999e000}, 
-    {0xb99a0000}, {0xb99a2000}, {0xb99a4000}, {0xb99a6000}, 
-    {0xb99a8000}, {0xb99aa000}, {0xb99ac000}, {0xb99ae000}, 
-    {0xb99b0000}, {0xb99b2000}, {0xb99b4000}, {0xb99b6000}, 
-    {0xb99b8000}, {0xb99ba000}, {0xb99bc000}, {0xb99be000}, 
-    {0xb99c0000}, {0xb99c2000}, {0xb99c4000}, {0xb99c6000}, 
-    {0xb99c8000}, {0xb99ca000}, {0xb99cc000}, {0xb99ce000}, 
-    {0xb99d0000}, {0xb99d2000}, {0xb99d4000}, {0xb99d6000}, 
-    {0xb99d8000}, {0xb99da000}, {0xb99dc000}, {0xb99de000}, 
-    {0xb99e0000}, {0xb99e2000}, {0xb99e4000}, {0xb99e6000}, 
-    {0xb99e8000}, {0xb99ea000}, {0xb99ec000}, {0xb99ee000}, 
-    {0xb99f0000}, {0xb99f2000}, {0xb99f4000}, {0xb99f6000}, 
-    {0xb99f8000}, {0xb99fa000}, {0xb99fc000}, {0xb99fe000}, 
-    {0xb9a00000}, {0xb9a02000}, {0xb9a04000}, {0xb9a06000}, 
-    {0xb9a08000}, {0xb9a0a000}, {0xb9a0c000}, {0xb9a0e000}, 
-    {0xb9a10000}, {0xb9a12000}, {0xb9a14000}, {0xb9a16000}, 
-    {0xb9a18000}, {0xb9a1a000}, {0xb9a1c000}, {0xb9a1e000}, 
-    {0xb9a20000}, {0xb9a22000}, {0xb9a24000}, {0xb9a26000}, 
-    {0xb9a28000}, {0xb9a2a000}, {0xb9a2c000}, {0xb9a2e000}, 
-    {0xb9a30000}, {0xb9a32000}, {0xb9a34000}, {0xb9a36000}, 
-    {0xb9a38000}, {0xb9a3a000}, {0xb9a3c000}, {0xb9a3e000}, 
-    {0xb9a40000}, {0xb9a42000}, {0xb9a44000}, {0xb9a46000}, 
-    {0xb9a48000}, {0xb9a4a000}, {0xb9a4c000}, {0xb9a4e000}, 
-    {0xb9a50000}, {0xb9a52000}, {0xb9a54000}, {0xb9a56000}, 
-    {0xb9a58000}, {0xb9a5a000}, {0xb9a5c000}, {0xb9a5e000}, 
-    {0xb9a60000}, {0xb9a62000}, {0xb9a64000}, {0xb9a66000}, 
-    {0xb9a68000}, {0xb9a6a000}, {0xb9a6c000}, {0xb9a6e000}, 
-    {0xb9a70000}, {0xb9a72000}, {0xb9a74000}, {0xb9a76000}, 
-    {0xb9a78000}, {0xb9a7a000}, {0xb9a7c000}, {0xb9a7e000}, 
-    {0xb9a80000}, {0xb9a82000}, {0xb9a84000}, {0xb9a86000}, 
-    {0xb9a88000}, {0xb9a8a000}, {0xb9a8c000}, {0xb9a8e000}, 
-    {0xb9a90000}, {0xb9a92000}, {0xb9a94000}, {0xb9a96000}, 
-    {0xb9a98000}, {0xb9a9a000}, {0xb9a9c000}, {0xb9a9e000}, 
-    {0xb9aa0000}, {0xb9aa2000}, {0xb9aa4000}, {0xb9aa6000}, 
-    {0xb9aa8000}, {0xb9aaa000}, {0xb9aac000}, {0xb9aae000}, 
-    {0xb9ab0000}, {0xb9ab2000}, {0xb9ab4000}, {0xb9ab6000}, 
-    {0xb9ab8000}, {0xb9aba000}, {0xb9abc000}, {0xb9abe000}, 
-    {0xb9ac0000}, {0xb9ac2000}, {0xb9ac4000}, {0xb9ac6000}, 
-    {0xb9ac8000}, {0xb9aca000}, {0xb9acc000}, {0xb9ace000}, 
-    {0xb9ad0000}, {0xb9ad2000}, {0xb9ad4000}, {0xb9ad6000}, 
-    {0xb9ad8000}, {0xb9ada000}, {0xb9adc000}, {0xb9ade000}, 
-    {0xb9ae0000}, {0xb9ae2000}, {0xb9ae4000}, {0xb9ae6000}, 
-    {0xb9ae8000}, {0xb9aea000}, {0xb9aec000}, {0xb9aee000}, 
-    {0xb9af0000}, {0xb9af2000}, {0xb9af4000}, {0xb9af6000}, 
-    {0xb9af8000}, {0xb9afa000}, {0xb9afc000}, {0xb9afe000}, 
-    {0xb9b00000}, {0xb9b02000}, {0xb9b04000}, {0xb9b06000}, 
-    {0xb9b08000}, {0xb9b0a000}, {0xb9b0c000}, {0xb9b0e000}, 
-    {0xb9b10000}, {0xb9b12000}, {0xb9b14000}, {0xb9b16000}, 
-    {0xb9b18000}, {0xb9b1a000}, {0xb9b1c000}, {0xb9b1e000}, 
-    {0xb9b20000}, {0xb9b22000}, {0xb9b24000}, {0xb9b26000}, 
-    {0xb9b28000}, {0xb9b2a000}, {0xb9b2c000}, {0xb9b2e000}, 
-    {0xb9b30000}, {0xb9b32000}, {0xb9b34000}, {0xb9b36000}, 
-    {0xb9b38000}, {0xb9b3a000}, {0xb9b3c000}, {0xb9b3e000}, 
-    {0xb9b40000}, {0xb9b42000}, {0xb9b44000}, {0xb9b46000}, 
-    {0xb9b48000}, {0xb9b4a000}, {0xb9b4c000}, {0xb9b4e000}, 
-    {0xb9b50000}, {0xb9b52000}, {0xb9b54000}, {0xb9b56000}, 
-    {0xb9b58000}, {0xb9b5a000}, {0xb9b5c000}, {0xb9b5e000}, 
-    {0xb9b60000}, {0xb9b62000}, {0xb9b64000}, {0xb9b66000}, 
-    {0xb9b68000}, {0xb9b6a000}, {0xb9b6c000}, {0xb9b6e000}, 
-    {0xb9b70000}, {0xb9b72000}, {0xb9b74000}, {0xb9b76000}, 
-    {0xb9b78000}, {0xb9b7a000}, {0xb9b7c000}, {0xb9b7e000}, 
-    {0xb9b80000}, {0xb9b82000}, {0xb9b84000}, {0xb9b86000}, 
-    {0xb9b88000}, {0xb9b8a000}, {0xb9b8c000}, {0xb9b8e000}, 
-    {0xb9b90000}, {0xb9b92000}, {0xb9b94000}, {0xb9b96000}, 
-    {0xb9b98000}, {0xb9b9a000}, {0xb9b9c000}, {0xb9b9e000}, 
-    {0xb9ba0000}, {0xb9ba2000}, {0xb9ba4000}, {0xb9ba6000}, 
-    {0xb9ba8000}, {0xb9baa000}, {0xb9bac000}, {0xb9bae000}, 
-    {0xb9bb0000}, {0xb9bb2000}, {0xb9bb4000}, {0xb9bb6000}, 
-    {0xb9bb8000}, {0xb9bba000}, {0xb9bbc000}, {0xb9bbe000}, 
-    {0xb9bc0000}, {0xb9bc2000}, {0xb9bc4000}, {0xb9bc6000}, 
-    {0xb9bc8000}, {0xb9bca000}, {0xb9bcc000}, {0xb9bce000}, 
-    {0xb9bd0000}, {0xb9bd2000}, {0xb9bd4000}, {0xb9bd6000}, 
-    {0xb9bd8000}, {0xb9bda000}, {0xb9bdc000}, {0xb9bde000}, 
-    {0xb9be0000}, {0xb9be2000}, {0xb9be4000}, {0xb9be6000}, 
-    {0xb9be8000}, {0xb9bea000}, {0xb9bec000}, {0xb9bee000}, 
-    {0xb9bf0000}, {0xb9bf2000}, {0xb9bf4000}, {0xb9bf6000}, 
-    {0xb9bf8000}, {0xb9bfa000}, {0xb9bfc000}, {0xb9bfe000}, 
-    {0xb9c00000}, {0xb9c02000}, {0xb9c04000}, {0xb9c06000}, 
-    {0xb9c08000}, {0xb9c0a000}, {0xb9c0c000}, {0xb9c0e000}, 
-    {0xb9c10000}, {0xb9c12000}, {0xb9c14000}, {0xb9c16000}, 
-    {0xb9c18000}, {0xb9c1a000}, {0xb9c1c000}, {0xb9c1e000}, 
-    {0xb9c20000}, {0xb9c22000}, {0xb9c24000}, {0xb9c26000}, 
-    {0xb9c28000}, {0xb9c2a000}, {0xb9c2c000}, {0xb9c2e000}, 
-    {0xb9c30000}, {0xb9c32000}, {0xb9c34000}, {0xb9c36000}, 
-    {0xb9c38000}, {0xb9c3a000}, {0xb9c3c000}, {0xb9c3e000}, 
-    {0xb9c40000}, {0xb9c42000}, {0xb9c44000}, {0xb9c46000}, 
-    {0xb9c48000}, {0xb9c4a000}, {0xb9c4c000}, {0xb9c4e000}, 
-    {0xb9c50000}, {0xb9c52000}, {0xb9c54000}, {0xb9c56000}, 
-    {0xb9c58000}, {0xb9c5a000}, {0xb9c5c000}, {0xb9c5e000}, 
-    {0xb9c60000}, {0xb9c62000}, {0xb9c64000}, {0xb9c66000}, 
-    {0xb9c68000}, {0xb9c6a000}, {0xb9c6c000}, {0xb9c6e000}, 
-    {0xb9c70000}, {0xb9c72000}, {0xb9c74000}, {0xb9c76000}, 
-    {0xb9c78000}, {0xb9c7a000}, {0xb9c7c000}, {0xb9c7e000}, 
-    {0xb9c80000}, {0xb9c82000}, {0xb9c84000}, {0xb9c86000}, 
-    {0xb9c88000}, {0xb9c8a000}, {0xb9c8c000}, {0xb9c8e000}, 
-    {0xb9c90000}, {0xb9c92000}, {0xb9c94000}, {0xb9c96000}, 
-    {0xb9c98000}, {0xb9c9a000}, {0xb9c9c000}, {0xb9c9e000}, 
-    {0xb9ca0000}, {0xb9ca2000}, {0xb9ca4000}, {0xb9ca6000}, 
-    {0xb9ca8000}, {0xb9caa000}, {0xb9cac000}, {0xb9cae000}, 
-    {0xb9cb0000}, {0xb9cb2000}, {0xb9cb4000}, {0xb9cb6000}, 
-    {0xb9cb8000}, {0xb9cba000}, {0xb9cbc000}, {0xb9cbe000}, 
-    {0xb9cc0000}, {0xb9cc2000}, {0xb9cc4000}, {0xb9cc6000}, 
-    {0xb9cc8000}, {0xb9cca000}, {0xb9ccc000}, {0xb9cce000}, 
-    {0xb9cd0000}, {0xb9cd2000}, {0xb9cd4000}, {0xb9cd6000}, 
-    {0xb9cd8000}, {0xb9cda000}, {0xb9cdc000}, {0xb9cde000}, 
-    {0xb9ce0000}, {0xb9ce2000}, {0xb9ce4000}, {0xb9ce6000}, 
-    {0xb9ce8000}, {0xb9cea000}, {0xb9cec000}, {0xb9cee000}, 
-    {0xb9cf0000}, {0xb9cf2000}, {0xb9cf4000}, {0xb9cf6000}, 
-    {0xb9cf8000}, {0xb9cfa000}, {0xb9cfc000}, {0xb9cfe000}, 
-    {0xb9d00000}, {0xb9d02000}, {0xb9d04000}, {0xb9d06000}, 
-    {0xb9d08000}, {0xb9d0a000}, {0xb9d0c000}, {0xb9d0e000}, 
-    {0xb9d10000}, {0xb9d12000}, {0xb9d14000}, {0xb9d16000}, 
-    {0xb9d18000}, {0xb9d1a000}, {0xb9d1c000}, {0xb9d1e000}, 
-    {0xb9d20000}, {0xb9d22000}, {0xb9d24000}, {0xb9d26000}, 
-    {0xb9d28000}, {0xb9d2a000}, {0xb9d2c000}, {0xb9d2e000}, 
-    {0xb9d30000}, {0xb9d32000}, {0xb9d34000}, {0xb9d36000}, 
-    {0xb9d38000}, {0xb9d3a000}, {0xb9d3c000}, {0xb9d3e000}, 
-    {0xb9d40000}, {0xb9d42000}, {0xb9d44000}, {0xb9d46000}, 
-    {0xb9d48000}, {0xb9d4a000}, {0xb9d4c000}, {0xb9d4e000}, 
-    {0xb9d50000}, {0xb9d52000}, {0xb9d54000}, {0xb9d56000}, 
-    {0xb9d58000}, {0xb9d5a000}, {0xb9d5c000}, {0xb9d5e000}, 
-    {0xb9d60000}, {0xb9d62000}, {0xb9d64000}, {0xb9d66000}, 
-    {0xb9d68000}, {0xb9d6a000}, {0xb9d6c000}, {0xb9d6e000}, 
-    {0xb9d70000}, {0xb9d72000}, {0xb9d74000}, {0xb9d76000}, 
-    {0xb9d78000}, {0xb9d7a000}, {0xb9d7c000}, {0xb9d7e000}, 
-    {0xb9d80000}, {0xb9d82000}, {0xb9d84000}, {0xb9d86000}, 
-    {0xb9d88000}, {0xb9d8a000}, {0xb9d8c000}, {0xb9d8e000}, 
-    {0xb9d90000}, {0xb9d92000}, {0xb9d94000}, {0xb9d96000}, 
-    {0xb9d98000}, {0xb9d9a000}, {0xb9d9c000}, {0xb9d9e000}, 
-    {0xb9da0000}, {0xb9da2000}, {0xb9da4000}, {0xb9da6000}, 
-    {0xb9da8000}, {0xb9daa000}, {0xb9dac000}, {0xb9dae000}, 
-    {0xb9db0000}, {0xb9db2000}, {0xb9db4000}, {0xb9db6000}, 
-    {0xb9db8000}, {0xb9dba000}, {0xb9dbc000}, {0xb9dbe000}, 
-    {0xb9dc0000}, {0xb9dc2000}, {0xb9dc4000}, {0xb9dc6000}, 
-    {0xb9dc8000}, {0xb9dca000}, {0xb9dcc000}, {0xb9dce000}, 
-    {0xb9dd0000}, {0xb9dd2000}, {0xb9dd4000}, {0xb9dd6000}, 
-    {0xb9dd8000}, {0xb9dda000}, {0xb9ddc000}, {0xb9dde000}, 
-    {0xb9de0000}, {0xb9de2000}, {0xb9de4000}, {0xb9de6000}, 
-    {0xb9de8000}, {0xb9dea000}, {0xb9dec000}, {0xb9dee000}, 
-    {0xb9df0000}, {0xb9df2000}, {0xb9df4000}, {0xb9df6000}, 
-    {0xb9df8000}, {0xb9dfa000}, {0xb9dfc000}, {0xb9dfe000}, 
-    {0xb9e00000}, {0xb9e02000}, {0xb9e04000}, {0xb9e06000}, 
-    {0xb9e08000}, {0xb9e0a000}, {0xb9e0c000}, {0xb9e0e000}, 
-    {0xb9e10000}, {0xb9e12000}, {0xb9e14000}, {0xb9e16000}, 
-    {0xb9e18000}, {0xb9e1a000}, {0xb9e1c000}, {0xb9e1e000}, 
-    {0xb9e20000}, {0xb9e22000}, {0xb9e24000}, {0xb9e26000}, 
-    {0xb9e28000}, {0xb9e2a000}, {0xb9e2c000}, {0xb9e2e000}, 
-    {0xb9e30000}, {0xb9e32000}, {0xb9e34000}, {0xb9e36000}, 
-    {0xb9e38000}, {0xb9e3a000}, {0xb9e3c000}, {0xb9e3e000}, 
-    {0xb9e40000}, {0xb9e42000}, {0xb9e44000}, {0xb9e46000}, 
-    {0xb9e48000}, {0xb9e4a000}, {0xb9e4c000}, {0xb9e4e000}, 
-    {0xb9e50000}, {0xb9e52000}, {0xb9e54000}, {0xb9e56000}, 
-    {0xb9e58000}, {0xb9e5a000}, {0xb9e5c000}, {0xb9e5e000}, 
-    {0xb9e60000}, {0xb9e62000}, {0xb9e64000}, {0xb9e66000}, 
-    {0xb9e68000}, {0xb9e6a000}, {0xb9e6c000}, {0xb9e6e000}, 
-    {0xb9e70000}, {0xb9e72000}, {0xb9e74000}, {0xb9e76000}, 
-    {0xb9e78000}, {0xb9e7a000}, {0xb9e7c000}, {0xb9e7e000}, 
-    {0xb9e80000}, {0xb9e82000}, {0xb9e84000}, {0xb9e86000}, 
-    {0xb9e88000}, {0xb9e8a000}, {0xb9e8c000}, {0xb9e8e000}, 
-    {0xb9e90000}, {0xb9e92000}, {0xb9e94000}, {0xb9e96000}, 
-    {0xb9e98000}, {0xb9e9a000}, {0xb9e9c000}, {0xb9e9e000}, 
-    {0xb9ea0000}, {0xb9ea2000}, {0xb9ea4000}, {0xb9ea6000}, 
-    {0xb9ea8000}, {0xb9eaa000}, {0xb9eac000}, {0xb9eae000}, 
-    {0xb9eb0000}, {0xb9eb2000}, {0xb9eb4000}, {0xb9eb6000}, 
-    {0xb9eb8000}, {0xb9eba000}, {0xb9ebc000}, {0xb9ebe000}, 
-    {0xb9ec0000}, {0xb9ec2000}, {0xb9ec4000}, {0xb9ec6000}, 
-    {0xb9ec8000}, {0xb9eca000}, {0xb9ecc000}, {0xb9ece000}, 
-    {0xb9ed0000}, {0xb9ed2000}, {0xb9ed4000}, {0xb9ed6000}, 
-    {0xb9ed8000}, {0xb9eda000}, {0xb9edc000}, {0xb9ede000}, 
-    {0xb9ee0000}, {0xb9ee2000}, {0xb9ee4000}, {0xb9ee6000}, 
-    {0xb9ee8000}, {0xb9eea000}, {0xb9eec000}, {0xb9eee000}, 
-    {0xb9ef0000}, {0xb9ef2000}, {0xb9ef4000}, {0xb9ef6000}, 
-    {0xb9ef8000}, {0xb9efa000}, {0xb9efc000}, {0xb9efe000}, 
-    {0xb9f00000}, {0xb9f02000}, {0xb9f04000}, {0xb9f06000}, 
-    {0xb9f08000}, {0xb9f0a000}, {0xb9f0c000}, {0xb9f0e000}, 
-    {0xb9f10000}, {0xb9f12000}, {0xb9f14000}, {0xb9f16000}, 
-    {0xb9f18000}, {0xb9f1a000}, {0xb9f1c000}, {0xb9f1e000}, 
-    {0xb9f20000}, {0xb9f22000}, {0xb9f24000}, {0xb9f26000}, 
-    {0xb9f28000}, {0xb9f2a000}, {0xb9f2c000}, {0xb9f2e000}, 
-    {0xb9f30000}, {0xb9f32000}, {0xb9f34000}, {0xb9f36000}, 
-    {0xb9f38000}, {0xb9f3a000}, {0xb9f3c000}, {0xb9f3e000}, 
-    {0xb9f40000}, {0xb9f42000}, {0xb9f44000}, {0xb9f46000}, 
-    {0xb9f48000}, {0xb9f4a000}, {0xb9f4c000}, {0xb9f4e000}, 
-    {0xb9f50000}, {0xb9f52000}, {0xb9f54000}, {0xb9f56000}, 
-    {0xb9f58000}, {0xb9f5a000}, {0xb9f5c000}, {0xb9f5e000}, 
-    {0xb9f60000}, {0xb9f62000}, {0xb9f64000}, {0xb9f66000}, 
-    {0xb9f68000}, {0xb9f6a000}, {0xb9f6c000}, {0xb9f6e000}, 
-    {0xb9f70000}, {0xb9f72000}, {0xb9f74000}, {0xb9f76000}, 
-    {0xb9f78000}, {0xb9f7a000}, {0xb9f7c000}, {0xb9f7e000}, 
-    {0xb9f80000}, {0xb9f82000}, {0xb9f84000}, {0xb9f86000}, 
-    {0xb9f88000}, {0xb9f8a000}, {0xb9f8c000}, {0xb9f8e000}, 
-    {0xb9f90000}, {0xb9f92000}, {0xb9f94000}, {0xb9f96000}, 
-    {0xb9f98000}, {0xb9f9a000}, {0xb9f9c000}, {0xb9f9e000}, 
-    {0xb9fa0000}, {0xb9fa2000}, {0xb9fa4000}, {0xb9fa6000}, 
-    {0xb9fa8000}, {0xb9faa000}, {0xb9fac000}, {0xb9fae000}, 
-    {0xb9fb0000}, {0xb9fb2000}, {0xb9fb4000}, {0xb9fb6000}, 
-    {0xb9fb8000}, {0xb9fba000}, {0xb9fbc000}, {0xb9fbe000}, 
-    {0xb9fc0000}, {0xb9fc2000}, {0xb9fc4000}, {0xb9fc6000}, 
-    {0xb9fc8000}, {0xb9fca000}, {0xb9fcc000}, {0xb9fce000}, 
-    {0xb9fd0000}, {0xb9fd2000}, {0xb9fd4000}, {0xb9fd6000}, 
-    {0xb9fd8000}, {0xb9fda000}, {0xb9fdc000}, {0xb9fde000}, 
-    {0xb9fe0000}, {0xb9fe2000}, {0xb9fe4000}, {0xb9fe6000}, 
-    {0xb9fe8000}, {0xb9fea000}, {0xb9fec000}, {0xb9fee000}, 
-    {0xb9ff0000}, {0xb9ff2000}, {0xb9ff4000}, {0xb9ff6000}, 
-    {0xb9ff8000}, {0xb9ffa000}, {0xb9ffc000}, {0xb9ffe000}, 
-    {0xba000000}, {0xba002000}, {0xba004000}, {0xba006000}, 
-    {0xba008000}, {0xba00a000}, {0xba00c000}, {0xba00e000}, 
-    {0xba010000}, {0xba012000}, {0xba014000}, {0xba016000}, 
-    {0xba018000}, {0xba01a000}, {0xba01c000}, {0xba01e000}, 
-    {0xba020000}, {0xba022000}, {0xba024000}, {0xba026000}, 
-    {0xba028000}, {0xba02a000}, {0xba02c000}, {0xba02e000}, 
-    {0xba030000}, {0xba032000}, {0xba034000}, {0xba036000}, 
-    {0xba038000}, {0xba03a000}, {0xba03c000}, {0xba03e000}, 
-    {0xba040000}, {0xba042000}, {0xba044000}, {0xba046000}, 
-    {0xba048000}, {0xba04a000}, {0xba04c000}, {0xba04e000}, 
-    {0xba050000}, {0xba052000}, {0xba054000}, {0xba056000}, 
-    {0xba058000}, {0xba05a000}, {0xba05c000}, {0xba05e000}, 
-    {0xba060000}, {0xba062000}, {0xba064000}, {0xba066000}, 
-    {0xba068000}, {0xba06a000}, {0xba06c000}, {0xba06e000}, 
-    {0xba070000}, {0xba072000}, {0xba074000}, {0xba076000}, 
-    {0xba078000}, {0xba07a000}, {0xba07c000}, {0xba07e000}, 
-    {0xba080000}, {0xba082000}, {0xba084000}, {0xba086000}, 
-    {0xba088000}, {0xba08a000}, {0xba08c000}, {0xba08e000}, 
-    {0xba090000}, {0xba092000}, {0xba094000}, {0xba096000}, 
-    {0xba098000}, {0xba09a000}, {0xba09c000}, {0xba09e000}, 
-    {0xba0a0000}, {0xba0a2000}, {0xba0a4000}, {0xba0a6000}, 
-    {0xba0a8000}, {0xba0aa000}, {0xba0ac000}, {0xba0ae000}, 
-    {0xba0b0000}, {0xba0b2000}, {0xba0b4000}, {0xba0b6000}, 
-    {0xba0b8000}, {0xba0ba000}, {0xba0bc000}, {0xba0be000}, 
-    {0xba0c0000}, {0xba0c2000}, {0xba0c4000}, {0xba0c6000}, 
-    {0xba0c8000}, {0xba0ca000}, {0xba0cc000}, {0xba0ce000}, 
-    {0xba0d0000}, {0xba0d2000}, {0xba0d4000}, {0xba0d6000}, 
-    {0xba0d8000}, {0xba0da000}, {0xba0dc000}, {0xba0de000}, 
-    {0xba0e0000}, {0xba0e2000}, {0xba0e4000}, {0xba0e6000}, 
-    {0xba0e8000}, {0xba0ea000}, {0xba0ec000}, {0xba0ee000}, 
-    {0xba0f0000}, {0xba0f2000}, {0xba0f4000}, {0xba0f6000}, 
-    {0xba0f8000}, {0xba0fa000}, {0xba0fc000}, {0xba0fe000}, 
-    {0xba100000}, {0xba102000}, {0xba104000}, {0xba106000}, 
-    {0xba108000}, {0xba10a000}, {0xba10c000}, {0xba10e000}, 
-    {0xba110000}, {0xba112000}, {0xba114000}, {0xba116000}, 
-    {0xba118000}, {0xba11a000}, {0xba11c000}, {0xba11e000}, 
-    {0xba120000}, {0xba122000}, {0xba124000}, {0xba126000}, 
-    {0xba128000}, {0xba12a000}, {0xba12c000}, {0xba12e000}, 
-    {0xba130000}, {0xba132000}, {0xba134000}, {0xba136000}, 
-    {0xba138000}, {0xba13a000}, {0xba13c000}, {0xba13e000}, 
-    {0xba140000}, {0xba142000}, {0xba144000}, {0xba146000}, 
-    {0xba148000}, {0xba14a000}, {0xba14c000}, {0xba14e000}, 
-    {0xba150000}, {0xba152000}, {0xba154000}, {0xba156000}, 
-    {0xba158000}, {0xba15a000}, {0xba15c000}, {0xba15e000}, 
-    {0xba160000}, {0xba162000}, {0xba164000}, {0xba166000}, 
-    {0xba168000}, {0xba16a000}, {0xba16c000}, {0xba16e000}, 
-    {0xba170000}, {0xba172000}, {0xba174000}, {0xba176000}, 
-    {0xba178000}, {0xba17a000}, {0xba17c000}, {0xba17e000}, 
-    {0xba180000}, {0xba182000}, {0xba184000}, {0xba186000}, 
-    {0xba188000}, {0xba18a000}, {0xba18c000}, {0xba18e000}, 
-    {0xba190000}, {0xba192000}, {0xba194000}, {0xba196000}, 
-    {0xba198000}, {0xba19a000}, {0xba19c000}, {0xba19e000}, 
-    {0xba1a0000}, {0xba1a2000}, {0xba1a4000}, {0xba1a6000}, 
-    {0xba1a8000}, {0xba1aa000}, {0xba1ac000}, {0xba1ae000}, 
-    {0xba1b0000}, {0xba1b2000}, {0xba1b4000}, {0xba1b6000}, 
-    {0xba1b8000}, {0xba1ba000}, {0xba1bc000}, {0xba1be000}, 
-    {0xba1c0000}, {0xba1c2000}, {0xba1c4000}, {0xba1c6000}, 
-    {0xba1c8000}, {0xba1ca000}, {0xba1cc000}, {0xba1ce000}, 
-    {0xba1d0000}, {0xba1d2000}, {0xba1d4000}, {0xba1d6000}, 
-    {0xba1d8000}, {0xba1da000}, {0xba1dc000}, {0xba1de000}, 
-    {0xba1e0000}, {0xba1e2000}, {0xba1e4000}, {0xba1e6000}, 
-    {0xba1e8000}, {0xba1ea000}, {0xba1ec000}, {0xba1ee000}, 
-    {0xba1f0000}, {0xba1f2000}, {0xba1f4000}, {0xba1f6000}, 
-    {0xba1f8000}, {0xba1fa000}, {0xba1fc000}, {0xba1fe000}, 
-    {0xba200000}, {0xba202000}, {0xba204000}, {0xba206000}, 
-    {0xba208000}, {0xba20a000}, {0xba20c000}, {0xba20e000}, 
-    {0xba210000}, {0xba212000}, {0xba214000}, {0xba216000}, 
-    {0xba218000}, {0xba21a000}, {0xba21c000}, {0xba21e000}, 
-    {0xba220000}, {0xba222000}, {0xba224000}, {0xba226000}, 
-    {0xba228000}, {0xba22a000}, {0xba22c000}, {0xba22e000}, 
-    {0xba230000}, {0xba232000}, {0xba234000}, {0xba236000}, 
-    {0xba238000}, {0xba23a000}, {0xba23c000}, {0xba23e000}, 
-    {0xba240000}, {0xba242000}, {0xba244000}, {0xba246000}, 
-    {0xba248000}, {0xba24a000}, {0xba24c000}, {0xba24e000}, 
-    {0xba250000}, {0xba252000}, {0xba254000}, {0xba256000}, 
-    {0xba258000}, {0xba25a000}, {0xba25c000}, {0xba25e000}, 
-    {0xba260000}, {0xba262000}, {0xba264000}, {0xba266000}, 
-    {0xba268000}, {0xba26a000}, {0xba26c000}, {0xba26e000}, 
-    {0xba270000}, {0xba272000}, {0xba274000}, {0xba276000}, 
-    {0xba278000}, {0xba27a000}, {0xba27c000}, {0xba27e000}, 
-    {0xba280000}, {0xba282000}, {0xba284000}, {0xba286000}, 
-    {0xba288000}, {0xba28a000}, {0xba28c000}, {0xba28e000}, 
-    {0xba290000}, {0xba292000}, {0xba294000}, {0xba296000}, 
-    {0xba298000}, {0xba29a000}, {0xba29c000}, {0xba29e000}, 
-    {0xba2a0000}, {0xba2a2000}, {0xba2a4000}, {0xba2a6000}, 
-    {0xba2a8000}, {0xba2aa000}, {0xba2ac000}, {0xba2ae000}, 
-    {0xba2b0000}, {0xba2b2000}, {0xba2b4000}, {0xba2b6000}, 
-    {0xba2b8000}, {0xba2ba000}, {0xba2bc000}, {0xba2be000}, 
-    {0xba2c0000}, {0xba2c2000}, {0xba2c4000}, {0xba2c6000}, 
-    {0xba2c8000}, {0xba2ca000}, {0xba2cc000}, {0xba2ce000}, 
-    {0xba2d0000}, {0xba2d2000}, {0xba2d4000}, {0xba2d6000}, 
-    {0xba2d8000}, {0xba2da000}, {0xba2dc000}, {0xba2de000}, 
-    {0xba2e0000}, {0xba2e2000}, {0xba2e4000}, {0xba2e6000}, 
-    {0xba2e8000}, {0xba2ea000}, {0xba2ec000}, {0xba2ee000}, 
-    {0xba2f0000}, {0xba2f2000}, {0xba2f4000}, {0xba2f6000}, 
-    {0xba2f8000}, {0xba2fa000}, {0xba2fc000}, {0xba2fe000}, 
-    {0xba300000}, {0xba302000}, {0xba304000}, {0xba306000}, 
-    {0xba308000}, {0xba30a000}, {0xba30c000}, {0xba30e000}, 
-    {0xba310000}, {0xba312000}, {0xba314000}, {0xba316000}, 
-    {0xba318000}, {0xba31a000}, {0xba31c000}, {0xba31e000}, 
-    {0xba320000}, {0xba322000}, {0xba324000}, {0xba326000}, 
-    {0xba328000}, {0xba32a000}, {0xba32c000}, {0xba32e000}, 
-    {0xba330000}, {0xba332000}, {0xba334000}, {0xba336000}, 
-    {0xba338000}, {0xba33a000}, {0xba33c000}, {0xba33e000}, 
-    {0xba340000}, {0xba342000}, {0xba344000}, {0xba346000}, 
-    {0xba348000}, {0xba34a000}, {0xba34c000}, {0xba34e000}, 
-    {0xba350000}, {0xba352000}, {0xba354000}, {0xba356000}, 
-    {0xba358000}, {0xba35a000}, {0xba35c000}, {0xba35e000}, 
-    {0xba360000}, {0xba362000}, {0xba364000}, {0xba366000}, 
-    {0xba368000}, {0xba36a000}, {0xba36c000}, {0xba36e000}, 
-    {0xba370000}, {0xba372000}, {0xba374000}, {0xba376000}, 
-    {0xba378000}, {0xba37a000}, {0xba37c000}, {0xba37e000}, 
-    {0xba380000}, {0xba382000}, {0xba384000}, {0xba386000}, 
-    {0xba388000}, {0xba38a000}, {0xba38c000}, {0xba38e000}, 
-    {0xba390000}, {0xba392000}, {0xba394000}, {0xba396000}, 
-    {0xba398000}, {0xba39a000}, {0xba39c000}, {0xba39e000}, 
-    {0xba3a0000}, {0xba3a2000}, {0xba3a4000}, {0xba3a6000}, 
-    {0xba3a8000}, {0xba3aa000}, {0xba3ac000}, {0xba3ae000}, 
-    {0xba3b0000}, {0xba3b2000}, {0xba3b4000}, {0xba3b6000}, 
-    {0xba3b8000}, {0xba3ba000}, {0xba3bc000}, {0xba3be000}, 
-    {0xba3c0000}, {0xba3c2000}, {0xba3c4000}, {0xba3c6000}, 
-    {0xba3c8000}, {0xba3ca000}, {0xba3cc000}, {0xba3ce000}, 
-    {0xba3d0000}, {0xba3d2000}, {0xba3d4000}, {0xba3d6000}, 
-    {0xba3d8000}, {0xba3da000}, {0xba3dc000}, {0xba3de000}, 
-    {0xba3e0000}, {0xba3e2000}, {0xba3e4000}, {0xba3e6000}, 
-    {0xba3e8000}, {0xba3ea000}, {0xba3ec000}, {0xba3ee000}, 
-    {0xba3f0000}, {0xba3f2000}, {0xba3f4000}, {0xba3f6000}, 
-    {0xba3f8000}, {0xba3fa000}, {0xba3fc000}, {0xba3fe000}, 
-    {0xba400000}, {0xba402000}, {0xba404000}, {0xba406000}, 
-    {0xba408000}, {0xba40a000}, {0xba40c000}, {0xba40e000}, 
-    {0xba410000}, {0xba412000}, {0xba414000}, {0xba416000}, 
-    {0xba418000}, {0xba41a000}, {0xba41c000}, {0xba41e000}, 
-    {0xba420000}, {0xba422000}, {0xba424000}, {0xba426000}, 
-    {0xba428000}, {0xba42a000}, {0xba42c000}, {0xba42e000}, 
-    {0xba430000}, {0xba432000}, {0xba434000}, {0xba436000}, 
-    {0xba438000}, {0xba43a000}, {0xba43c000}, {0xba43e000}, 
-    {0xba440000}, {0xba442000}, {0xba444000}, {0xba446000}, 
-    {0xba448000}, {0xba44a000}, {0xba44c000}, {0xba44e000}, 
-    {0xba450000}, {0xba452000}, {0xba454000}, {0xba456000}, 
-    {0xba458000}, {0xba45a000}, {0xba45c000}, {0xba45e000}, 
-    {0xba460000}, {0xba462000}, {0xba464000}, {0xba466000}, 
-    {0xba468000}, {0xba46a000}, {0xba46c000}, {0xba46e000}, 
-    {0xba470000}, {0xba472000}, {0xba474000}, {0xba476000}, 
-    {0xba478000}, {0xba47a000}, {0xba47c000}, {0xba47e000}, 
-    {0xba480000}, {0xba482000}, {0xba484000}, {0xba486000}, 
-    {0xba488000}, {0xba48a000}, {0xba48c000}, {0xba48e000}, 
-    {0xba490000}, {0xba492000}, {0xba494000}, {0xba496000}, 
-    {0xba498000}, {0xba49a000}, {0xba49c000}, {0xba49e000}, 
-    {0xba4a0000}, {0xba4a2000}, {0xba4a4000}, {0xba4a6000}, 
-    {0xba4a8000}, {0xba4aa000}, {0xba4ac000}, {0xba4ae000}, 
-    {0xba4b0000}, {0xba4b2000}, {0xba4b4000}, {0xba4b6000}, 
-    {0xba4b8000}, {0xba4ba000}, {0xba4bc000}, {0xba4be000}, 
-    {0xba4c0000}, {0xba4c2000}, {0xba4c4000}, {0xba4c6000}, 
-    {0xba4c8000}, {0xba4ca000}, {0xba4cc000}, {0xba4ce000}, 
-    {0xba4d0000}, {0xba4d2000}, {0xba4d4000}, {0xba4d6000}, 
-    {0xba4d8000}, {0xba4da000}, {0xba4dc000}, {0xba4de000}, 
-    {0xba4e0000}, {0xba4e2000}, {0xba4e4000}, {0xba4e6000}, 
-    {0xba4e8000}, {0xba4ea000}, {0xba4ec000}, {0xba4ee000}, 
-    {0xba4f0000}, {0xba4f2000}, {0xba4f4000}, {0xba4f6000}, 
-    {0xba4f8000}, {0xba4fa000}, {0xba4fc000}, {0xba4fe000}, 
-    {0xba500000}, {0xba502000}, {0xba504000}, {0xba506000}, 
-    {0xba508000}, {0xba50a000}, {0xba50c000}, {0xba50e000}, 
-    {0xba510000}, {0xba512000}, {0xba514000}, {0xba516000}, 
-    {0xba518000}, {0xba51a000}, {0xba51c000}, {0xba51e000}, 
-    {0xba520000}, {0xba522000}, {0xba524000}, {0xba526000}, 
-    {0xba528000}, {0xba52a000}, {0xba52c000}, {0xba52e000}, 
-    {0xba530000}, {0xba532000}, {0xba534000}, {0xba536000}, 
-    {0xba538000}, {0xba53a000}, {0xba53c000}, {0xba53e000}, 
-    {0xba540000}, {0xba542000}, {0xba544000}, {0xba546000}, 
-    {0xba548000}, {0xba54a000}, {0xba54c000}, {0xba54e000}, 
-    {0xba550000}, {0xba552000}, {0xba554000}, {0xba556000}, 
-    {0xba558000}, {0xba55a000}, {0xba55c000}, {0xba55e000}, 
-    {0xba560000}, {0xba562000}, {0xba564000}, {0xba566000}, 
-    {0xba568000}, {0xba56a000}, {0xba56c000}, {0xba56e000}, 
-    {0xba570000}, {0xba572000}, {0xba574000}, {0xba576000}, 
-    {0xba578000}, {0xba57a000}, {0xba57c000}, {0xba57e000}, 
-    {0xba580000}, {0xba582000}, {0xba584000}, {0xba586000}, 
-    {0xba588000}, {0xba58a000}, {0xba58c000}, {0xba58e000}, 
-    {0xba590000}, {0xba592000}, {0xba594000}, {0xba596000}, 
-    {0xba598000}, {0xba59a000}, {0xba59c000}, {0xba59e000}, 
-    {0xba5a0000}, {0xba5a2000}, {0xba5a4000}, {0xba5a6000}, 
-    {0xba5a8000}, {0xba5aa000}, {0xba5ac000}, {0xba5ae000}, 
-    {0xba5b0000}, {0xba5b2000}, {0xba5b4000}, {0xba5b6000}, 
-    {0xba5b8000}, {0xba5ba000}, {0xba5bc000}, {0xba5be000}, 
-    {0xba5c0000}, {0xba5c2000}, {0xba5c4000}, {0xba5c6000}, 
-    {0xba5c8000}, {0xba5ca000}, {0xba5cc000}, {0xba5ce000}, 
-    {0xba5d0000}, {0xba5d2000}, {0xba5d4000}, {0xba5d6000}, 
-    {0xba5d8000}, {0xba5da000}, {0xba5dc000}, {0xba5de000}, 
-    {0xba5e0000}, {0xba5e2000}, {0xba5e4000}, {0xba5e6000}, 
-    {0xba5e8000}, {0xba5ea000}, {0xba5ec000}, {0xba5ee000}, 
-    {0xba5f0000}, {0xba5f2000}, {0xba5f4000}, {0xba5f6000}, 
-    {0xba5f8000}, {0xba5fa000}, {0xba5fc000}, {0xba5fe000}, 
-    {0xba600000}, {0xba602000}, {0xba604000}, {0xba606000}, 
-    {0xba608000}, {0xba60a000}, {0xba60c000}, {0xba60e000}, 
-    {0xba610000}, {0xba612000}, {0xba614000}, {0xba616000}, 
-    {0xba618000}, {0xba61a000}, {0xba61c000}, {0xba61e000}, 
-    {0xba620000}, {0xba622000}, {0xba624000}, {0xba626000}, 
-    {0xba628000}, {0xba62a000}, {0xba62c000}, {0xba62e000}, 
-    {0xba630000}, {0xba632000}, {0xba634000}, {0xba636000}, 
-    {0xba638000}, {0xba63a000}, {0xba63c000}, {0xba63e000}, 
-    {0xba640000}, {0xba642000}, {0xba644000}, {0xba646000}, 
-    {0xba648000}, {0xba64a000}, {0xba64c000}, {0xba64e000}, 
-    {0xba650000}, {0xba652000}, {0xba654000}, {0xba656000}, 
-    {0xba658000}, {0xba65a000}, {0xba65c000}, {0xba65e000}, 
-    {0xba660000}, {0xba662000}, {0xba664000}, {0xba666000}, 
-    {0xba668000}, {0xba66a000}, {0xba66c000}, {0xba66e000}, 
-    {0xba670000}, {0xba672000}, {0xba674000}, {0xba676000}, 
-    {0xba678000}, {0xba67a000}, {0xba67c000}, {0xba67e000}, 
-    {0xba680000}, {0xba682000}, {0xba684000}, {0xba686000}, 
-    {0xba688000}, {0xba68a000}, {0xba68c000}, {0xba68e000}, 
-    {0xba690000}, {0xba692000}, {0xba694000}, {0xba696000}, 
-    {0xba698000}, {0xba69a000}, {0xba69c000}, {0xba69e000}, 
-    {0xba6a0000}, {0xba6a2000}, {0xba6a4000}, {0xba6a6000}, 
-    {0xba6a8000}, {0xba6aa000}, {0xba6ac000}, {0xba6ae000}, 
-    {0xba6b0000}, {0xba6b2000}, {0xba6b4000}, {0xba6b6000}, 
-    {0xba6b8000}, {0xba6ba000}, {0xba6bc000}, {0xba6be000}, 
-    {0xba6c0000}, {0xba6c2000}, {0xba6c4000}, {0xba6c6000}, 
-    {0xba6c8000}, {0xba6ca000}, {0xba6cc000}, {0xba6ce000}, 
-    {0xba6d0000}, {0xba6d2000}, {0xba6d4000}, {0xba6d6000}, 
-    {0xba6d8000}, {0xba6da000}, {0xba6dc000}, {0xba6de000}, 
-    {0xba6e0000}, {0xba6e2000}, {0xba6e4000}, {0xba6e6000}, 
-    {0xba6e8000}, {0xba6ea000}, {0xba6ec000}, {0xba6ee000}, 
-    {0xba6f0000}, {0xba6f2000}, {0xba6f4000}, {0xba6f6000}, 
-    {0xba6f8000}, {0xba6fa000}, {0xba6fc000}, {0xba6fe000}, 
-    {0xba700000}, {0xba702000}, {0xba704000}, {0xba706000}, 
-    {0xba708000}, {0xba70a000}, {0xba70c000}, {0xba70e000}, 
-    {0xba710000}, {0xba712000}, {0xba714000}, {0xba716000}, 
-    {0xba718000}, {0xba71a000}, {0xba71c000}, {0xba71e000}, 
-    {0xba720000}, {0xba722000}, {0xba724000}, {0xba726000}, 
-    {0xba728000}, {0xba72a000}, {0xba72c000}, {0xba72e000}, 
-    {0xba730000}, {0xba732000}, {0xba734000}, {0xba736000}, 
-    {0xba738000}, {0xba73a000}, {0xba73c000}, {0xba73e000}, 
-    {0xba740000}, {0xba742000}, {0xba744000}, {0xba746000}, 
-    {0xba748000}, {0xba74a000}, {0xba74c000}, {0xba74e000}, 
-    {0xba750000}, {0xba752000}, {0xba754000}, {0xba756000}, 
-    {0xba758000}, {0xba75a000}, {0xba75c000}, {0xba75e000}, 
-    {0xba760000}, {0xba762000}, {0xba764000}, {0xba766000}, 
-    {0xba768000}, {0xba76a000}, {0xba76c000}, {0xba76e000}, 
-    {0xba770000}, {0xba772000}, {0xba774000}, {0xba776000}, 
-    {0xba778000}, {0xba77a000}, {0xba77c000}, {0xba77e000}, 
-    {0xba780000}, {0xba782000}, {0xba784000}, {0xba786000}, 
-    {0xba788000}, {0xba78a000}, {0xba78c000}, {0xba78e000}, 
-    {0xba790000}, {0xba792000}, {0xba794000}, {0xba796000}, 
-    {0xba798000}, {0xba79a000}, {0xba79c000}, {0xba79e000}, 
-    {0xba7a0000}, {0xba7a2000}, {0xba7a4000}, {0xba7a6000}, 
-    {0xba7a8000}, {0xba7aa000}, {0xba7ac000}, {0xba7ae000}, 
-    {0xba7b0000}, {0xba7b2000}, {0xba7b4000}, {0xba7b6000}, 
-    {0xba7b8000}, {0xba7ba000}, {0xba7bc000}, {0xba7be000}, 
-    {0xba7c0000}, {0xba7c2000}, {0xba7c4000}, {0xba7c6000}, 
-    {0xba7c8000}, {0xba7ca000}, {0xba7cc000}, {0xba7ce000}, 
-    {0xba7d0000}, {0xba7d2000}, {0xba7d4000}, {0xba7d6000}, 
-    {0xba7d8000}, {0xba7da000}, {0xba7dc000}, {0xba7de000}, 
-    {0xba7e0000}, {0xba7e2000}, {0xba7e4000}, {0xba7e6000}, 
-    {0xba7e8000}, {0xba7ea000}, {0xba7ec000}, {0xba7ee000}, 
-    {0xba7f0000}, {0xba7f2000}, {0xba7f4000}, {0xba7f6000}, 
-    {0xba7f8000}, {0xba7fa000}, {0xba7fc000}, {0xba7fe000}, 
-    {0xba800000}, {0xba802000}, {0xba804000}, {0xba806000}, 
-    {0xba808000}, {0xba80a000}, {0xba80c000}, {0xba80e000}, 
-    {0xba810000}, {0xba812000}, {0xba814000}, {0xba816000}, 
-    {0xba818000}, {0xba81a000}, {0xba81c000}, {0xba81e000}, 
-    {0xba820000}, {0xba822000}, {0xba824000}, {0xba826000}, 
-    {0xba828000}, {0xba82a000}, {0xba82c000}, {0xba82e000}, 
-    {0xba830000}, {0xba832000}, {0xba834000}, {0xba836000}, 
-    {0xba838000}, {0xba83a000}, {0xba83c000}, {0xba83e000}, 
-    {0xba840000}, {0xba842000}, {0xba844000}, {0xba846000}, 
-    {0xba848000}, {0xba84a000}, {0xba84c000}, {0xba84e000}, 
-    {0xba850000}, {0xba852000}, {0xba854000}, {0xba856000}, 
-    {0xba858000}, {0xba85a000}, {0xba85c000}, {0xba85e000}, 
-    {0xba860000}, {0xba862000}, {0xba864000}, {0xba866000}, 
-    {0xba868000}, {0xba86a000}, {0xba86c000}, {0xba86e000}, 
-    {0xba870000}, {0xba872000}, {0xba874000}, {0xba876000}, 
-    {0xba878000}, {0xba87a000}, {0xba87c000}, {0xba87e000}, 
-    {0xba880000}, {0xba882000}, {0xba884000}, {0xba886000}, 
-    {0xba888000}, {0xba88a000}, {0xba88c000}, {0xba88e000}, 
-    {0xba890000}, {0xba892000}, {0xba894000}, {0xba896000}, 
-    {0xba898000}, {0xba89a000}, {0xba89c000}, {0xba89e000}, 
-    {0xba8a0000}, {0xba8a2000}, {0xba8a4000}, {0xba8a6000}, 
-    {0xba8a8000}, {0xba8aa000}, {0xba8ac000}, {0xba8ae000}, 
-    {0xba8b0000}, {0xba8b2000}, {0xba8b4000}, {0xba8b6000}, 
-    {0xba8b8000}, {0xba8ba000}, {0xba8bc000}, {0xba8be000}, 
-    {0xba8c0000}, {0xba8c2000}, {0xba8c4000}, {0xba8c6000}, 
-    {0xba8c8000}, {0xba8ca000}, {0xba8cc000}, {0xba8ce000}, 
-    {0xba8d0000}, {0xba8d2000}, {0xba8d4000}, {0xba8d6000}, 
-    {0xba8d8000}, {0xba8da000}, {0xba8dc000}, {0xba8de000}, 
-    {0xba8e0000}, {0xba8e2000}, {0xba8e4000}, {0xba8e6000}, 
-    {0xba8e8000}, {0xba8ea000}, {0xba8ec000}, {0xba8ee000}, 
-    {0xba8f0000}, {0xba8f2000}, {0xba8f4000}, {0xba8f6000}, 
-    {0xba8f8000}, {0xba8fa000}, {0xba8fc000}, {0xba8fe000}, 
-    {0xba900000}, {0xba902000}, {0xba904000}, {0xba906000}, 
-    {0xba908000}, {0xba90a000}, {0xba90c000}, {0xba90e000}, 
-    {0xba910000}, {0xba912000}, {0xba914000}, {0xba916000}, 
-    {0xba918000}, {0xba91a000}, {0xba91c000}, {0xba91e000}, 
-    {0xba920000}, {0xba922000}, {0xba924000}, {0xba926000}, 
-    {0xba928000}, {0xba92a000}, {0xba92c000}, {0xba92e000}, 
-    {0xba930000}, {0xba932000}, {0xba934000}, {0xba936000}, 
-    {0xba938000}, {0xba93a000}, {0xba93c000}, {0xba93e000}, 
-    {0xba940000}, {0xba942000}, {0xba944000}, {0xba946000}, 
-    {0xba948000}, {0xba94a000}, {0xba94c000}, {0xba94e000}, 
-    {0xba950000}, {0xba952000}, {0xba954000}, {0xba956000}, 
-    {0xba958000}, {0xba95a000}, {0xba95c000}, {0xba95e000}, 
-    {0xba960000}, {0xba962000}, {0xba964000}, {0xba966000}, 
-    {0xba968000}, {0xba96a000}, {0xba96c000}, {0xba96e000}, 
-    {0xba970000}, {0xba972000}, {0xba974000}, {0xba976000}, 
-    {0xba978000}, {0xba97a000}, {0xba97c000}, {0xba97e000}, 
-    {0xba980000}, {0xba982000}, {0xba984000}, {0xba986000}, 
-    {0xba988000}, {0xba98a000}, {0xba98c000}, {0xba98e000}, 
-    {0xba990000}, {0xba992000}, {0xba994000}, {0xba996000}, 
-    {0xba998000}, {0xba99a000}, {0xba99c000}, {0xba99e000}, 
-    {0xba9a0000}, {0xba9a2000}, {0xba9a4000}, {0xba9a6000}, 
-    {0xba9a8000}, {0xba9aa000}, {0xba9ac000}, {0xba9ae000}, 
-    {0xba9b0000}, {0xba9b2000}, {0xba9b4000}, {0xba9b6000}, 
-    {0xba9b8000}, {0xba9ba000}, {0xba9bc000}, {0xba9be000}, 
-    {0xba9c0000}, {0xba9c2000}, {0xba9c4000}, {0xba9c6000}, 
-    {0xba9c8000}, {0xba9ca000}, {0xba9cc000}, {0xba9ce000}, 
-    {0xba9d0000}, {0xba9d2000}, {0xba9d4000}, {0xba9d6000}, 
-    {0xba9d8000}, {0xba9da000}, {0xba9dc000}, {0xba9de000}, 
-    {0xba9e0000}, {0xba9e2000}, {0xba9e4000}, {0xba9e6000}, 
-    {0xba9e8000}, {0xba9ea000}, {0xba9ec000}, {0xba9ee000}, 
-    {0xba9f0000}, {0xba9f2000}, {0xba9f4000}, {0xba9f6000}, 
-    {0xba9f8000}, {0xba9fa000}, {0xba9fc000}, {0xba9fe000}, 
-    {0xbaa00000}, {0xbaa02000}, {0xbaa04000}, {0xbaa06000}, 
-    {0xbaa08000}, {0xbaa0a000}, {0xbaa0c000}, {0xbaa0e000}, 
-    {0xbaa10000}, {0xbaa12000}, {0xbaa14000}, {0xbaa16000}, 
-    {0xbaa18000}, {0xbaa1a000}, {0xbaa1c000}, {0xbaa1e000}, 
-    {0xbaa20000}, {0xbaa22000}, {0xbaa24000}, {0xbaa26000}, 
-    {0xbaa28000}, {0xbaa2a000}, {0xbaa2c000}, {0xbaa2e000}, 
-    {0xbaa30000}, {0xbaa32000}, {0xbaa34000}, {0xbaa36000}, 
-    {0xbaa38000}, {0xbaa3a000}, {0xbaa3c000}, {0xbaa3e000}, 
-    {0xbaa40000}, {0xbaa42000}, {0xbaa44000}, {0xbaa46000}, 
-    {0xbaa48000}, {0xbaa4a000}, {0xbaa4c000}, {0xbaa4e000}, 
-    {0xbaa50000}, {0xbaa52000}, {0xbaa54000}, {0xbaa56000}, 
-    {0xbaa58000}, {0xbaa5a000}, {0xbaa5c000}, {0xbaa5e000}, 
-    {0xbaa60000}, {0xbaa62000}, {0xbaa64000}, {0xbaa66000}, 
-    {0xbaa68000}, {0xbaa6a000}, {0xbaa6c000}, {0xbaa6e000}, 
-    {0xbaa70000}, {0xbaa72000}, {0xbaa74000}, {0xbaa76000}, 
-    {0xbaa78000}, {0xbaa7a000}, {0xbaa7c000}, {0xbaa7e000}, 
-    {0xbaa80000}, {0xbaa82000}, {0xbaa84000}, {0xbaa86000}, 
-    {0xbaa88000}, {0xbaa8a000}, {0xbaa8c000}, {0xbaa8e000}, 
-    {0xbaa90000}, {0xbaa92000}, {0xbaa94000}, {0xbaa96000}, 
-    {0xbaa98000}, {0xbaa9a000}, {0xbaa9c000}, {0xbaa9e000}, 
-    {0xbaaa0000}, {0xbaaa2000}, {0xbaaa4000}, {0xbaaa6000}, 
-    {0xbaaa8000}, {0xbaaaa000}, {0xbaaac000}, {0xbaaae000}, 
-    {0xbaab0000}, {0xbaab2000}, {0xbaab4000}, {0xbaab6000}, 
-    {0xbaab8000}, {0xbaaba000}, {0xbaabc000}, {0xbaabe000}, 
-    {0xbaac0000}, {0xbaac2000}, {0xbaac4000}, {0xbaac6000}, 
-    {0xbaac8000}, {0xbaaca000}, {0xbaacc000}, {0xbaace000}, 
-    {0xbaad0000}, {0xbaad2000}, {0xbaad4000}, {0xbaad6000}, 
-    {0xbaad8000}, {0xbaada000}, {0xbaadc000}, {0xbaade000}, 
-    {0xbaae0000}, {0xbaae2000}, {0xbaae4000}, {0xbaae6000}, 
-    {0xbaae8000}, {0xbaaea000}, {0xbaaec000}, {0xbaaee000}, 
-    {0xbaaf0000}, {0xbaaf2000}, {0xbaaf4000}, {0xbaaf6000}, 
-    {0xbaaf8000}, {0xbaafa000}, {0xbaafc000}, {0xbaafe000}, 
-    {0xbab00000}, {0xbab02000}, {0xbab04000}, {0xbab06000}, 
-    {0xbab08000}, {0xbab0a000}, {0xbab0c000}, {0xbab0e000}, 
-    {0xbab10000}, {0xbab12000}, {0xbab14000}, {0xbab16000}, 
-    {0xbab18000}, {0xbab1a000}, {0xbab1c000}, {0xbab1e000}, 
-    {0xbab20000}, {0xbab22000}, {0xbab24000}, {0xbab26000}, 
-    {0xbab28000}, {0xbab2a000}, {0xbab2c000}, {0xbab2e000}, 
-    {0xbab30000}, {0xbab32000}, {0xbab34000}, {0xbab36000}, 
-    {0xbab38000}, {0xbab3a000}, {0xbab3c000}, {0xbab3e000}, 
-    {0xbab40000}, {0xbab42000}, {0xbab44000}, {0xbab46000}, 
-    {0xbab48000}, {0xbab4a000}, {0xbab4c000}, {0xbab4e000}, 
-    {0xbab50000}, {0xbab52000}, {0xbab54000}, {0xbab56000}, 
-    {0xbab58000}, {0xbab5a000}, {0xbab5c000}, {0xbab5e000}, 
-    {0xbab60000}, {0xbab62000}, {0xbab64000}, {0xbab66000}, 
-    {0xbab68000}, {0xbab6a000}, {0xbab6c000}, {0xbab6e000}, 
-    {0xbab70000}, {0xbab72000}, {0xbab74000}, {0xbab76000}, 
-    {0xbab78000}, {0xbab7a000}, {0xbab7c000}, {0xbab7e000}, 
-    {0xbab80000}, {0xbab82000}, {0xbab84000}, {0xbab86000}, 
-    {0xbab88000}, {0xbab8a000}, {0xbab8c000}, {0xbab8e000}, 
-    {0xbab90000}, {0xbab92000}, {0xbab94000}, {0xbab96000}, 
-    {0xbab98000}, {0xbab9a000}, {0xbab9c000}, {0xbab9e000}, 
-    {0xbaba0000}, {0xbaba2000}, {0xbaba4000}, {0xbaba6000}, 
-    {0xbaba8000}, {0xbabaa000}, {0xbabac000}, {0xbabae000}, 
-    {0xbabb0000}, {0xbabb2000}, {0xbabb4000}, {0xbabb6000}, 
-    {0xbabb8000}, {0xbabba000}, {0xbabbc000}, {0xbabbe000}, 
-    {0xbabc0000}, {0xbabc2000}, {0xbabc4000}, {0xbabc6000}, 
-    {0xbabc8000}, {0xbabca000}, {0xbabcc000}, {0xbabce000}, 
-    {0xbabd0000}, {0xbabd2000}, {0xbabd4000}, {0xbabd6000}, 
-    {0xbabd8000}, {0xbabda000}, {0xbabdc000}, {0xbabde000}, 
-    {0xbabe0000}, {0xbabe2000}, {0xbabe4000}, {0xbabe6000}, 
-    {0xbabe8000}, {0xbabea000}, {0xbabec000}, {0xbabee000}, 
-    {0xbabf0000}, {0xbabf2000}, {0xbabf4000}, {0xbabf6000}, 
-    {0xbabf8000}, {0xbabfa000}, {0xbabfc000}, {0xbabfe000}, 
-    {0xbac00000}, {0xbac02000}, {0xbac04000}, {0xbac06000}, 
-    {0xbac08000}, {0xbac0a000}, {0xbac0c000}, {0xbac0e000}, 
-    {0xbac10000}, {0xbac12000}, {0xbac14000}, {0xbac16000}, 
-    {0xbac18000}, {0xbac1a000}, {0xbac1c000}, {0xbac1e000}, 
-    {0xbac20000}, {0xbac22000}, {0xbac24000}, {0xbac26000}, 
-    {0xbac28000}, {0xbac2a000}, {0xbac2c000}, {0xbac2e000}, 
-    {0xbac30000}, {0xbac32000}, {0xbac34000}, {0xbac36000}, 
-    {0xbac38000}, {0xbac3a000}, {0xbac3c000}, {0xbac3e000}, 
-    {0xbac40000}, {0xbac42000}, {0xbac44000}, {0xbac46000}, 
-    {0xbac48000}, {0xbac4a000}, {0xbac4c000}, {0xbac4e000}, 
-    {0xbac50000}, {0xbac52000}, {0xbac54000}, {0xbac56000}, 
-    {0xbac58000}, {0xbac5a000}, {0xbac5c000}, {0xbac5e000}, 
-    {0xbac60000}, {0xbac62000}, {0xbac64000}, {0xbac66000}, 
-    {0xbac68000}, {0xbac6a000}, {0xbac6c000}, {0xbac6e000}, 
-    {0xbac70000}, {0xbac72000}, {0xbac74000}, {0xbac76000}, 
-    {0xbac78000}, {0xbac7a000}, {0xbac7c000}, {0xbac7e000}, 
-    {0xbac80000}, {0xbac82000}, {0xbac84000}, {0xbac86000}, 
-    {0xbac88000}, {0xbac8a000}, {0xbac8c000}, {0xbac8e000}, 
-    {0xbac90000}, {0xbac92000}, {0xbac94000}, {0xbac96000}, 
-    {0xbac98000}, {0xbac9a000}, {0xbac9c000}, {0xbac9e000}, 
-    {0xbaca0000}, {0xbaca2000}, {0xbaca4000}, {0xbaca6000}, 
-    {0xbaca8000}, {0xbacaa000}, {0xbacac000}, {0xbacae000}, 
-    {0xbacb0000}, {0xbacb2000}, {0xbacb4000}, {0xbacb6000}, 
-    {0xbacb8000}, {0xbacba000}, {0xbacbc000}, {0xbacbe000}, 
-    {0xbacc0000}, {0xbacc2000}, {0xbacc4000}, {0xbacc6000}, 
-    {0xbacc8000}, {0xbacca000}, {0xbaccc000}, {0xbacce000}, 
-    {0xbacd0000}, {0xbacd2000}, {0xbacd4000}, {0xbacd6000}, 
-    {0xbacd8000}, {0xbacda000}, {0xbacdc000}, {0xbacde000}, 
-    {0xbace0000}, {0xbace2000}, {0xbace4000}, {0xbace6000}, 
-    {0xbace8000}, {0xbacea000}, {0xbacec000}, {0xbacee000}, 
-    {0xbacf0000}, {0xbacf2000}, {0xbacf4000}, {0xbacf6000}, 
-    {0xbacf8000}, {0xbacfa000}, {0xbacfc000}, {0xbacfe000}, 
-    {0xbad00000}, {0xbad02000}, {0xbad04000}, {0xbad06000}, 
-    {0xbad08000}, {0xbad0a000}, {0xbad0c000}, {0xbad0e000}, 
-    {0xbad10000}, {0xbad12000}, {0xbad14000}, {0xbad16000}, 
-    {0xbad18000}, {0xbad1a000}, {0xbad1c000}, {0xbad1e000}, 
-    {0xbad20000}, {0xbad22000}, {0xbad24000}, {0xbad26000}, 
-    {0xbad28000}, {0xbad2a000}, {0xbad2c000}, {0xbad2e000}, 
-    {0xbad30000}, {0xbad32000}, {0xbad34000}, {0xbad36000}, 
-    {0xbad38000}, {0xbad3a000}, {0xbad3c000}, {0xbad3e000}, 
-    {0xbad40000}, {0xbad42000}, {0xbad44000}, {0xbad46000}, 
-    {0xbad48000}, {0xbad4a000}, {0xbad4c000}, {0xbad4e000}, 
-    {0xbad50000}, {0xbad52000}, {0xbad54000}, {0xbad56000}, 
-    {0xbad58000}, {0xbad5a000}, {0xbad5c000}, {0xbad5e000}, 
-    {0xbad60000}, {0xbad62000}, {0xbad64000}, {0xbad66000}, 
-    {0xbad68000}, {0xbad6a000}, {0xbad6c000}, {0xbad6e000}, 
-    {0xbad70000}, {0xbad72000}, {0xbad74000}, {0xbad76000}, 
-    {0xbad78000}, {0xbad7a000}, {0xbad7c000}, {0xbad7e000}, 
-    {0xbad80000}, {0xbad82000}, {0xbad84000}, {0xbad86000}, 
-    {0xbad88000}, {0xbad8a000}, {0xbad8c000}, {0xbad8e000}, 
-    {0xbad90000}, {0xbad92000}, {0xbad94000}, {0xbad96000}, 
-    {0xbad98000}, {0xbad9a000}, {0xbad9c000}, {0xbad9e000}, 
-    {0xbada0000}, {0xbada2000}, {0xbada4000}, {0xbada6000}, 
-    {0xbada8000}, {0xbadaa000}, {0xbadac000}, {0xbadae000}, 
-    {0xbadb0000}, {0xbadb2000}, {0xbadb4000}, {0xbadb6000}, 
-    {0xbadb8000}, {0xbadba000}, {0xbadbc000}, {0xbadbe000}, 
-    {0xbadc0000}, {0xbadc2000}, {0xbadc4000}, {0xbadc6000}, 
-    {0xbadc8000}, {0xbadca000}, {0xbadcc000}, {0xbadce000}, 
-    {0xbadd0000}, {0xbadd2000}, {0xbadd4000}, {0xbadd6000}, 
-    {0xbadd8000}, {0xbadda000}, {0xbaddc000}, {0xbadde000}, 
-    {0xbade0000}, {0xbade2000}, {0xbade4000}, {0xbade6000}, 
-    {0xbade8000}, {0xbadea000}, {0xbadec000}, {0xbadee000}, 
-    {0xbadf0000}, {0xbadf2000}, {0xbadf4000}, {0xbadf6000}, 
-    {0xbadf8000}, {0xbadfa000}, {0xbadfc000}, {0xbadfe000}, 
-    {0xbae00000}, {0xbae02000}, {0xbae04000}, {0xbae06000}, 
-    {0xbae08000}, {0xbae0a000}, {0xbae0c000}, {0xbae0e000}, 
-    {0xbae10000}, {0xbae12000}, {0xbae14000}, {0xbae16000}, 
-    {0xbae18000}, {0xbae1a000}, {0xbae1c000}, {0xbae1e000}, 
-    {0xbae20000}, {0xbae22000}, {0xbae24000}, {0xbae26000}, 
-    {0xbae28000}, {0xbae2a000}, {0xbae2c000}, {0xbae2e000}, 
-    {0xbae30000}, {0xbae32000}, {0xbae34000}, {0xbae36000}, 
-    {0xbae38000}, {0xbae3a000}, {0xbae3c000}, {0xbae3e000}, 
-    {0xbae40000}, {0xbae42000}, {0xbae44000}, {0xbae46000}, 
-    {0xbae48000}, {0xbae4a000}, {0xbae4c000}, {0xbae4e000}, 
-    {0xbae50000}, {0xbae52000}, {0xbae54000}, {0xbae56000}, 
-    {0xbae58000}, {0xbae5a000}, {0xbae5c000}, {0xbae5e000}, 
-    {0xbae60000}, {0xbae62000}, {0xbae64000}, {0xbae66000}, 
-    {0xbae68000}, {0xbae6a000}, {0xbae6c000}, {0xbae6e000}, 
-    {0xbae70000}, {0xbae72000}, {0xbae74000}, {0xbae76000}, 
-    {0xbae78000}, {0xbae7a000}, {0xbae7c000}, {0xbae7e000}, 
-    {0xbae80000}, {0xbae82000}, {0xbae84000}, {0xbae86000}, 
-    {0xbae88000}, {0xbae8a000}, {0xbae8c000}, {0xbae8e000}, 
-    {0xbae90000}, {0xbae92000}, {0xbae94000}, {0xbae96000}, 
-    {0xbae98000}, {0xbae9a000}, {0xbae9c000}, {0xbae9e000}, 
-    {0xbaea0000}, {0xbaea2000}, {0xbaea4000}, {0xbaea6000}, 
-    {0xbaea8000}, {0xbaeaa000}, {0xbaeac000}, {0xbaeae000}, 
-    {0xbaeb0000}, {0xbaeb2000}, {0xbaeb4000}, {0xbaeb6000}, 
-    {0xbaeb8000}, {0xbaeba000}, {0xbaebc000}, {0xbaebe000}, 
-    {0xbaec0000}, {0xbaec2000}, {0xbaec4000}, {0xbaec6000}, 
-    {0xbaec8000}, {0xbaeca000}, {0xbaecc000}, {0xbaece000}, 
-    {0xbaed0000}, {0xbaed2000}, {0xbaed4000}, {0xbaed6000}, 
-    {0xbaed8000}, {0xbaeda000}, {0xbaedc000}, {0xbaede000}, 
-    {0xbaee0000}, {0xbaee2000}, {0xbaee4000}, {0xbaee6000}, 
-    {0xbaee8000}, {0xbaeea000}, {0xbaeec000}, {0xbaeee000}, 
-    {0xbaef0000}, {0xbaef2000}, {0xbaef4000}, {0xbaef6000}, 
-    {0xbaef8000}, {0xbaefa000}, {0xbaefc000}, {0xbaefe000}, 
-    {0xbaf00000}, {0xbaf02000}, {0xbaf04000}, {0xbaf06000}, 
-    {0xbaf08000}, {0xbaf0a000}, {0xbaf0c000}, {0xbaf0e000}, 
-    {0xbaf10000}, {0xbaf12000}, {0xbaf14000}, {0xbaf16000}, 
-    {0xbaf18000}, {0xbaf1a000}, {0xbaf1c000}, {0xbaf1e000}, 
-    {0xbaf20000}, {0xbaf22000}, {0xbaf24000}, {0xbaf26000}, 
-    {0xbaf28000}, {0xbaf2a000}, {0xbaf2c000}, {0xbaf2e000}, 
-    {0xbaf30000}, {0xbaf32000}, {0xbaf34000}, {0xbaf36000}, 
-    {0xbaf38000}, {0xbaf3a000}, {0xbaf3c000}, {0xbaf3e000}, 
-    {0xbaf40000}, {0xbaf42000}, {0xbaf44000}, {0xbaf46000}, 
-    {0xbaf48000}, {0xbaf4a000}, {0xbaf4c000}, {0xbaf4e000}, 
-    {0xbaf50000}, {0xbaf52000}, {0xbaf54000}, {0xbaf56000}, 
-    {0xbaf58000}, {0xbaf5a000}, {0xbaf5c000}, {0xbaf5e000}, 
-    {0xbaf60000}, {0xbaf62000}, {0xbaf64000}, {0xbaf66000}, 
-    {0xbaf68000}, {0xbaf6a000}, {0xbaf6c000}, {0xbaf6e000}, 
-    {0xbaf70000}, {0xbaf72000}, {0xbaf74000}, {0xbaf76000}, 
-    {0xbaf78000}, {0xbaf7a000}, {0xbaf7c000}, {0xbaf7e000}, 
-    {0xbaf80000}, {0xbaf82000}, {0xbaf84000}, {0xbaf86000}, 
-    {0xbaf88000}, {0xbaf8a000}, {0xbaf8c000}, {0xbaf8e000}, 
-    {0xbaf90000}, {0xbaf92000}, {0xbaf94000}, {0xbaf96000}, 
-    {0xbaf98000}, {0xbaf9a000}, {0xbaf9c000}, {0xbaf9e000}, 
-    {0xbafa0000}, {0xbafa2000}, {0xbafa4000}, {0xbafa6000}, 
-    {0xbafa8000}, {0xbafaa000}, {0xbafac000}, {0xbafae000}, 
-    {0xbafb0000}, {0xbafb2000}, {0xbafb4000}, {0xbafb6000}, 
-    {0xbafb8000}, {0xbafba000}, {0xbafbc000}, {0xbafbe000}, 
-    {0xbafc0000}, {0xbafc2000}, {0xbafc4000}, {0xbafc6000}, 
-    {0xbafc8000}, {0xbafca000}, {0xbafcc000}, {0xbafce000}, 
-    {0xbafd0000}, {0xbafd2000}, {0xbafd4000}, {0xbafd6000}, 
-    {0xbafd8000}, {0xbafda000}, {0xbafdc000}, {0xbafde000}, 
-    {0xbafe0000}, {0xbafe2000}, {0xbafe4000}, {0xbafe6000}, 
-    {0xbafe8000}, {0xbafea000}, {0xbafec000}, {0xbafee000}, 
-    {0xbaff0000}, {0xbaff2000}, {0xbaff4000}, {0xbaff6000}, 
-    {0xbaff8000}, {0xbaffa000}, {0xbaffc000}, {0xbaffe000}, 
-    {0xbb000000}, {0xbb002000}, {0xbb004000}, {0xbb006000}, 
-    {0xbb008000}, {0xbb00a000}, {0xbb00c000}, {0xbb00e000}, 
-    {0xbb010000}, {0xbb012000}, {0xbb014000}, {0xbb016000}, 
-    {0xbb018000}, {0xbb01a000}, {0xbb01c000}, {0xbb01e000}, 
-    {0xbb020000}, {0xbb022000}, {0xbb024000}, {0xbb026000}, 
-    {0xbb028000}, {0xbb02a000}, {0xbb02c000}, {0xbb02e000}, 
-    {0xbb030000}, {0xbb032000}, {0xbb034000}, {0xbb036000}, 
-    {0xbb038000}, {0xbb03a000}, {0xbb03c000}, {0xbb03e000}, 
-    {0xbb040000}, {0xbb042000}, {0xbb044000}, {0xbb046000}, 
-    {0xbb048000}, {0xbb04a000}, {0xbb04c000}, {0xbb04e000}, 
-    {0xbb050000}, {0xbb052000}, {0xbb054000}, {0xbb056000}, 
-    {0xbb058000}, {0xbb05a000}, {0xbb05c000}, {0xbb05e000}, 
-    {0xbb060000}, {0xbb062000}, {0xbb064000}, {0xbb066000}, 
-    {0xbb068000}, {0xbb06a000}, {0xbb06c000}, {0xbb06e000}, 
-    {0xbb070000}, {0xbb072000}, {0xbb074000}, {0xbb076000}, 
-    {0xbb078000}, {0xbb07a000}, {0xbb07c000}, {0xbb07e000}, 
-    {0xbb080000}, {0xbb082000}, {0xbb084000}, {0xbb086000}, 
-    {0xbb088000}, {0xbb08a000}, {0xbb08c000}, {0xbb08e000}, 
-    {0xbb090000}, {0xbb092000}, {0xbb094000}, {0xbb096000}, 
-    {0xbb098000}, {0xbb09a000}, {0xbb09c000}, {0xbb09e000}, 
-    {0xbb0a0000}, {0xbb0a2000}, {0xbb0a4000}, {0xbb0a6000}, 
-    {0xbb0a8000}, {0xbb0aa000}, {0xbb0ac000}, {0xbb0ae000}, 
-    {0xbb0b0000}, {0xbb0b2000}, {0xbb0b4000}, {0xbb0b6000}, 
-    {0xbb0b8000}, {0xbb0ba000}, {0xbb0bc000}, {0xbb0be000}, 
-    {0xbb0c0000}, {0xbb0c2000}, {0xbb0c4000}, {0xbb0c6000}, 
-    {0xbb0c8000}, {0xbb0ca000}, {0xbb0cc000}, {0xbb0ce000}, 
-    {0xbb0d0000}, {0xbb0d2000}, {0xbb0d4000}, {0xbb0d6000}, 
-    {0xbb0d8000}, {0xbb0da000}, {0xbb0dc000}, {0xbb0de000}, 
-    {0xbb0e0000}, {0xbb0e2000}, {0xbb0e4000}, {0xbb0e6000}, 
-    {0xbb0e8000}, {0xbb0ea000}, {0xbb0ec000}, {0xbb0ee000}, 
-    {0xbb0f0000}, {0xbb0f2000}, {0xbb0f4000}, {0xbb0f6000}, 
-    {0xbb0f8000}, {0xbb0fa000}, {0xbb0fc000}, {0xbb0fe000}, 
-    {0xbb100000}, {0xbb102000}, {0xbb104000}, {0xbb106000}, 
-    {0xbb108000}, {0xbb10a000}, {0xbb10c000}, {0xbb10e000}, 
-    {0xbb110000}, {0xbb112000}, {0xbb114000}, {0xbb116000}, 
-    {0xbb118000}, {0xbb11a000}, {0xbb11c000}, {0xbb11e000}, 
-    {0xbb120000}, {0xbb122000}, {0xbb124000}, {0xbb126000}, 
-    {0xbb128000}, {0xbb12a000}, {0xbb12c000}, {0xbb12e000}, 
-    {0xbb130000}, {0xbb132000}, {0xbb134000}, {0xbb136000}, 
-    {0xbb138000}, {0xbb13a000}, {0xbb13c000}, {0xbb13e000}, 
-    {0xbb140000}, {0xbb142000}, {0xbb144000}, {0xbb146000}, 
-    {0xbb148000}, {0xbb14a000}, {0xbb14c000}, {0xbb14e000}, 
-    {0xbb150000}, {0xbb152000}, {0xbb154000}, {0xbb156000}, 
-    {0xbb158000}, {0xbb15a000}, {0xbb15c000}, {0xbb15e000}, 
-    {0xbb160000}, {0xbb162000}, {0xbb164000}, {0xbb166000}, 
-    {0xbb168000}, {0xbb16a000}, {0xbb16c000}, {0xbb16e000}, 
-    {0xbb170000}, {0xbb172000}, {0xbb174000}, {0xbb176000}, 
-    {0xbb178000}, {0xbb17a000}, {0xbb17c000}, {0xbb17e000}, 
-    {0xbb180000}, {0xbb182000}, {0xbb184000}, {0xbb186000}, 
-    {0xbb188000}, {0xbb18a000}, {0xbb18c000}, {0xbb18e000}, 
-    {0xbb190000}, {0xbb192000}, {0xbb194000}, {0xbb196000}, 
-    {0xbb198000}, {0xbb19a000}, {0xbb19c000}, {0xbb19e000}, 
-    {0xbb1a0000}, {0xbb1a2000}, {0xbb1a4000}, {0xbb1a6000}, 
-    {0xbb1a8000}, {0xbb1aa000}, {0xbb1ac000}, {0xbb1ae000}, 
-    {0xbb1b0000}, {0xbb1b2000}, {0xbb1b4000}, {0xbb1b6000}, 
-    {0xbb1b8000}, {0xbb1ba000}, {0xbb1bc000}, {0xbb1be000}, 
-    {0xbb1c0000}, {0xbb1c2000}, {0xbb1c4000}, {0xbb1c6000}, 
-    {0xbb1c8000}, {0xbb1ca000}, {0xbb1cc000}, {0xbb1ce000}, 
-    {0xbb1d0000}, {0xbb1d2000}, {0xbb1d4000}, {0xbb1d6000}, 
-    {0xbb1d8000}, {0xbb1da000}, {0xbb1dc000}, {0xbb1de000}, 
-    {0xbb1e0000}, {0xbb1e2000}, {0xbb1e4000}, {0xbb1e6000}, 
-    {0xbb1e8000}, {0xbb1ea000}, {0xbb1ec000}, {0xbb1ee000}, 
-    {0xbb1f0000}, {0xbb1f2000}, {0xbb1f4000}, {0xbb1f6000}, 
-    {0xbb1f8000}, {0xbb1fa000}, {0xbb1fc000}, {0xbb1fe000}, 
-    {0xbb200000}, {0xbb202000}, {0xbb204000}, {0xbb206000}, 
-    {0xbb208000}, {0xbb20a000}, {0xbb20c000}, {0xbb20e000}, 
-    {0xbb210000}, {0xbb212000}, {0xbb214000}, {0xbb216000}, 
-    {0xbb218000}, {0xbb21a000}, {0xbb21c000}, {0xbb21e000}, 
-    {0xbb220000}, {0xbb222000}, {0xbb224000}, {0xbb226000}, 
-    {0xbb228000}, {0xbb22a000}, {0xbb22c000}, {0xbb22e000}, 
-    {0xbb230000}, {0xbb232000}, {0xbb234000}, {0xbb236000}, 
-    {0xbb238000}, {0xbb23a000}, {0xbb23c000}, {0xbb23e000}, 
-    {0xbb240000}, {0xbb242000}, {0xbb244000}, {0xbb246000}, 
-    {0xbb248000}, {0xbb24a000}, {0xbb24c000}, {0xbb24e000}, 
-    {0xbb250000}, {0xbb252000}, {0xbb254000}, {0xbb256000}, 
-    {0xbb258000}, {0xbb25a000}, {0xbb25c000}, {0xbb25e000}, 
-    {0xbb260000}, {0xbb262000}, {0xbb264000}, {0xbb266000}, 
-    {0xbb268000}, {0xbb26a000}, {0xbb26c000}, {0xbb26e000}, 
-    {0xbb270000}, {0xbb272000}, {0xbb274000}, {0xbb276000}, 
-    {0xbb278000}, {0xbb27a000}, {0xbb27c000}, {0xbb27e000}, 
-    {0xbb280000}, {0xbb282000}, {0xbb284000}, {0xbb286000}, 
-    {0xbb288000}, {0xbb28a000}, {0xbb28c000}, {0xbb28e000}, 
-    {0xbb290000}, {0xbb292000}, {0xbb294000}, {0xbb296000}, 
-    {0xbb298000}, {0xbb29a000}, {0xbb29c000}, {0xbb29e000}, 
-    {0xbb2a0000}, {0xbb2a2000}, {0xbb2a4000}, {0xbb2a6000}, 
-    {0xbb2a8000}, {0xbb2aa000}, {0xbb2ac000}, {0xbb2ae000}, 
-    {0xbb2b0000}, {0xbb2b2000}, {0xbb2b4000}, {0xbb2b6000}, 
-    {0xbb2b8000}, {0xbb2ba000}, {0xbb2bc000}, {0xbb2be000}, 
-    {0xbb2c0000}, {0xbb2c2000}, {0xbb2c4000}, {0xbb2c6000}, 
-    {0xbb2c8000}, {0xbb2ca000}, {0xbb2cc000}, {0xbb2ce000}, 
-    {0xbb2d0000}, {0xbb2d2000}, {0xbb2d4000}, {0xbb2d6000}, 
-    {0xbb2d8000}, {0xbb2da000}, {0xbb2dc000}, {0xbb2de000}, 
-    {0xbb2e0000}, {0xbb2e2000}, {0xbb2e4000}, {0xbb2e6000}, 
-    {0xbb2e8000}, {0xbb2ea000}, {0xbb2ec000}, {0xbb2ee000}, 
-    {0xbb2f0000}, {0xbb2f2000}, {0xbb2f4000}, {0xbb2f6000}, 
-    {0xbb2f8000}, {0xbb2fa000}, {0xbb2fc000}, {0xbb2fe000}, 
-    {0xbb300000}, {0xbb302000}, {0xbb304000}, {0xbb306000}, 
-    {0xbb308000}, {0xbb30a000}, {0xbb30c000}, {0xbb30e000}, 
-    {0xbb310000}, {0xbb312000}, {0xbb314000}, {0xbb316000}, 
-    {0xbb318000}, {0xbb31a000}, {0xbb31c000}, {0xbb31e000}, 
-    {0xbb320000}, {0xbb322000}, {0xbb324000}, {0xbb326000}, 
-    {0xbb328000}, {0xbb32a000}, {0xbb32c000}, {0xbb32e000}, 
-    {0xbb330000}, {0xbb332000}, {0xbb334000}, {0xbb336000}, 
-    {0xbb338000}, {0xbb33a000}, {0xbb33c000}, {0xbb33e000}, 
-    {0xbb340000}, {0xbb342000}, {0xbb344000}, {0xbb346000}, 
-    {0xbb348000}, {0xbb34a000}, {0xbb34c000}, {0xbb34e000}, 
-    {0xbb350000}, {0xbb352000}, {0xbb354000}, {0xbb356000}, 
-    {0xbb358000}, {0xbb35a000}, {0xbb35c000}, {0xbb35e000}, 
-    {0xbb360000}, {0xbb362000}, {0xbb364000}, {0xbb366000}, 
-    {0xbb368000}, {0xbb36a000}, {0xbb36c000}, {0xbb36e000}, 
-    {0xbb370000}, {0xbb372000}, {0xbb374000}, {0xbb376000}, 
-    {0xbb378000}, {0xbb37a000}, {0xbb37c000}, {0xbb37e000}, 
-    {0xbb380000}, {0xbb382000}, {0xbb384000}, {0xbb386000}, 
-    {0xbb388000}, {0xbb38a000}, {0xbb38c000}, {0xbb38e000}, 
-    {0xbb390000}, {0xbb392000}, {0xbb394000}, {0xbb396000}, 
-    {0xbb398000}, {0xbb39a000}, {0xbb39c000}, {0xbb39e000}, 
-    {0xbb3a0000}, {0xbb3a2000}, {0xbb3a4000}, {0xbb3a6000}, 
-    {0xbb3a8000}, {0xbb3aa000}, {0xbb3ac000}, {0xbb3ae000}, 
-    {0xbb3b0000}, {0xbb3b2000}, {0xbb3b4000}, {0xbb3b6000}, 
-    {0xbb3b8000}, {0xbb3ba000}, {0xbb3bc000}, {0xbb3be000}, 
-    {0xbb3c0000}, {0xbb3c2000}, {0xbb3c4000}, {0xbb3c6000}, 
-    {0xbb3c8000}, {0xbb3ca000}, {0xbb3cc000}, {0xbb3ce000}, 
-    {0xbb3d0000}, {0xbb3d2000}, {0xbb3d4000}, {0xbb3d6000}, 
-    {0xbb3d8000}, {0xbb3da000}, {0xbb3dc000}, {0xbb3de000}, 
-    {0xbb3e0000}, {0xbb3e2000}, {0xbb3e4000}, {0xbb3e6000}, 
-    {0xbb3e8000}, {0xbb3ea000}, {0xbb3ec000}, {0xbb3ee000}, 
-    {0xbb3f0000}, {0xbb3f2000}, {0xbb3f4000}, {0xbb3f6000}, 
-    {0xbb3f8000}, {0xbb3fa000}, {0xbb3fc000}, {0xbb3fe000}, 
-    {0xbb400000}, {0xbb402000}, {0xbb404000}, {0xbb406000}, 
-    {0xbb408000}, {0xbb40a000}, {0xbb40c000}, {0xbb40e000}, 
-    {0xbb410000}, {0xbb412000}, {0xbb414000}, {0xbb416000}, 
-    {0xbb418000}, {0xbb41a000}, {0xbb41c000}, {0xbb41e000}, 
-    {0xbb420000}, {0xbb422000}, {0xbb424000}, {0xbb426000}, 
-    {0xbb428000}, {0xbb42a000}, {0xbb42c000}, {0xbb42e000}, 
-    {0xbb430000}, {0xbb432000}, {0xbb434000}, {0xbb436000}, 
-    {0xbb438000}, {0xbb43a000}, {0xbb43c000}, {0xbb43e000}, 
-    {0xbb440000}, {0xbb442000}, {0xbb444000}, {0xbb446000}, 
-    {0xbb448000}, {0xbb44a000}, {0xbb44c000}, {0xbb44e000}, 
-    {0xbb450000}, {0xbb452000}, {0xbb454000}, {0xbb456000}, 
-    {0xbb458000}, {0xbb45a000}, {0xbb45c000}, {0xbb45e000}, 
-    {0xbb460000}, {0xbb462000}, {0xbb464000}, {0xbb466000}, 
-    {0xbb468000}, {0xbb46a000}, {0xbb46c000}, {0xbb46e000}, 
-    {0xbb470000}, {0xbb472000}, {0xbb474000}, {0xbb476000}, 
-    {0xbb478000}, {0xbb47a000}, {0xbb47c000}, {0xbb47e000}, 
-    {0xbb480000}, {0xbb482000}, {0xbb484000}, {0xbb486000}, 
-    {0xbb488000}, {0xbb48a000}, {0xbb48c000}, {0xbb48e000}, 
-    {0xbb490000}, {0xbb492000}, {0xbb494000}, {0xbb496000}, 
-    {0xbb498000}, {0xbb49a000}, {0xbb49c000}, {0xbb49e000}, 
-    {0xbb4a0000}, {0xbb4a2000}, {0xbb4a4000}, {0xbb4a6000}, 
-    {0xbb4a8000}, {0xbb4aa000}, {0xbb4ac000}, {0xbb4ae000}, 
-    {0xbb4b0000}, {0xbb4b2000}, {0xbb4b4000}, {0xbb4b6000}, 
-    {0xbb4b8000}, {0xbb4ba000}, {0xbb4bc000}, {0xbb4be000}, 
-    {0xbb4c0000}, {0xbb4c2000}, {0xbb4c4000}, {0xbb4c6000}, 
-    {0xbb4c8000}, {0xbb4ca000}, {0xbb4cc000}, {0xbb4ce000}, 
-    {0xbb4d0000}, {0xbb4d2000}, {0xbb4d4000}, {0xbb4d6000}, 
-    {0xbb4d8000}, {0xbb4da000}, {0xbb4dc000}, {0xbb4de000}, 
-    {0xbb4e0000}, {0xbb4e2000}, {0xbb4e4000}, {0xbb4e6000}, 
-    {0xbb4e8000}, {0xbb4ea000}, {0xbb4ec000}, {0xbb4ee000}, 
-    {0xbb4f0000}, {0xbb4f2000}, {0xbb4f4000}, {0xbb4f6000}, 
-    {0xbb4f8000}, {0xbb4fa000}, {0xbb4fc000}, {0xbb4fe000}, 
-    {0xbb500000}, {0xbb502000}, {0xbb504000}, {0xbb506000}, 
-    {0xbb508000}, {0xbb50a000}, {0xbb50c000}, {0xbb50e000}, 
-    {0xbb510000}, {0xbb512000}, {0xbb514000}, {0xbb516000}, 
-    {0xbb518000}, {0xbb51a000}, {0xbb51c000}, {0xbb51e000}, 
-    {0xbb520000}, {0xbb522000}, {0xbb524000}, {0xbb526000}, 
-    {0xbb528000}, {0xbb52a000}, {0xbb52c000}, {0xbb52e000}, 
-    {0xbb530000}, {0xbb532000}, {0xbb534000}, {0xbb536000}, 
-    {0xbb538000}, {0xbb53a000}, {0xbb53c000}, {0xbb53e000}, 
-    {0xbb540000}, {0xbb542000}, {0xbb544000}, {0xbb546000}, 
-    {0xbb548000}, {0xbb54a000}, {0xbb54c000}, {0xbb54e000}, 
-    {0xbb550000}, {0xbb552000}, {0xbb554000}, {0xbb556000}, 
-    {0xbb558000}, {0xbb55a000}, {0xbb55c000}, {0xbb55e000}, 
-    {0xbb560000}, {0xbb562000}, {0xbb564000}, {0xbb566000}, 
-    {0xbb568000}, {0xbb56a000}, {0xbb56c000}, {0xbb56e000}, 
-    {0xbb570000}, {0xbb572000}, {0xbb574000}, {0xbb576000}, 
-    {0xbb578000}, {0xbb57a000}, {0xbb57c000}, {0xbb57e000}, 
-    {0xbb580000}, {0xbb582000}, {0xbb584000}, {0xbb586000}, 
-    {0xbb588000}, {0xbb58a000}, {0xbb58c000}, {0xbb58e000}, 
-    {0xbb590000}, {0xbb592000}, {0xbb594000}, {0xbb596000}, 
-    {0xbb598000}, {0xbb59a000}, {0xbb59c000}, {0xbb59e000}, 
-    {0xbb5a0000}, {0xbb5a2000}, {0xbb5a4000}, {0xbb5a6000}, 
-    {0xbb5a8000}, {0xbb5aa000}, {0xbb5ac000}, {0xbb5ae000}, 
-    {0xbb5b0000}, {0xbb5b2000}, {0xbb5b4000}, {0xbb5b6000}, 
-    {0xbb5b8000}, {0xbb5ba000}, {0xbb5bc000}, {0xbb5be000}, 
-    {0xbb5c0000}, {0xbb5c2000}, {0xbb5c4000}, {0xbb5c6000}, 
-    {0xbb5c8000}, {0xbb5ca000}, {0xbb5cc000}, {0xbb5ce000}, 
-    {0xbb5d0000}, {0xbb5d2000}, {0xbb5d4000}, {0xbb5d6000}, 
-    {0xbb5d8000}, {0xbb5da000}, {0xbb5dc000}, {0xbb5de000}, 
-    {0xbb5e0000}, {0xbb5e2000}, {0xbb5e4000}, {0xbb5e6000}, 
-    {0xbb5e8000}, {0xbb5ea000}, {0xbb5ec000}, {0xbb5ee000}, 
-    {0xbb5f0000}, {0xbb5f2000}, {0xbb5f4000}, {0xbb5f6000}, 
-    {0xbb5f8000}, {0xbb5fa000}, {0xbb5fc000}, {0xbb5fe000}, 
-    {0xbb600000}, {0xbb602000}, {0xbb604000}, {0xbb606000}, 
-    {0xbb608000}, {0xbb60a000}, {0xbb60c000}, {0xbb60e000}, 
-    {0xbb610000}, {0xbb612000}, {0xbb614000}, {0xbb616000}, 
-    {0xbb618000}, {0xbb61a000}, {0xbb61c000}, {0xbb61e000}, 
-    {0xbb620000}, {0xbb622000}, {0xbb624000}, {0xbb626000}, 
-    {0xbb628000}, {0xbb62a000}, {0xbb62c000}, {0xbb62e000}, 
-    {0xbb630000}, {0xbb632000}, {0xbb634000}, {0xbb636000}, 
-    {0xbb638000}, {0xbb63a000}, {0xbb63c000}, {0xbb63e000}, 
-    {0xbb640000}, {0xbb642000}, {0xbb644000}, {0xbb646000}, 
-    {0xbb648000}, {0xbb64a000}, {0xbb64c000}, {0xbb64e000}, 
-    {0xbb650000}, {0xbb652000}, {0xbb654000}, {0xbb656000}, 
-    {0xbb658000}, {0xbb65a000}, {0xbb65c000}, {0xbb65e000}, 
-    {0xbb660000}, {0xbb662000}, {0xbb664000}, {0xbb666000}, 
-    {0xbb668000}, {0xbb66a000}, {0xbb66c000}, {0xbb66e000}, 
-    {0xbb670000}, {0xbb672000}, {0xbb674000}, {0xbb676000}, 
-    {0xbb678000}, {0xbb67a000}, {0xbb67c000}, {0xbb67e000}, 
-    {0xbb680000}, {0xbb682000}, {0xbb684000}, {0xbb686000}, 
-    {0xbb688000}, {0xbb68a000}, {0xbb68c000}, {0xbb68e000}, 
-    {0xbb690000}, {0xbb692000}, {0xbb694000}, {0xbb696000}, 
-    {0xbb698000}, {0xbb69a000}, {0xbb69c000}, {0xbb69e000}, 
-    {0xbb6a0000}, {0xbb6a2000}, {0xbb6a4000}, {0xbb6a6000}, 
-    {0xbb6a8000}, {0xbb6aa000}, {0xbb6ac000}, {0xbb6ae000}, 
-    {0xbb6b0000}, {0xbb6b2000}, {0xbb6b4000}, {0xbb6b6000}, 
-    {0xbb6b8000}, {0xbb6ba000}, {0xbb6bc000}, {0xbb6be000}, 
-    {0xbb6c0000}, {0xbb6c2000}, {0xbb6c4000}, {0xbb6c6000}, 
-    {0xbb6c8000}, {0xbb6ca000}, {0xbb6cc000}, {0xbb6ce000}, 
-    {0xbb6d0000}, {0xbb6d2000}, {0xbb6d4000}, {0xbb6d6000}, 
-    {0xbb6d8000}, {0xbb6da000}, {0xbb6dc000}, {0xbb6de000}, 
-    {0xbb6e0000}, {0xbb6e2000}, {0xbb6e4000}, {0xbb6e6000}, 
-    {0xbb6e8000}, {0xbb6ea000}, {0xbb6ec000}, {0xbb6ee000}, 
-    {0xbb6f0000}, {0xbb6f2000}, {0xbb6f4000}, {0xbb6f6000}, 
-    {0xbb6f8000}, {0xbb6fa000}, {0xbb6fc000}, {0xbb6fe000}, 
-    {0xbb700000}, {0xbb702000}, {0xbb704000}, {0xbb706000}, 
-    {0xbb708000}, {0xbb70a000}, {0xbb70c000}, {0xbb70e000}, 
-    {0xbb710000}, {0xbb712000}, {0xbb714000}, {0xbb716000}, 
-    {0xbb718000}, {0xbb71a000}, {0xbb71c000}, {0xbb71e000}, 
-    {0xbb720000}, {0xbb722000}, {0xbb724000}, {0xbb726000}, 
-    {0xbb728000}, {0xbb72a000}, {0xbb72c000}, {0xbb72e000}, 
-    {0xbb730000}, {0xbb732000}, {0xbb734000}, {0xbb736000}, 
-    {0xbb738000}, {0xbb73a000}, {0xbb73c000}, {0xbb73e000}, 
-    {0xbb740000}, {0xbb742000}, {0xbb744000}, {0xbb746000}, 
-    {0xbb748000}, {0xbb74a000}, {0xbb74c000}, {0xbb74e000}, 
-    {0xbb750000}, {0xbb752000}, {0xbb754000}, {0xbb756000}, 
-    {0xbb758000}, {0xbb75a000}, {0xbb75c000}, {0xbb75e000}, 
-    {0xbb760000}, {0xbb762000}, {0xbb764000}, {0xbb766000}, 
-    {0xbb768000}, {0xbb76a000}, {0xbb76c000}, {0xbb76e000}, 
-    {0xbb770000}, {0xbb772000}, {0xbb774000}, {0xbb776000}, 
-    {0xbb778000}, {0xbb77a000}, {0xbb77c000}, {0xbb77e000}, 
-    {0xbb780000}, {0xbb782000}, {0xbb784000}, {0xbb786000}, 
-    {0xbb788000}, {0xbb78a000}, {0xbb78c000}, {0xbb78e000}, 
-    {0xbb790000}, {0xbb792000}, {0xbb794000}, {0xbb796000}, 
-    {0xbb798000}, {0xbb79a000}, {0xbb79c000}, {0xbb79e000}, 
-    {0xbb7a0000}, {0xbb7a2000}, {0xbb7a4000}, {0xbb7a6000}, 
-    {0xbb7a8000}, {0xbb7aa000}, {0xbb7ac000}, {0xbb7ae000}, 
-    {0xbb7b0000}, {0xbb7b2000}, {0xbb7b4000}, {0xbb7b6000}, 
-    {0xbb7b8000}, {0xbb7ba000}, {0xbb7bc000}, {0xbb7be000}, 
-    {0xbb7c0000}, {0xbb7c2000}, {0xbb7c4000}, {0xbb7c6000}, 
-    {0xbb7c8000}, {0xbb7ca000}, {0xbb7cc000}, {0xbb7ce000}, 
-    {0xbb7d0000}, {0xbb7d2000}, {0xbb7d4000}, {0xbb7d6000}, 
-    {0xbb7d8000}, {0xbb7da000}, {0xbb7dc000}, {0xbb7de000}, 
-    {0xbb7e0000}, {0xbb7e2000}, {0xbb7e4000}, {0xbb7e6000}, 
-    {0xbb7e8000}, {0xbb7ea000}, {0xbb7ec000}, {0xbb7ee000}, 
-    {0xbb7f0000}, {0xbb7f2000}, {0xbb7f4000}, {0xbb7f6000}, 
-    {0xbb7f8000}, {0xbb7fa000}, {0xbb7fc000}, {0xbb7fe000}, 
-    {0xbb800000}, {0xbb802000}, {0xbb804000}, {0xbb806000}, 
-    {0xbb808000}, {0xbb80a000}, {0xbb80c000}, {0xbb80e000}, 
-    {0xbb810000}, {0xbb812000}, {0xbb814000}, {0xbb816000}, 
-    {0xbb818000}, {0xbb81a000}, {0xbb81c000}, {0xbb81e000}, 
-    {0xbb820000}, {0xbb822000}, {0xbb824000}, {0xbb826000}, 
-    {0xbb828000}, {0xbb82a000}, {0xbb82c000}, {0xbb82e000}, 
-    {0xbb830000}, {0xbb832000}, {0xbb834000}, {0xbb836000}, 
-    {0xbb838000}, {0xbb83a000}, {0xbb83c000}, {0xbb83e000}, 
-    {0xbb840000}, {0xbb842000}, {0xbb844000}, {0xbb846000}, 
-    {0xbb848000}, {0xbb84a000}, {0xbb84c000}, {0xbb84e000}, 
-    {0xbb850000}, {0xbb852000}, {0xbb854000}, {0xbb856000}, 
-    {0xbb858000}, {0xbb85a000}, {0xbb85c000}, {0xbb85e000}, 
-    {0xbb860000}, {0xbb862000}, {0xbb864000}, {0xbb866000}, 
-    {0xbb868000}, {0xbb86a000}, {0xbb86c000}, {0xbb86e000}, 
-    {0xbb870000}, {0xbb872000}, {0xbb874000}, {0xbb876000}, 
-    {0xbb878000}, {0xbb87a000}, {0xbb87c000}, {0xbb87e000}, 
-    {0xbb880000}, {0xbb882000}, {0xbb884000}, {0xbb886000}, 
-    {0xbb888000}, {0xbb88a000}, {0xbb88c000}, {0xbb88e000}, 
-    {0xbb890000}, {0xbb892000}, {0xbb894000}, {0xbb896000}, 
-    {0xbb898000}, {0xbb89a000}, {0xbb89c000}, {0xbb89e000}, 
-    {0xbb8a0000}, {0xbb8a2000}, {0xbb8a4000}, {0xbb8a6000}, 
-    {0xbb8a8000}, {0xbb8aa000}, {0xbb8ac000}, {0xbb8ae000}, 
-    {0xbb8b0000}, {0xbb8b2000}, {0xbb8b4000}, {0xbb8b6000}, 
-    {0xbb8b8000}, {0xbb8ba000}, {0xbb8bc000}, {0xbb8be000}, 
-    {0xbb8c0000}, {0xbb8c2000}, {0xbb8c4000}, {0xbb8c6000}, 
-    {0xbb8c8000}, {0xbb8ca000}, {0xbb8cc000}, {0xbb8ce000}, 
-    {0xbb8d0000}, {0xbb8d2000}, {0xbb8d4000}, {0xbb8d6000}, 
-    {0xbb8d8000}, {0xbb8da000}, {0xbb8dc000}, {0xbb8de000}, 
-    {0xbb8e0000}, {0xbb8e2000}, {0xbb8e4000}, {0xbb8e6000}, 
-    {0xbb8e8000}, {0xbb8ea000}, {0xbb8ec000}, {0xbb8ee000}, 
-    {0xbb8f0000}, {0xbb8f2000}, {0xbb8f4000}, {0xbb8f6000}, 
-    {0xbb8f8000}, {0xbb8fa000}, {0xbb8fc000}, {0xbb8fe000}, 
-    {0xbb900000}, {0xbb902000}, {0xbb904000}, {0xbb906000}, 
-    {0xbb908000}, {0xbb90a000}, {0xbb90c000}, {0xbb90e000}, 
-    {0xbb910000}, {0xbb912000}, {0xbb914000}, {0xbb916000}, 
-    {0xbb918000}, {0xbb91a000}, {0xbb91c000}, {0xbb91e000}, 
-    {0xbb920000}, {0xbb922000}, {0xbb924000}, {0xbb926000}, 
-    {0xbb928000}, {0xbb92a000}, {0xbb92c000}, {0xbb92e000}, 
-    {0xbb930000}, {0xbb932000}, {0xbb934000}, {0xbb936000}, 
-    {0xbb938000}, {0xbb93a000}, {0xbb93c000}, {0xbb93e000}, 
-    {0xbb940000}, {0xbb942000}, {0xbb944000}, {0xbb946000}, 
-    {0xbb948000}, {0xbb94a000}, {0xbb94c000}, {0xbb94e000}, 
-    {0xbb950000}, {0xbb952000}, {0xbb954000}, {0xbb956000}, 
-    {0xbb958000}, {0xbb95a000}, {0xbb95c000}, {0xbb95e000}, 
-    {0xbb960000}, {0xbb962000}, {0xbb964000}, {0xbb966000}, 
-    {0xbb968000}, {0xbb96a000}, {0xbb96c000}, {0xbb96e000}, 
-    {0xbb970000}, {0xbb972000}, {0xbb974000}, {0xbb976000}, 
-    {0xbb978000}, {0xbb97a000}, {0xbb97c000}, {0xbb97e000}, 
-    {0xbb980000}, {0xbb982000}, {0xbb984000}, {0xbb986000}, 
-    {0xbb988000}, {0xbb98a000}, {0xbb98c000}, {0xbb98e000}, 
-    {0xbb990000}, {0xbb992000}, {0xbb994000}, {0xbb996000}, 
-    {0xbb998000}, {0xbb99a000}, {0xbb99c000}, {0xbb99e000}, 
-    {0xbb9a0000}, {0xbb9a2000}, {0xbb9a4000}, {0xbb9a6000}, 
-    {0xbb9a8000}, {0xbb9aa000}, {0xbb9ac000}, {0xbb9ae000}, 
-    {0xbb9b0000}, {0xbb9b2000}, {0xbb9b4000}, {0xbb9b6000}, 
-    {0xbb9b8000}, {0xbb9ba000}, {0xbb9bc000}, {0xbb9be000}, 
-    {0xbb9c0000}, {0xbb9c2000}, {0xbb9c4000}, {0xbb9c6000}, 
-    {0xbb9c8000}, {0xbb9ca000}, {0xbb9cc000}, {0xbb9ce000}, 
-    {0xbb9d0000}, {0xbb9d2000}, {0xbb9d4000}, {0xbb9d6000}, 
-    {0xbb9d8000}, {0xbb9da000}, {0xbb9dc000}, {0xbb9de000}, 
-    {0xbb9e0000}, {0xbb9e2000}, {0xbb9e4000}, {0xbb9e6000}, 
-    {0xbb9e8000}, {0xbb9ea000}, {0xbb9ec000}, {0xbb9ee000}, 
-    {0xbb9f0000}, {0xbb9f2000}, {0xbb9f4000}, {0xbb9f6000}, 
-    {0xbb9f8000}, {0xbb9fa000}, {0xbb9fc000}, {0xbb9fe000}, 
-    {0xbba00000}, {0xbba02000}, {0xbba04000}, {0xbba06000}, 
-    {0xbba08000}, {0xbba0a000}, {0xbba0c000}, {0xbba0e000}, 
-    {0xbba10000}, {0xbba12000}, {0xbba14000}, {0xbba16000}, 
-    {0xbba18000}, {0xbba1a000}, {0xbba1c000}, {0xbba1e000}, 
-    {0xbba20000}, {0xbba22000}, {0xbba24000}, {0xbba26000}, 
-    {0xbba28000}, {0xbba2a000}, {0xbba2c000}, {0xbba2e000}, 
-    {0xbba30000}, {0xbba32000}, {0xbba34000}, {0xbba36000}, 
-    {0xbba38000}, {0xbba3a000}, {0xbba3c000}, {0xbba3e000}, 
-    {0xbba40000}, {0xbba42000}, {0xbba44000}, {0xbba46000}, 
-    {0xbba48000}, {0xbba4a000}, {0xbba4c000}, {0xbba4e000}, 
-    {0xbba50000}, {0xbba52000}, {0xbba54000}, {0xbba56000}, 
-    {0xbba58000}, {0xbba5a000}, {0xbba5c000}, {0xbba5e000}, 
-    {0xbba60000}, {0xbba62000}, {0xbba64000}, {0xbba66000}, 
-    {0xbba68000}, {0xbba6a000}, {0xbba6c000}, {0xbba6e000}, 
-    {0xbba70000}, {0xbba72000}, {0xbba74000}, {0xbba76000}, 
-    {0xbba78000}, {0xbba7a000}, {0xbba7c000}, {0xbba7e000}, 
-    {0xbba80000}, {0xbba82000}, {0xbba84000}, {0xbba86000}, 
-    {0xbba88000}, {0xbba8a000}, {0xbba8c000}, {0xbba8e000}, 
-    {0xbba90000}, {0xbba92000}, {0xbba94000}, {0xbba96000}, 
-    {0xbba98000}, {0xbba9a000}, {0xbba9c000}, {0xbba9e000}, 
-    {0xbbaa0000}, {0xbbaa2000}, {0xbbaa4000}, {0xbbaa6000}, 
-    {0xbbaa8000}, {0xbbaaa000}, {0xbbaac000}, {0xbbaae000}, 
-    {0xbbab0000}, {0xbbab2000}, {0xbbab4000}, {0xbbab6000}, 
-    {0xbbab8000}, {0xbbaba000}, {0xbbabc000}, {0xbbabe000}, 
-    {0xbbac0000}, {0xbbac2000}, {0xbbac4000}, {0xbbac6000}, 
-    {0xbbac8000}, {0xbbaca000}, {0xbbacc000}, {0xbbace000}, 
-    {0xbbad0000}, {0xbbad2000}, {0xbbad4000}, {0xbbad6000}, 
-    {0xbbad8000}, {0xbbada000}, {0xbbadc000}, {0xbbade000}, 
-    {0xbbae0000}, {0xbbae2000}, {0xbbae4000}, {0xbbae6000}, 
-    {0xbbae8000}, {0xbbaea000}, {0xbbaec000}, {0xbbaee000}, 
-    {0xbbaf0000}, {0xbbaf2000}, {0xbbaf4000}, {0xbbaf6000}, 
-    {0xbbaf8000}, {0xbbafa000}, {0xbbafc000}, {0xbbafe000}, 
-    {0xbbb00000}, {0xbbb02000}, {0xbbb04000}, {0xbbb06000}, 
-    {0xbbb08000}, {0xbbb0a000}, {0xbbb0c000}, {0xbbb0e000}, 
-    {0xbbb10000}, {0xbbb12000}, {0xbbb14000}, {0xbbb16000}, 
-    {0xbbb18000}, {0xbbb1a000}, {0xbbb1c000}, {0xbbb1e000}, 
-    {0xbbb20000}, {0xbbb22000}, {0xbbb24000}, {0xbbb26000}, 
-    {0xbbb28000}, {0xbbb2a000}, {0xbbb2c000}, {0xbbb2e000}, 
-    {0xbbb30000}, {0xbbb32000}, {0xbbb34000}, {0xbbb36000}, 
-    {0xbbb38000}, {0xbbb3a000}, {0xbbb3c000}, {0xbbb3e000}, 
-    {0xbbb40000}, {0xbbb42000}, {0xbbb44000}, {0xbbb46000}, 
-    {0xbbb48000}, {0xbbb4a000}, {0xbbb4c000}, {0xbbb4e000}, 
-    {0xbbb50000}, {0xbbb52000}, {0xbbb54000}, {0xbbb56000}, 
-    {0xbbb58000}, {0xbbb5a000}, {0xbbb5c000}, {0xbbb5e000}, 
-    {0xbbb60000}, {0xbbb62000}, {0xbbb64000}, {0xbbb66000}, 
-    {0xbbb68000}, {0xbbb6a000}, {0xbbb6c000}, {0xbbb6e000}, 
-    {0xbbb70000}, {0xbbb72000}, {0xbbb74000}, {0xbbb76000}, 
-    {0xbbb78000}, {0xbbb7a000}, {0xbbb7c000}, {0xbbb7e000}, 
-    {0xbbb80000}, {0xbbb82000}, {0xbbb84000}, {0xbbb86000}, 
-    {0xbbb88000}, {0xbbb8a000}, {0xbbb8c000}, {0xbbb8e000}, 
-    {0xbbb90000}, {0xbbb92000}, {0xbbb94000}, {0xbbb96000}, 
-    {0xbbb98000}, {0xbbb9a000}, {0xbbb9c000}, {0xbbb9e000}, 
-    {0xbbba0000}, {0xbbba2000}, {0xbbba4000}, {0xbbba6000}, 
-    {0xbbba8000}, {0xbbbaa000}, {0xbbbac000}, {0xbbbae000}, 
-    {0xbbbb0000}, {0xbbbb2000}, {0xbbbb4000}, {0xbbbb6000}, 
-    {0xbbbb8000}, {0xbbbba000}, {0xbbbbc000}, {0xbbbbe000}, 
-    {0xbbbc0000}, {0xbbbc2000}, {0xbbbc4000}, {0xbbbc6000}, 
-    {0xbbbc8000}, {0xbbbca000}, {0xbbbcc000}, {0xbbbce000}, 
-    {0xbbbd0000}, {0xbbbd2000}, {0xbbbd4000}, {0xbbbd6000}, 
-    {0xbbbd8000}, {0xbbbda000}, {0xbbbdc000}, {0xbbbde000}, 
-    {0xbbbe0000}, {0xbbbe2000}, {0xbbbe4000}, {0xbbbe6000}, 
-    {0xbbbe8000}, {0xbbbea000}, {0xbbbec000}, {0xbbbee000}, 
-    {0xbbbf0000}, {0xbbbf2000}, {0xbbbf4000}, {0xbbbf6000}, 
-    {0xbbbf8000}, {0xbbbfa000}, {0xbbbfc000}, {0xbbbfe000}, 
-    {0xbbc00000}, {0xbbc02000}, {0xbbc04000}, {0xbbc06000}, 
-    {0xbbc08000}, {0xbbc0a000}, {0xbbc0c000}, {0xbbc0e000}, 
-    {0xbbc10000}, {0xbbc12000}, {0xbbc14000}, {0xbbc16000}, 
-    {0xbbc18000}, {0xbbc1a000}, {0xbbc1c000}, {0xbbc1e000}, 
-    {0xbbc20000}, {0xbbc22000}, {0xbbc24000}, {0xbbc26000}, 
-    {0xbbc28000}, {0xbbc2a000}, {0xbbc2c000}, {0xbbc2e000}, 
-    {0xbbc30000}, {0xbbc32000}, {0xbbc34000}, {0xbbc36000}, 
-    {0xbbc38000}, {0xbbc3a000}, {0xbbc3c000}, {0xbbc3e000}, 
-    {0xbbc40000}, {0xbbc42000}, {0xbbc44000}, {0xbbc46000}, 
-    {0xbbc48000}, {0xbbc4a000}, {0xbbc4c000}, {0xbbc4e000}, 
-    {0xbbc50000}, {0xbbc52000}, {0xbbc54000}, {0xbbc56000}, 
-    {0xbbc58000}, {0xbbc5a000}, {0xbbc5c000}, {0xbbc5e000}, 
-    {0xbbc60000}, {0xbbc62000}, {0xbbc64000}, {0xbbc66000}, 
-    {0xbbc68000}, {0xbbc6a000}, {0xbbc6c000}, {0xbbc6e000}, 
-    {0xbbc70000}, {0xbbc72000}, {0xbbc74000}, {0xbbc76000}, 
-    {0xbbc78000}, {0xbbc7a000}, {0xbbc7c000}, {0xbbc7e000}, 
-    {0xbbc80000}, {0xbbc82000}, {0xbbc84000}, {0xbbc86000}, 
-    {0xbbc88000}, {0xbbc8a000}, {0xbbc8c000}, {0xbbc8e000}, 
-    {0xbbc90000}, {0xbbc92000}, {0xbbc94000}, {0xbbc96000}, 
-    {0xbbc98000}, {0xbbc9a000}, {0xbbc9c000}, {0xbbc9e000}, 
-    {0xbbca0000}, {0xbbca2000}, {0xbbca4000}, {0xbbca6000}, 
-    {0xbbca8000}, {0xbbcaa000}, {0xbbcac000}, {0xbbcae000}, 
-    {0xbbcb0000}, {0xbbcb2000}, {0xbbcb4000}, {0xbbcb6000}, 
-    {0xbbcb8000}, {0xbbcba000}, {0xbbcbc000}, {0xbbcbe000}, 
-    {0xbbcc0000}, {0xbbcc2000}, {0xbbcc4000}, {0xbbcc6000}, 
-    {0xbbcc8000}, {0xbbcca000}, {0xbbccc000}, {0xbbcce000}, 
-    {0xbbcd0000}, {0xbbcd2000}, {0xbbcd4000}, {0xbbcd6000}, 
-    {0xbbcd8000}, {0xbbcda000}, {0xbbcdc000}, {0xbbcde000}, 
-    {0xbbce0000}, {0xbbce2000}, {0xbbce4000}, {0xbbce6000}, 
-    {0xbbce8000}, {0xbbcea000}, {0xbbcec000}, {0xbbcee000}, 
-    {0xbbcf0000}, {0xbbcf2000}, {0xbbcf4000}, {0xbbcf6000}, 
-    {0xbbcf8000}, {0xbbcfa000}, {0xbbcfc000}, {0xbbcfe000}, 
-    {0xbbd00000}, {0xbbd02000}, {0xbbd04000}, {0xbbd06000}, 
-    {0xbbd08000}, {0xbbd0a000}, {0xbbd0c000}, {0xbbd0e000}, 
-    {0xbbd10000}, {0xbbd12000}, {0xbbd14000}, {0xbbd16000}, 
-    {0xbbd18000}, {0xbbd1a000}, {0xbbd1c000}, {0xbbd1e000}, 
-    {0xbbd20000}, {0xbbd22000}, {0xbbd24000}, {0xbbd26000}, 
-    {0xbbd28000}, {0xbbd2a000}, {0xbbd2c000}, {0xbbd2e000}, 
-    {0xbbd30000}, {0xbbd32000}, {0xbbd34000}, {0xbbd36000}, 
-    {0xbbd38000}, {0xbbd3a000}, {0xbbd3c000}, {0xbbd3e000}, 
-    {0xbbd40000}, {0xbbd42000}, {0xbbd44000}, {0xbbd46000}, 
-    {0xbbd48000}, {0xbbd4a000}, {0xbbd4c000}, {0xbbd4e000}, 
-    {0xbbd50000}, {0xbbd52000}, {0xbbd54000}, {0xbbd56000}, 
-    {0xbbd58000}, {0xbbd5a000}, {0xbbd5c000}, {0xbbd5e000}, 
-    {0xbbd60000}, {0xbbd62000}, {0xbbd64000}, {0xbbd66000}, 
-    {0xbbd68000}, {0xbbd6a000}, {0xbbd6c000}, {0xbbd6e000}, 
-    {0xbbd70000}, {0xbbd72000}, {0xbbd74000}, {0xbbd76000}, 
-    {0xbbd78000}, {0xbbd7a000}, {0xbbd7c000}, {0xbbd7e000}, 
-    {0xbbd80000}, {0xbbd82000}, {0xbbd84000}, {0xbbd86000}, 
-    {0xbbd88000}, {0xbbd8a000}, {0xbbd8c000}, {0xbbd8e000}, 
-    {0xbbd90000}, {0xbbd92000}, {0xbbd94000}, {0xbbd96000}, 
-    {0xbbd98000}, {0xbbd9a000}, {0xbbd9c000}, {0xbbd9e000}, 
-    {0xbbda0000}, {0xbbda2000}, {0xbbda4000}, {0xbbda6000}, 
-    {0xbbda8000}, {0xbbdaa000}, {0xbbdac000}, {0xbbdae000}, 
-    {0xbbdb0000}, {0xbbdb2000}, {0xbbdb4000}, {0xbbdb6000}, 
-    {0xbbdb8000}, {0xbbdba000}, {0xbbdbc000}, {0xbbdbe000}, 
-    {0xbbdc0000}, {0xbbdc2000}, {0xbbdc4000}, {0xbbdc6000}, 
-    {0xbbdc8000}, {0xbbdca000}, {0xbbdcc000}, {0xbbdce000}, 
-    {0xbbdd0000}, {0xbbdd2000}, {0xbbdd4000}, {0xbbdd6000}, 
-    {0xbbdd8000}, {0xbbdda000}, {0xbbddc000}, {0xbbdde000}, 
-    {0xbbde0000}, {0xbbde2000}, {0xbbde4000}, {0xbbde6000}, 
-    {0xbbde8000}, {0xbbdea000}, {0xbbdec000}, {0xbbdee000}, 
-    {0xbbdf0000}, {0xbbdf2000}, {0xbbdf4000}, {0xbbdf6000}, 
-    {0xbbdf8000}, {0xbbdfa000}, {0xbbdfc000}, {0xbbdfe000}, 
-    {0xbbe00000}, {0xbbe02000}, {0xbbe04000}, {0xbbe06000}, 
-    {0xbbe08000}, {0xbbe0a000}, {0xbbe0c000}, {0xbbe0e000}, 
-    {0xbbe10000}, {0xbbe12000}, {0xbbe14000}, {0xbbe16000}, 
-    {0xbbe18000}, {0xbbe1a000}, {0xbbe1c000}, {0xbbe1e000}, 
-    {0xbbe20000}, {0xbbe22000}, {0xbbe24000}, {0xbbe26000}, 
-    {0xbbe28000}, {0xbbe2a000}, {0xbbe2c000}, {0xbbe2e000}, 
-    {0xbbe30000}, {0xbbe32000}, {0xbbe34000}, {0xbbe36000}, 
-    {0xbbe38000}, {0xbbe3a000}, {0xbbe3c000}, {0xbbe3e000}, 
-    {0xbbe40000}, {0xbbe42000}, {0xbbe44000}, {0xbbe46000}, 
-    {0xbbe48000}, {0xbbe4a000}, {0xbbe4c000}, {0xbbe4e000}, 
-    {0xbbe50000}, {0xbbe52000}, {0xbbe54000}, {0xbbe56000}, 
-    {0xbbe58000}, {0xbbe5a000}, {0xbbe5c000}, {0xbbe5e000}, 
-    {0xbbe60000}, {0xbbe62000}, {0xbbe64000}, {0xbbe66000}, 
-    {0xbbe68000}, {0xbbe6a000}, {0xbbe6c000}, {0xbbe6e000}, 
-    {0xbbe70000}, {0xbbe72000}, {0xbbe74000}, {0xbbe76000}, 
-    {0xbbe78000}, {0xbbe7a000}, {0xbbe7c000}, {0xbbe7e000}, 
-    {0xbbe80000}, {0xbbe82000}, {0xbbe84000}, {0xbbe86000}, 
-    {0xbbe88000}, {0xbbe8a000}, {0xbbe8c000}, {0xbbe8e000}, 
-    {0xbbe90000}, {0xbbe92000}, {0xbbe94000}, {0xbbe96000}, 
-    {0xbbe98000}, {0xbbe9a000}, {0xbbe9c000}, {0xbbe9e000}, 
-    {0xbbea0000}, {0xbbea2000}, {0xbbea4000}, {0xbbea6000}, 
-    {0xbbea8000}, {0xbbeaa000}, {0xbbeac000}, {0xbbeae000}, 
-    {0xbbeb0000}, {0xbbeb2000}, {0xbbeb4000}, {0xbbeb6000}, 
-    {0xbbeb8000}, {0xbbeba000}, {0xbbebc000}, {0xbbebe000}, 
-    {0xbbec0000}, {0xbbec2000}, {0xbbec4000}, {0xbbec6000}, 
-    {0xbbec8000}, {0xbbeca000}, {0xbbecc000}, {0xbbece000}, 
-    {0xbbed0000}, {0xbbed2000}, {0xbbed4000}, {0xbbed6000}, 
-    {0xbbed8000}, {0xbbeda000}, {0xbbedc000}, {0xbbede000}, 
-    {0xbbee0000}, {0xbbee2000}, {0xbbee4000}, {0xbbee6000}, 
-    {0xbbee8000}, {0xbbeea000}, {0xbbeec000}, {0xbbeee000}, 
-    {0xbbef0000}, {0xbbef2000}, {0xbbef4000}, {0xbbef6000}, 
-    {0xbbef8000}, {0xbbefa000}, {0xbbefc000}, {0xbbefe000}, 
-    {0xbbf00000}, {0xbbf02000}, {0xbbf04000}, {0xbbf06000}, 
-    {0xbbf08000}, {0xbbf0a000}, {0xbbf0c000}, {0xbbf0e000}, 
-    {0xbbf10000}, {0xbbf12000}, {0xbbf14000}, {0xbbf16000}, 
-    {0xbbf18000}, {0xbbf1a000}, {0xbbf1c000}, {0xbbf1e000}, 
-    {0xbbf20000}, {0xbbf22000}, {0xbbf24000}, {0xbbf26000}, 
-    {0xbbf28000}, {0xbbf2a000}, {0xbbf2c000}, {0xbbf2e000}, 
-    {0xbbf30000}, {0xbbf32000}, {0xbbf34000}, {0xbbf36000}, 
-    {0xbbf38000}, {0xbbf3a000}, {0xbbf3c000}, {0xbbf3e000}, 
-    {0xbbf40000}, {0xbbf42000}, {0xbbf44000}, {0xbbf46000}, 
-    {0xbbf48000}, {0xbbf4a000}, {0xbbf4c000}, {0xbbf4e000}, 
-    {0xbbf50000}, {0xbbf52000}, {0xbbf54000}, {0xbbf56000}, 
-    {0xbbf58000}, {0xbbf5a000}, {0xbbf5c000}, {0xbbf5e000}, 
-    {0xbbf60000}, {0xbbf62000}, {0xbbf64000}, {0xbbf66000}, 
-    {0xbbf68000}, {0xbbf6a000}, {0xbbf6c000}, {0xbbf6e000}, 
-    {0xbbf70000}, {0xbbf72000}, {0xbbf74000}, {0xbbf76000}, 
-    {0xbbf78000}, {0xbbf7a000}, {0xbbf7c000}, {0xbbf7e000}, 
-    {0xbbf80000}, {0xbbf82000}, {0xbbf84000}, {0xbbf86000}, 
-    {0xbbf88000}, {0xbbf8a000}, {0xbbf8c000}, {0xbbf8e000}, 
-    {0xbbf90000}, {0xbbf92000}, {0xbbf94000}, {0xbbf96000}, 
-    {0xbbf98000}, {0xbbf9a000}, {0xbbf9c000}, {0xbbf9e000}, 
-    {0xbbfa0000}, {0xbbfa2000}, {0xbbfa4000}, {0xbbfa6000}, 
-    {0xbbfa8000}, {0xbbfaa000}, {0xbbfac000}, {0xbbfae000}, 
-    {0xbbfb0000}, {0xbbfb2000}, {0xbbfb4000}, {0xbbfb6000}, 
-    {0xbbfb8000}, {0xbbfba000}, {0xbbfbc000}, {0xbbfbe000}, 
-    {0xbbfc0000}, {0xbbfc2000}, {0xbbfc4000}, {0xbbfc6000}, 
-    {0xbbfc8000}, {0xbbfca000}, {0xbbfcc000}, {0xbbfce000}, 
-    {0xbbfd0000}, {0xbbfd2000}, {0xbbfd4000}, {0xbbfd6000}, 
-    {0xbbfd8000}, {0xbbfda000}, {0xbbfdc000}, {0xbbfde000}, 
-    {0xbbfe0000}, {0xbbfe2000}, {0xbbfe4000}, {0xbbfe6000}, 
-    {0xbbfe8000}, {0xbbfea000}, {0xbbfec000}, {0xbbfee000}, 
-    {0xbbff0000}, {0xbbff2000}, {0xbbff4000}, {0xbbff6000}, 
-    {0xbbff8000}, {0xbbffa000}, {0xbbffc000}, {0xbbffe000}, 
-    {0xbc000000}, {0xbc002000}, {0xbc004000}, {0xbc006000}, 
-    {0xbc008000}, {0xbc00a000}, {0xbc00c000}, {0xbc00e000}, 
-    {0xbc010000}, {0xbc012000}, {0xbc014000}, {0xbc016000}, 
-    {0xbc018000}, {0xbc01a000}, {0xbc01c000}, {0xbc01e000}, 
-    {0xbc020000}, {0xbc022000}, {0xbc024000}, {0xbc026000}, 
-    {0xbc028000}, {0xbc02a000}, {0xbc02c000}, {0xbc02e000}, 
-    {0xbc030000}, {0xbc032000}, {0xbc034000}, {0xbc036000}, 
-    {0xbc038000}, {0xbc03a000}, {0xbc03c000}, {0xbc03e000}, 
-    {0xbc040000}, {0xbc042000}, {0xbc044000}, {0xbc046000}, 
-    {0xbc048000}, {0xbc04a000}, {0xbc04c000}, {0xbc04e000}, 
-    {0xbc050000}, {0xbc052000}, {0xbc054000}, {0xbc056000}, 
-    {0xbc058000}, {0xbc05a000}, {0xbc05c000}, {0xbc05e000}, 
-    {0xbc060000}, {0xbc062000}, {0xbc064000}, {0xbc066000}, 
-    {0xbc068000}, {0xbc06a000}, {0xbc06c000}, {0xbc06e000}, 
-    {0xbc070000}, {0xbc072000}, {0xbc074000}, {0xbc076000}, 
-    {0xbc078000}, {0xbc07a000}, {0xbc07c000}, {0xbc07e000}, 
-    {0xbc080000}, {0xbc082000}, {0xbc084000}, {0xbc086000}, 
-    {0xbc088000}, {0xbc08a000}, {0xbc08c000}, {0xbc08e000}, 
-    {0xbc090000}, {0xbc092000}, {0xbc094000}, {0xbc096000}, 
-    {0xbc098000}, {0xbc09a000}, {0xbc09c000}, {0xbc09e000}, 
-    {0xbc0a0000}, {0xbc0a2000}, {0xbc0a4000}, {0xbc0a6000}, 
-    {0xbc0a8000}, {0xbc0aa000}, {0xbc0ac000}, {0xbc0ae000}, 
-    {0xbc0b0000}, {0xbc0b2000}, {0xbc0b4000}, {0xbc0b6000}, 
-    {0xbc0b8000}, {0xbc0ba000}, {0xbc0bc000}, {0xbc0be000}, 
-    {0xbc0c0000}, {0xbc0c2000}, {0xbc0c4000}, {0xbc0c6000}, 
-    {0xbc0c8000}, {0xbc0ca000}, {0xbc0cc000}, {0xbc0ce000}, 
-    {0xbc0d0000}, {0xbc0d2000}, {0xbc0d4000}, {0xbc0d6000}, 
-    {0xbc0d8000}, {0xbc0da000}, {0xbc0dc000}, {0xbc0de000}, 
-    {0xbc0e0000}, {0xbc0e2000}, {0xbc0e4000}, {0xbc0e6000}, 
-    {0xbc0e8000}, {0xbc0ea000}, {0xbc0ec000}, {0xbc0ee000}, 
-    {0xbc0f0000}, {0xbc0f2000}, {0xbc0f4000}, {0xbc0f6000}, 
-    {0xbc0f8000}, {0xbc0fa000}, {0xbc0fc000}, {0xbc0fe000}, 
-    {0xbc100000}, {0xbc102000}, {0xbc104000}, {0xbc106000}, 
-    {0xbc108000}, {0xbc10a000}, {0xbc10c000}, {0xbc10e000}, 
-    {0xbc110000}, {0xbc112000}, {0xbc114000}, {0xbc116000}, 
-    {0xbc118000}, {0xbc11a000}, {0xbc11c000}, {0xbc11e000}, 
-    {0xbc120000}, {0xbc122000}, {0xbc124000}, {0xbc126000}, 
-    {0xbc128000}, {0xbc12a000}, {0xbc12c000}, {0xbc12e000}, 
-    {0xbc130000}, {0xbc132000}, {0xbc134000}, {0xbc136000}, 
-    {0xbc138000}, {0xbc13a000}, {0xbc13c000}, {0xbc13e000}, 
-    {0xbc140000}, {0xbc142000}, {0xbc144000}, {0xbc146000}, 
-    {0xbc148000}, {0xbc14a000}, {0xbc14c000}, {0xbc14e000}, 
-    {0xbc150000}, {0xbc152000}, {0xbc154000}, {0xbc156000}, 
-    {0xbc158000}, {0xbc15a000}, {0xbc15c000}, {0xbc15e000}, 
-    {0xbc160000}, {0xbc162000}, {0xbc164000}, {0xbc166000}, 
-    {0xbc168000}, {0xbc16a000}, {0xbc16c000}, {0xbc16e000}, 
-    {0xbc170000}, {0xbc172000}, {0xbc174000}, {0xbc176000}, 
-    {0xbc178000}, {0xbc17a000}, {0xbc17c000}, {0xbc17e000}, 
-    {0xbc180000}, {0xbc182000}, {0xbc184000}, {0xbc186000}, 
-    {0xbc188000}, {0xbc18a000}, {0xbc18c000}, {0xbc18e000}, 
-    {0xbc190000}, {0xbc192000}, {0xbc194000}, {0xbc196000}, 
-    {0xbc198000}, {0xbc19a000}, {0xbc19c000}, {0xbc19e000}, 
-    {0xbc1a0000}, {0xbc1a2000}, {0xbc1a4000}, {0xbc1a6000}, 
-    {0xbc1a8000}, {0xbc1aa000}, {0xbc1ac000}, {0xbc1ae000}, 
-    {0xbc1b0000}, {0xbc1b2000}, {0xbc1b4000}, {0xbc1b6000}, 
-    {0xbc1b8000}, {0xbc1ba000}, {0xbc1bc000}, {0xbc1be000}, 
-    {0xbc1c0000}, {0xbc1c2000}, {0xbc1c4000}, {0xbc1c6000}, 
-    {0xbc1c8000}, {0xbc1ca000}, {0xbc1cc000}, {0xbc1ce000}, 
-    {0xbc1d0000}, {0xbc1d2000}, {0xbc1d4000}, {0xbc1d6000}, 
-    {0xbc1d8000}, {0xbc1da000}, {0xbc1dc000}, {0xbc1de000}, 
-    {0xbc1e0000}, {0xbc1e2000}, {0xbc1e4000}, {0xbc1e6000}, 
-    {0xbc1e8000}, {0xbc1ea000}, {0xbc1ec000}, {0xbc1ee000}, 
-    {0xbc1f0000}, {0xbc1f2000}, {0xbc1f4000}, {0xbc1f6000}, 
-    {0xbc1f8000}, {0xbc1fa000}, {0xbc1fc000}, {0xbc1fe000}, 
-    {0xbc200000}, {0xbc202000}, {0xbc204000}, {0xbc206000}, 
-    {0xbc208000}, {0xbc20a000}, {0xbc20c000}, {0xbc20e000}, 
-    {0xbc210000}, {0xbc212000}, {0xbc214000}, {0xbc216000}, 
-    {0xbc218000}, {0xbc21a000}, {0xbc21c000}, {0xbc21e000}, 
-    {0xbc220000}, {0xbc222000}, {0xbc224000}, {0xbc226000}, 
-    {0xbc228000}, {0xbc22a000}, {0xbc22c000}, {0xbc22e000}, 
-    {0xbc230000}, {0xbc232000}, {0xbc234000}, {0xbc236000}, 
-    {0xbc238000}, {0xbc23a000}, {0xbc23c000}, {0xbc23e000}, 
-    {0xbc240000}, {0xbc242000}, {0xbc244000}, {0xbc246000}, 
-    {0xbc248000}, {0xbc24a000}, {0xbc24c000}, {0xbc24e000}, 
-    {0xbc250000}, {0xbc252000}, {0xbc254000}, {0xbc256000}, 
-    {0xbc258000}, {0xbc25a000}, {0xbc25c000}, {0xbc25e000}, 
-    {0xbc260000}, {0xbc262000}, {0xbc264000}, {0xbc266000}, 
-    {0xbc268000}, {0xbc26a000}, {0xbc26c000}, {0xbc26e000}, 
-    {0xbc270000}, {0xbc272000}, {0xbc274000}, {0xbc276000}, 
-    {0xbc278000}, {0xbc27a000}, {0xbc27c000}, {0xbc27e000}, 
-    {0xbc280000}, {0xbc282000}, {0xbc284000}, {0xbc286000}, 
-    {0xbc288000}, {0xbc28a000}, {0xbc28c000}, {0xbc28e000}, 
-    {0xbc290000}, {0xbc292000}, {0xbc294000}, {0xbc296000}, 
-    {0xbc298000}, {0xbc29a000}, {0xbc29c000}, {0xbc29e000}, 
-    {0xbc2a0000}, {0xbc2a2000}, {0xbc2a4000}, {0xbc2a6000}, 
-    {0xbc2a8000}, {0xbc2aa000}, {0xbc2ac000}, {0xbc2ae000}, 
-    {0xbc2b0000}, {0xbc2b2000}, {0xbc2b4000}, {0xbc2b6000}, 
-    {0xbc2b8000}, {0xbc2ba000}, {0xbc2bc000}, {0xbc2be000}, 
-    {0xbc2c0000}, {0xbc2c2000}, {0xbc2c4000}, {0xbc2c6000}, 
-    {0xbc2c8000}, {0xbc2ca000}, {0xbc2cc000}, {0xbc2ce000}, 
-    {0xbc2d0000}, {0xbc2d2000}, {0xbc2d4000}, {0xbc2d6000}, 
-    {0xbc2d8000}, {0xbc2da000}, {0xbc2dc000}, {0xbc2de000}, 
-    {0xbc2e0000}, {0xbc2e2000}, {0xbc2e4000}, {0xbc2e6000}, 
-    {0xbc2e8000}, {0xbc2ea000}, {0xbc2ec000}, {0xbc2ee000}, 
-    {0xbc2f0000}, {0xbc2f2000}, {0xbc2f4000}, {0xbc2f6000}, 
-    {0xbc2f8000}, {0xbc2fa000}, {0xbc2fc000}, {0xbc2fe000}, 
-    {0xbc300000}, {0xbc302000}, {0xbc304000}, {0xbc306000}, 
-    {0xbc308000}, {0xbc30a000}, {0xbc30c000}, {0xbc30e000}, 
-    {0xbc310000}, {0xbc312000}, {0xbc314000}, {0xbc316000}, 
-    {0xbc318000}, {0xbc31a000}, {0xbc31c000}, {0xbc31e000}, 
-    {0xbc320000}, {0xbc322000}, {0xbc324000}, {0xbc326000}, 
-    {0xbc328000}, {0xbc32a000}, {0xbc32c000}, {0xbc32e000}, 
-    {0xbc330000}, {0xbc332000}, {0xbc334000}, {0xbc336000}, 
-    {0xbc338000}, {0xbc33a000}, {0xbc33c000}, {0xbc33e000}, 
-    {0xbc340000}, {0xbc342000}, {0xbc344000}, {0xbc346000}, 
-    {0xbc348000}, {0xbc34a000}, {0xbc34c000}, {0xbc34e000}, 
-    {0xbc350000}, {0xbc352000}, {0xbc354000}, {0xbc356000}, 
-    {0xbc358000}, {0xbc35a000}, {0xbc35c000}, {0xbc35e000}, 
-    {0xbc360000}, {0xbc362000}, {0xbc364000}, {0xbc366000}, 
-    {0xbc368000}, {0xbc36a000}, {0xbc36c000}, {0xbc36e000}, 
-    {0xbc370000}, {0xbc372000}, {0xbc374000}, {0xbc376000}, 
-    {0xbc378000}, {0xbc37a000}, {0xbc37c000}, {0xbc37e000}, 
-    {0xbc380000}, {0xbc382000}, {0xbc384000}, {0xbc386000}, 
-    {0xbc388000}, {0xbc38a000}, {0xbc38c000}, {0xbc38e000}, 
-    {0xbc390000}, {0xbc392000}, {0xbc394000}, {0xbc396000}, 
-    {0xbc398000}, {0xbc39a000}, {0xbc39c000}, {0xbc39e000}, 
-    {0xbc3a0000}, {0xbc3a2000}, {0xbc3a4000}, {0xbc3a6000}, 
-    {0xbc3a8000}, {0xbc3aa000}, {0xbc3ac000}, {0xbc3ae000}, 
-    {0xbc3b0000}, {0xbc3b2000}, {0xbc3b4000}, {0xbc3b6000}, 
-    {0xbc3b8000}, {0xbc3ba000}, {0xbc3bc000}, {0xbc3be000}, 
-    {0xbc3c0000}, {0xbc3c2000}, {0xbc3c4000}, {0xbc3c6000}, 
-    {0xbc3c8000}, {0xbc3ca000}, {0xbc3cc000}, {0xbc3ce000}, 
-    {0xbc3d0000}, {0xbc3d2000}, {0xbc3d4000}, {0xbc3d6000}, 
-    {0xbc3d8000}, {0xbc3da000}, {0xbc3dc000}, {0xbc3de000}, 
-    {0xbc3e0000}, {0xbc3e2000}, {0xbc3e4000}, {0xbc3e6000}, 
-    {0xbc3e8000}, {0xbc3ea000}, {0xbc3ec000}, {0xbc3ee000}, 
-    {0xbc3f0000}, {0xbc3f2000}, {0xbc3f4000}, {0xbc3f6000}, 
-    {0xbc3f8000}, {0xbc3fa000}, {0xbc3fc000}, {0xbc3fe000}, 
-    {0xbc400000}, {0xbc402000}, {0xbc404000}, {0xbc406000}, 
-    {0xbc408000}, {0xbc40a000}, {0xbc40c000}, {0xbc40e000}, 
-    {0xbc410000}, {0xbc412000}, {0xbc414000}, {0xbc416000}, 
-    {0xbc418000}, {0xbc41a000}, {0xbc41c000}, {0xbc41e000}, 
-    {0xbc420000}, {0xbc422000}, {0xbc424000}, {0xbc426000}, 
-    {0xbc428000}, {0xbc42a000}, {0xbc42c000}, {0xbc42e000}, 
-    {0xbc430000}, {0xbc432000}, {0xbc434000}, {0xbc436000}, 
-    {0xbc438000}, {0xbc43a000}, {0xbc43c000}, {0xbc43e000}, 
-    {0xbc440000}, {0xbc442000}, {0xbc444000}, {0xbc446000}, 
-    {0xbc448000}, {0xbc44a000}, {0xbc44c000}, {0xbc44e000}, 
-    {0xbc450000}, {0xbc452000}, {0xbc454000}, {0xbc456000}, 
-    {0xbc458000}, {0xbc45a000}, {0xbc45c000}, {0xbc45e000}, 
-    {0xbc460000}, {0xbc462000}, {0xbc464000}, {0xbc466000}, 
-    {0xbc468000}, {0xbc46a000}, {0xbc46c000}, {0xbc46e000}, 
-    {0xbc470000}, {0xbc472000}, {0xbc474000}, {0xbc476000}, 
-    {0xbc478000}, {0xbc47a000}, {0xbc47c000}, {0xbc47e000}, 
-    {0xbc480000}, {0xbc482000}, {0xbc484000}, {0xbc486000}, 
-    {0xbc488000}, {0xbc48a000}, {0xbc48c000}, {0xbc48e000}, 
-    {0xbc490000}, {0xbc492000}, {0xbc494000}, {0xbc496000}, 
-    {0xbc498000}, {0xbc49a000}, {0xbc49c000}, {0xbc49e000}, 
-    {0xbc4a0000}, {0xbc4a2000}, {0xbc4a4000}, {0xbc4a6000}, 
-    {0xbc4a8000}, {0xbc4aa000}, {0xbc4ac000}, {0xbc4ae000}, 
-    {0xbc4b0000}, {0xbc4b2000}, {0xbc4b4000}, {0xbc4b6000}, 
-    {0xbc4b8000}, {0xbc4ba000}, {0xbc4bc000}, {0xbc4be000}, 
-    {0xbc4c0000}, {0xbc4c2000}, {0xbc4c4000}, {0xbc4c6000}, 
-    {0xbc4c8000}, {0xbc4ca000}, {0xbc4cc000}, {0xbc4ce000}, 
-    {0xbc4d0000}, {0xbc4d2000}, {0xbc4d4000}, {0xbc4d6000}, 
-    {0xbc4d8000}, {0xbc4da000}, {0xbc4dc000}, {0xbc4de000}, 
-    {0xbc4e0000}, {0xbc4e2000}, {0xbc4e4000}, {0xbc4e6000}, 
-    {0xbc4e8000}, {0xbc4ea000}, {0xbc4ec000}, {0xbc4ee000}, 
-    {0xbc4f0000}, {0xbc4f2000}, {0xbc4f4000}, {0xbc4f6000}, 
-    {0xbc4f8000}, {0xbc4fa000}, {0xbc4fc000}, {0xbc4fe000}, 
-    {0xbc500000}, {0xbc502000}, {0xbc504000}, {0xbc506000}, 
-    {0xbc508000}, {0xbc50a000}, {0xbc50c000}, {0xbc50e000}, 
-    {0xbc510000}, {0xbc512000}, {0xbc514000}, {0xbc516000}, 
-    {0xbc518000}, {0xbc51a000}, {0xbc51c000}, {0xbc51e000}, 
-    {0xbc520000}, {0xbc522000}, {0xbc524000}, {0xbc526000}, 
-    {0xbc528000}, {0xbc52a000}, {0xbc52c000}, {0xbc52e000}, 
-    {0xbc530000}, {0xbc532000}, {0xbc534000}, {0xbc536000}, 
-    {0xbc538000}, {0xbc53a000}, {0xbc53c000}, {0xbc53e000}, 
-    {0xbc540000}, {0xbc542000}, {0xbc544000}, {0xbc546000}, 
-    {0xbc548000}, {0xbc54a000}, {0xbc54c000}, {0xbc54e000}, 
-    {0xbc550000}, {0xbc552000}, {0xbc554000}, {0xbc556000}, 
-    {0xbc558000}, {0xbc55a000}, {0xbc55c000}, {0xbc55e000}, 
-    {0xbc560000}, {0xbc562000}, {0xbc564000}, {0xbc566000}, 
-    {0xbc568000}, {0xbc56a000}, {0xbc56c000}, {0xbc56e000}, 
-    {0xbc570000}, {0xbc572000}, {0xbc574000}, {0xbc576000}, 
-    {0xbc578000}, {0xbc57a000}, {0xbc57c000}, {0xbc57e000}, 
-    {0xbc580000}, {0xbc582000}, {0xbc584000}, {0xbc586000}, 
-    {0xbc588000}, {0xbc58a000}, {0xbc58c000}, {0xbc58e000}, 
-    {0xbc590000}, {0xbc592000}, {0xbc594000}, {0xbc596000}, 
-    {0xbc598000}, {0xbc59a000}, {0xbc59c000}, {0xbc59e000}, 
-    {0xbc5a0000}, {0xbc5a2000}, {0xbc5a4000}, {0xbc5a6000}, 
-    {0xbc5a8000}, {0xbc5aa000}, {0xbc5ac000}, {0xbc5ae000}, 
-    {0xbc5b0000}, {0xbc5b2000}, {0xbc5b4000}, {0xbc5b6000}, 
-    {0xbc5b8000}, {0xbc5ba000}, {0xbc5bc000}, {0xbc5be000}, 
-    {0xbc5c0000}, {0xbc5c2000}, {0xbc5c4000}, {0xbc5c6000}, 
-    {0xbc5c8000}, {0xbc5ca000}, {0xbc5cc000}, {0xbc5ce000}, 
-    {0xbc5d0000}, {0xbc5d2000}, {0xbc5d4000}, {0xbc5d6000}, 
-    {0xbc5d8000}, {0xbc5da000}, {0xbc5dc000}, {0xbc5de000}, 
-    {0xbc5e0000}, {0xbc5e2000}, {0xbc5e4000}, {0xbc5e6000}, 
-    {0xbc5e8000}, {0xbc5ea000}, {0xbc5ec000}, {0xbc5ee000}, 
-    {0xbc5f0000}, {0xbc5f2000}, {0xbc5f4000}, {0xbc5f6000}, 
-    {0xbc5f8000}, {0xbc5fa000}, {0xbc5fc000}, {0xbc5fe000}, 
-    {0xbc600000}, {0xbc602000}, {0xbc604000}, {0xbc606000}, 
-    {0xbc608000}, {0xbc60a000}, {0xbc60c000}, {0xbc60e000}, 
-    {0xbc610000}, {0xbc612000}, {0xbc614000}, {0xbc616000}, 
-    {0xbc618000}, {0xbc61a000}, {0xbc61c000}, {0xbc61e000}, 
-    {0xbc620000}, {0xbc622000}, {0xbc624000}, {0xbc626000}, 
-    {0xbc628000}, {0xbc62a000}, {0xbc62c000}, {0xbc62e000}, 
-    {0xbc630000}, {0xbc632000}, {0xbc634000}, {0xbc636000}, 
-    {0xbc638000}, {0xbc63a000}, {0xbc63c000}, {0xbc63e000}, 
-    {0xbc640000}, {0xbc642000}, {0xbc644000}, {0xbc646000}, 
-    {0xbc648000}, {0xbc64a000}, {0xbc64c000}, {0xbc64e000}, 
-    {0xbc650000}, {0xbc652000}, {0xbc654000}, {0xbc656000}, 
-    {0xbc658000}, {0xbc65a000}, {0xbc65c000}, {0xbc65e000}, 
-    {0xbc660000}, {0xbc662000}, {0xbc664000}, {0xbc666000}, 
-    {0xbc668000}, {0xbc66a000}, {0xbc66c000}, {0xbc66e000}, 
-    {0xbc670000}, {0xbc672000}, {0xbc674000}, {0xbc676000}, 
-    {0xbc678000}, {0xbc67a000}, {0xbc67c000}, {0xbc67e000}, 
-    {0xbc680000}, {0xbc682000}, {0xbc684000}, {0xbc686000}, 
-    {0xbc688000}, {0xbc68a000}, {0xbc68c000}, {0xbc68e000}, 
-    {0xbc690000}, {0xbc692000}, {0xbc694000}, {0xbc696000}, 
-    {0xbc698000}, {0xbc69a000}, {0xbc69c000}, {0xbc69e000}, 
-    {0xbc6a0000}, {0xbc6a2000}, {0xbc6a4000}, {0xbc6a6000}, 
-    {0xbc6a8000}, {0xbc6aa000}, {0xbc6ac000}, {0xbc6ae000}, 
-    {0xbc6b0000}, {0xbc6b2000}, {0xbc6b4000}, {0xbc6b6000}, 
-    {0xbc6b8000}, {0xbc6ba000}, {0xbc6bc000}, {0xbc6be000}, 
-    {0xbc6c0000}, {0xbc6c2000}, {0xbc6c4000}, {0xbc6c6000}, 
-    {0xbc6c8000}, {0xbc6ca000}, {0xbc6cc000}, {0xbc6ce000}, 
-    {0xbc6d0000}, {0xbc6d2000}, {0xbc6d4000}, {0xbc6d6000}, 
-    {0xbc6d8000}, {0xbc6da000}, {0xbc6dc000}, {0xbc6de000}, 
-    {0xbc6e0000}, {0xbc6e2000}, {0xbc6e4000}, {0xbc6e6000}, 
-    {0xbc6e8000}, {0xbc6ea000}, {0xbc6ec000}, {0xbc6ee000}, 
-    {0xbc6f0000}, {0xbc6f2000}, {0xbc6f4000}, {0xbc6f6000}, 
-    {0xbc6f8000}, {0xbc6fa000}, {0xbc6fc000}, {0xbc6fe000}, 
-    {0xbc700000}, {0xbc702000}, {0xbc704000}, {0xbc706000}, 
-    {0xbc708000}, {0xbc70a000}, {0xbc70c000}, {0xbc70e000}, 
-    {0xbc710000}, {0xbc712000}, {0xbc714000}, {0xbc716000}, 
-    {0xbc718000}, {0xbc71a000}, {0xbc71c000}, {0xbc71e000}, 
-    {0xbc720000}, {0xbc722000}, {0xbc724000}, {0xbc726000}, 
-    {0xbc728000}, {0xbc72a000}, {0xbc72c000}, {0xbc72e000}, 
-    {0xbc730000}, {0xbc732000}, {0xbc734000}, {0xbc736000}, 
-    {0xbc738000}, {0xbc73a000}, {0xbc73c000}, {0xbc73e000}, 
-    {0xbc740000}, {0xbc742000}, {0xbc744000}, {0xbc746000}, 
-    {0xbc748000}, {0xbc74a000}, {0xbc74c000}, {0xbc74e000}, 
-    {0xbc750000}, {0xbc752000}, {0xbc754000}, {0xbc756000}, 
-    {0xbc758000}, {0xbc75a000}, {0xbc75c000}, {0xbc75e000}, 
-    {0xbc760000}, {0xbc762000}, {0xbc764000}, {0xbc766000}, 
-    {0xbc768000}, {0xbc76a000}, {0xbc76c000}, {0xbc76e000}, 
-    {0xbc770000}, {0xbc772000}, {0xbc774000}, {0xbc776000}, 
-    {0xbc778000}, {0xbc77a000}, {0xbc77c000}, {0xbc77e000}, 
-    {0xbc780000}, {0xbc782000}, {0xbc784000}, {0xbc786000}, 
-    {0xbc788000}, {0xbc78a000}, {0xbc78c000}, {0xbc78e000}, 
-    {0xbc790000}, {0xbc792000}, {0xbc794000}, {0xbc796000}, 
-    {0xbc798000}, {0xbc79a000}, {0xbc79c000}, {0xbc79e000}, 
-    {0xbc7a0000}, {0xbc7a2000}, {0xbc7a4000}, {0xbc7a6000}, 
-    {0xbc7a8000}, {0xbc7aa000}, {0xbc7ac000}, {0xbc7ae000}, 
-    {0xbc7b0000}, {0xbc7b2000}, {0xbc7b4000}, {0xbc7b6000}, 
-    {0xbc7b8000}, {0xbc7ba000}, {0xbc7bc000}, {0xbc7be000}, 
-    {0xbc7c0000}, {0xbc7c2000}, {0xbc7c4000}, {0xbc7c6000}, 
-    {0xbc7c8000}, {0xbc7ca000}, {0xbc7cc000}, {0xbc7ce000}, 
-    {0xbc7d0000}, {0xbc7d2000}, {0xbc7d4000}, {0xbc7d6000}, 
-    {0xbc7d8000}, {0xbc7da000}, {0xbc7dc000}, {0xbc7de000}, 
-    {0xbc7e0000}, {0xbc7e2000}, {0xbc7e4000}, {0xbc7e6000}, 
-    {0xbc7e8000}, {0xbc7ea000}, {0xbc7ec000}, {0xbc7ee000}, 
-    {0xbc7f0000}, {0xbc7f2000}, {0xbc7f4000}, {0xbc7f6000}, 
-    {0xbc7f8000}, {0xbc7fa000}, {0xbc7fc000}, {0xbc7fe000}, 
-    {0xbc800000}, {0xbc802000}, {0xbc804000}, {0xbc806000}, 
-    {0xbc808000}, {0xbc80a000}, {0xbc80c000}, {0xbc80e000}, 
-    {0xbc810000}, {0xbc812000}, {0xbc814000}, {0xbc816000}, 
-    {0xbc818000}, {0xbc81a000}, {0xbc81c000}, {0xbc81e000}, 
-    {0xbc820000}, {0xbc822000}, {0xbc824000}, {0xbc826000}, 
-    {0xbc828000}, {0xbc82a000}, {0xbc82c000}, {0xbc82e000}, 
-    {0xbc830000}, {0xbc832000}, {0xbc834000}, {0xbc836000}, 
-    {0xbc838000}, {0xbc83a000}, {0xbc83c000}, {0xbc83e000}, 
-    {0xbc840000}, {0xbc842000}, {0xbc844000}, {0xbc846000}, 
-    {0xbc848000}, {0xbc84a000}, {0xbc84c000}, {0xbc84e000}, 
-    {0xbc850000}, {0xbc852000}, {0xbc854000}, {0xbc856000}, 
-    {0xbc858000}, {0xbc85a000}, {0xbc85c000}, {0xbc85e000}, 
-    {0xbc860000}, {0xbc862000}, {0xbc864000}, {0xbc866000}, 
-    {0xbc868000}, {0xbc86a000}, {0xbc86c000}, {0xbc86e000}, 
-    {0xbc870000}, {0xbc872000}, {0xbc874000}, {0xbc876000}, 
-    {0xbc878000}, {0xbc87a000}, {0xbc87c000}, {0xbc87e000}, 
-    {0xbc880000}, {0xbc882000}, {0xbc884000}, {0xbc886000}, 
-    {0xbc888000}, {0xbc88a000}, {0xbc88c000}, {0xbc88e000}, 
-    {0xbc890000}, {0xbc892000}, {0xbc894000}, {0xbc896000}, 
-    {0xbc898000}, {0xbc89a000}, {0xbc89c000}, {0xbc89e000}, 
-    {0xbc8a0000}, {0xbc8a2000}, {0xbc8a4000}, {0xbc8a6000}, 
-    {0xbc8a8000}, {0xbc8aa000}, {0xbc8ac000}, {0xbc8ae000}, 
-    {0xbc8b0000}, {0xbc8b2000}, {0xbc8b4000}, {0xbc8b6000}, 
-    {0xbc8b8000}, {0xbc8ba000}, {0xbc8bc000}, {0xbc8be000}, 
-    {0xbc8c0000}, {0xbc8c2000}, {0xbc8c4000}, {0xbc8c6000}, 
-    {0xbc8c8000}, {0xbc8ca000}, {0xbc8cc000}, {0xbc8ce000}, 
-    {0xbc8d0000}, {0xbc8d2000}, {0xbc8d4000}, {0xbc8d6000}, 
-    {0xbc8d8000}, {0xbc8da000}, {0xbc8dc000}, {0xbc8de000}, 
-    {0xbc8e0000}, {0xbc8e2000}, {0xbc8e4000}, {0xbc8e6000}, 
-    {0xbc8e8000}, {0xbc8ea000}, {0xbc8ec000}, {0xbc8ee000}, 
-    {0xbc8f0000}, {0xbc8f2000}, {0xbc8f4000}, {0xbc8f6000}, 
-    {0xbc8f8000}, {0xbc8fa000}, {0xbc8fc000}, {0xbc8fe000}, 
-    {0xbc900000}, {0xbc902000}, {0xbc904000}, {0xbc906000}, 
-    {0xbc908000}, {0xbc90a000}, {0xbc90c000}, {0xbc90e000}, 
-    {0xbc910000}, {0xbc912000}, {0xbc914000}, {0xbc916000}, 
-    {0xbc918000}, {0xbc91a000}, {0xbc91c000}, {0xbc91e000}, 
-    {0xbc920000}, {0xbc922000}, {0xbc924000}, {0xbc926000}, 
-    {0xbc928000}, {0xbc92a000}, {0xbc92c000}, {0xbc92e000}, 
-    {0xbc930000}, {0xbc932000}, {0xbc934000}, {0xbc936000}, 
-    {0xbc938000}, {0xbc93a000}, {0xbc93c000}, {0xbc93e000}, 
-    {0xbc940000}, {0xbc942000}, {0xbc944000}, {0xbc946000}, 
-    {0xbc948000}, {0xbc94a000}, {0xbc94c000}, {0xbc94e000}, 
-    {0xbc950000}, {0xbc952000}, {0xbc954000}, {0xbc956000}, 
-    {0xbc958000}, {0xbc95a000}, {0xbc95c000}, {0xbc95e000}, 
-    {0xbc960000}, {0xbc962000}, {0xbc964000}, {0xbc966000}, 
-    {0xbc968000}, {0xbc96a000}, {0xbc96c000}, {0xbc96e000}, 
-    {0xbc970000}, {0xbc972000}, {0xbc974000}, {0xbc976000}, 
-    {0xbc978000}, {0xbc97a000}, {0xbc97c000}, {0xbc97e000}, 
-    {0xbc980000}, {0xbc982000}, {0xbc984000}, {0xbc986000}, 
-    {0xbc988000}, {0xbc98a000}, {0xbc98c000}, {0xbc98e000}, 
-    {0xbc990000}, {0xbc992000}, {0xbc994000}, {0xbc996000}, 
-    {0xbc998000}, {0xbc99a000}, {0xbc99c000}, {0xbc99e000}, 
-    {0xbc9a0000}, {0xbc9a2000}, {0xbc9a4000}, {0xbc9a6000}, 
-    {0xbc9a8000}, {0xbc9aa000}, {0xbc9ac000}, {0xbc9ae000}, 
-    {0xbc9b0000}, {0xbc9b2000}, {0xbc9b4000}, {0xbc9b6000}, 
-    {0xbc9b8000}, {0xbc9ba000}, {0xbc9bc000}, {0xbc9be000}, 
-    {0xbc9c0000}, {0xbc9c2000}, {0xbc9c4000}, {0xbc9c6000}, 
-    {0xbc9c8000}, {0xbc9ca000}, {0xbc9cc000}, {0xbc9ce000}, 
-    {0xbc9d0000}, {0xbc9d2000}, {0xbc9d4000}, {0xbc9d6000}, 
-    {0xbc9d8000}, {0xbc9da000}, {0xbc9dc000}, {0xbc9de000}, 
-    {0xbc9e0000}, {0xbc9e2000}, {0xbc9e4000}, {0xbc9e6000}, 
-    {0xbc9e8000}, {0xbc9ea000}, {0xbc9ec000}, {0xbc9ee000}, 
-    {0xbc9f0000}, {0xbc9f2000}, {0xbc9f4000}, {0xbc9f6000}, 
-    {0xbc9f8000}, {0xbc9fa000}, {0xbc9fc000}, {0xbc9fe000}, 
-    {0xbca00000}, {0xbca02000}, {0xbca04000}, {0xbca06000}, 
-    {0xbca08000}, {0xbca0a000}, {0xbca0c000}, {0xbca0e000}, 
-    {0xbca10000}, {0xbca12000}, {0xbca14000}, {0xbca16000}, 
-    {0xbca18000}, {0xbca1a000}, {0xbca1c000}, {0xbca1e000}, 
-    {0xbca20000}, {0xbca22000}, {0xbca24000}, {0xbca26000}, 
-    {0xbca28000}, {0xbca2a000}, {0xbca2c000}, {0xbca2e000}, 
-    {0xbca30000}, {0xbca32000}, {0xbca34000}, {0xbca36000}, 
-    {0xbca38000}, {0xbca3a000}, {0xbca3c000}, {0xbca3e000}, 
-    {0xbca40000}, {0xbca42000}, {0xbca44000}, {0xbca46000}, 
-    {0xbca48000}, {0xbca4a000}, {0xbca4c000}, {0xbca4e000}, 
-    {0xbca50000}, {0xbca52000}, {0xbca54000}, {0xbca56000}, 
-    {0xbca58000}, {0xbca5a000}, {0xbca5c000}, {0xbca5e000}, 
-    {0xbca60000}, {0xbca62000}, {0xbca64000}, {0xbca66000}, 
-    {0xbca68000}, {0xbca6a000}, {0xbca6c000}, {0xbca6e000}, 
-    {0xbca70000}, {0xbca72000}, {0xbca74000}, {0xbca76000}, 
-    {0xbca78000}, {0xbca7a000}, {0xbca7c000}, {0xbca7e000}, 
-    {0xbca80000}, {0xbca82000}, {0xbca84000}, {0xbca86000}, 
-    {0xbca88000}, {0xbca8a000}, {0xbca8c000}, {0xbca8e000}, 
-    {0xbca90000}, {0xbca92000}, {0xbca94000}, {0xbca96000}, 
-    {0xbca98000}, {0xbca9a000}, {0xbca9c000}, {0xbca9e000}, 
-    {0xbcaa0000}, {0xbcaa2000}, {0xbcaa4000}, {0xbcaa6000}, 
-    {0xbcaa8000}, {0xbcaaa000}, {0xbcaac000}, {0xbcaae000}, 
-    {0xbcab0000}, {0xbcab2000}, {0xbcab4000}, {0xbcab6000}, 
-    {0xbcab8000}, {0xbcaba000}, {0xbcabc000}, {0xbcabe000}, 
-    {0xbcac0000}, {0xbcac2000}, {0xbcac4000}, {0xbcac6000}, 
-    {0xbcac8000}, {0xbcaca000}, {0xbcacc000}, {0xbcace000}, 
-    {0xbcad0000}, {0xbcad2000}, {0xbcad4000}, {0xbcad6000}, 
-    {0xbcad8000}, {0xbcada000}, {0xbcadc000}, {0xbcade000}, 
-    {0xbcae0000}, {0xbcae2000}, {0xbcae4000}, {0xbcae6000}, 
-    {0xbcae8000}, {0xbcaea000}, {0xbcaec000}, {0xbcaee000}, 
-    {0xbcaf0000}, {0xbcaf2000}, {0xbcaf4000}, {0xbcaf6000}, 
-    {0xbcaf8000}, {0xbcafa000}, {0xbcafc000}, {0xbcafe000}, 
-    {0xbcb00000}, {0xbcb02000}, {0xbcb04000}, {0xbcb06000}, 
-    {0xbcb08000}, {0xbcb0a000}, {0xbcb0c000}, {0xbcb0e000}, 
-    {0xbcb10000}, {0xbcb12000}, {0xbcb14000}, {0xbcb16000}, 
-    {0xbcb18000}, {0xbcb1a000}, {0xbcb1c000}, {0xbcb1e000}, 
-    {0xbcb20000}, {0xbcb22000}, {0xbcb24000}, {0xbcb26000}, 
-    {0xbcb28000}, {0xbcb2a000}, {0xbcb2c000}, {0xbcb2e000}, 
-    {0xbcb30000}, {0xbcb32000}, {0xbcb34000}, {0xbcb36000}, 
-    {0xbcb38000}, {0xbcb3a000}, {0xbcb3c000}, {0xbcb3e000}, 
-    {0xbcb40000}, {0xbcb42000}, {0xbcb44000}, {0xbcb46000}, 
-    {0xbcb48000}, {0xbcb4a000}, {0xbcb4c000}, {0xbcb4e000}, 
-    {0xbcb50000}, {0xbcb52000}, {0xbcb54000}, {0xbcb56000}, 
-    {0xbcb58000}, {0xbcb5a000}, {0xbcb5c000}, {0xbcb5e000}, 
-    {0xbcb60000}, {0xbcb62000}, {0xbcb64000}, {0xbcb66000}, 
-    {0xbcb68000}, {0xbcb6a000}, {0xbcb6c000}, {0xbcb6e000}, 
-    {0xbcb70000}, {0xbcb72000}, {0xbcb74000}, {0xbcb76000}, 
-    {0xbcb78000}, {0xbcb7a000}, {0xbcb7c000}, {0xbcb7e000}, 
-    {0xbcb80000}, {0xbcb82000}, {0xbcb84000}, {0xbcb86000}, 
-    {0xbcb88000}, {0xbcb8a000}, {0xbcb8c000}, {0xbcb8e000}, 
-    {0xbcb90000}, {0xbcb92000}, {0xbcb94000}, {0xbcb96000}, 
-    {0xbcb98000}, {0xbcb9a000}, {0xbcb9c000}, {0xbcb9e000}, 
-    {0xbcba0000}, {0xbcba2000}, {0xbcba4000}, {0xbcba6000}, 
-    {0xbcba8000}, {0xbcbaa000}, {0xbcbac000}, {0xbcbae000}, 
-    {0xbcbb0000}, {0xbcbb2000}, {0xbcbb4000}, {0xbcbb6000}, 
-    {0xbcbb8000}, {0xbcbba000}, {0xbcbbc000}, {0xbcbbe000}, 
-    {0xbcbc0000}, {0xbcbc2000}, {0xbcbc4000}, {0xbcbc6000}, 
-    {0xbcbc8000}, {0xbcbca000}, {0xbcbcc000}, {0xbcbce000}, 
-    {0xbcbd0000}, {0xbcbd2000}, {0xbcbd4000}, {0xbcbd6000}, 
-    {0xbcbd8000}, {0xbcbda000}, {0xbcbdc000}, {0xbcbde000}, 
-    {0xbcbe0000}, {0xbcbe2000}, {0xbcbe4000}, {0xbcbe6000}, 
-    {0xbcbe8000}, {0xbcbea000}, {0xbcbec000}, {0xbcbee000}, 
-    {0xbcbf0000}, {0xbcbf2000}, {0xbcbf4000}, {0xbcbf6000}, 
-    {0xbcbf8000}, {0xbcbfa000}, {0xbcbfc000}, {0xbcbfe000}, 
-    {0xbcc00000}, {0xbcc02000}, {0xbcc04000}, {0xbcc06000}, 
-    {0xbcc08000}, {0xbcc0a000}, {0xbcc0c000}, {0xbcc0e000}, 
-    {0xbcc10000}, {0xbcc12000}, {0xbcc14000}, {0xbcc16000}, 
-    {0xbcc18000}, {0xbcc1a000}, {0xbcc1c000}, {0xbcc1e000}, 
-    {0xbcc20000}, {0xbcc22000}, {0xbcc24000}, {0xbcc26000}, 
-    {0xbcc28000}, {0xbcc2a000}, {0xbcc2c000}, {0xbcc2e000}, 
-    {0xbcc30000}, {0xbcc32000}, {0xbcc34000}, {0xbcc36000}, 
-    {0xbcc38000}, {0xbcc3a000}, {0xbcc3c000}, {0xbcc3e000}, 
-    {0xbcc40000}, {0xbcc42000}, {0xbcc44000}, {0xbcc46000}, 
-    {0xbcc48000}, {0xbcc4a000}, {0xbcc4c000}, {0xbcc4e000}, 
-    {0xbcc50000}, {0xbcc52000}, {0xbcc54000}, {0xbcc56000}, 
-    {0xbcc58000}, {0xbcc5a000}, {0xbcc5c000}, {0xbcc5e000}, 
-    {0xbcc60000}, {0xbcc62000}, {0xbcc64000}, {0xbcc66000}, 
-    {0xbcc68000}, {0xbcc6a000}, {0xbcc6c000}, {0xbcc6e000}, 
-    {0xbcc70000}, {0xbcc72000}, {0xbcc74000}, {0xbcc76000}, 
-    {0xbcc78000}, {0xbcc7a000}, {0xbcc7c000}, {0xbcc7e000}, 
-    {0xbcc80000}, {0xbcc82000}, {0xbcc84000}, {0xbcc86000}, 
-    {0xbcc88000}, {0xbcc8a000}, {0xbcc8c000}, {0xbcc8e000}, 
-    {0xbcc90000}, {0xbcc92000}, {0xbcc94000}, {0xbcc96000}, 
-    {0xbcc98000}, {0xbcc9a000}, {0xbcc9c000}, {0xbcc9e000}, 
-    {0xbcca0000}, {0xbcca2000}, {0xbcca4000}, {0xbcca6000}, 
-    {0xbcca8000}, {0xbccaa000}, {0xbccac000}, {0xbccae000}, 
-    {0xbccb0000}, {0xbccb2000}, {0xbccb4000}, {0xbccb6000}, 
-    {0xbccb8000}, {0xbccba000}, {0xbccbc000}, {0xbccbe000}, 
-    {0xbccc0000}, {0xbccc2000}, {0xbccc4000}, {0xbccc6000}, 
-    {0xbccc8000}, {0xbccca000}, {0xbcccc000}, {0xbccce000}, 
-    {0xbccd0000}, {0xbccd2000}, {0xbccd4000}, {0xbccd6000}, 
-    {0xbccd8000}, {0xbccda000}, {0xbccdc000}, {0xbccde000}, 
-    {0xbcce0000}, {0xbcce2000}, {0xbcce4000}, {0xbcce6000}, 
-    {0xbcce8000}, {0xbccea000}, {0xbccec000}, {0xbccee000}, 
-    {0xbccf0000}, {0xbccf2000}, {0xbccf4000}, {0xbccf6000}, 
-    {0xbccf8000}, {0xbccfa000}, {0xbccfc000}, {0xbccfe000}, 
-    {0xbcd00000}, {0xbcd02000}, {0xbcd04000}, {0xbcd06000}, 
-    {0xbcd08000}, {0xbcd0a000}, {0xbcd0c000}, {0xbcd0e000}, 
-    {0xbcd10000}, {0xbcd12000}, {0xbcd14000}, {0xbcd16000}, 
-    {0xbcd18000}, {0xbcd1a000}, {0xbcd1c000}, {0xbcd1e000}, 
-    {0xbcd20000}, {0xbcd22000}, {0xbcd24000}, {0xbcd26000}, 
-    {0xbcd28000}, {0xbcd2a000}, {0xbcd2c000}, {0xbcd2e000}, 
-    {0xbcd30000}, {0xbcd32000}, {0xbcd34000}, {0xbcd36000}, 
-    {0xbcd38000}, {0xbcd3a000}, {0xbcd3c000}, {0xbcd3e000}, 
-    {0xbcd40000}, {0xbcd42000}, {0xbcd44000}, {0xbcd46000}, 
-    {0xbcd48000}, {0xbcd4a000}, {0xbcd4c000}, {0xbcd4e000}, 
-    {0xbcd50000}, {0xbcd52000}, {0xbcd54000}, {0xbcd56000}, 
-    {0xbcd58000}, {0xbcd5a000}, {0xbcd5c000}, {0xbcd5e000}, 
-    {0xbcd60000}, {0xbcd62000}, {0xbcd64000}, {0xbcd66000}, 
-    {0xbcd68000}, {0xbcd6a000}, {0xbcd6c000}, {0xbcd6e000}, 
-    {0xbcd70000}, {0xbcd72000}, {0xbcd74000}, {0xbcd76000}, 
-    {0xbcd78000}, {0xbcd7a000}, {0xbcd7c000}, {0xbcd7e000}, 
-    {0xbcd80000}, {0xbcd82000}, {0xbcd84000}, {0xbcd86000}, 
-    {0xbcd88000}, {0xbcd8a000}, {0xbcd8c000}, {0xbcd8e000}, 
-    {0xbcd90000}, {0xbcd92000}, {0xbcd94000}, {0xbcd96000}, 
-    {0xbcd98000}, {0xbcd9a000}, {0xbcd9c000}, {0xbcd9e000}, 
-    {0xbcda0000}, {0xbcda2000}, {0xbcda4000}, {0xbcda6000}, 
-    {0xbcda8000}, {0xbcdaa000}, {0xbcdac000}, {0xbcdae000}, 
-    {0xbcdb0000}, {0xbcdb2000}, {0xbcdb4000}, {0xbcdb6000}, 
-    {0xbcdb8000}, {0xbcdba000}, {0xbcdbc000}, {0xbcdbe000}, 
-    {0xbcdc0000}, {0xbcdc2000}, {0xbcdc4000}, {0xbcdc6000}, 
-    {0xbcdc8000}, {0xbcdca000}, {0xbcdcc000}, {0xbcdce000}, 
-    {0xbcdd0000}, {0xbcdd2000}, {0xbcdd4000}, {0xbcdd6000}, 
-    {0xbcdd8000}, {0xbcdda000}, {0xbcddc000}, {0xbcdde000}, 
-    {0xbcde0000}, {0xbcde2000}, {0xbcde4000}, {0xbcde6000}, 
-    {0xbcde8000}, {0xbcdea000}, {0xbcdec000}, {0xbcdee000}, 
-    {0xbcdf0000}, {0xbcdf2000}, {0xbcdf4000}, {0xbcdf6000}, 
-    {0xbcdf8000}, {0xbcdfa000}, {0xbcdfc000}, {0xbcdfe000}, 
-    {0xbce00000}, {0xbce02000}, {0xbce04000}, {0xbce06000}, 
-    {0xbce08000}, {0xbce0a000}, {0xbce0c000}, {0xbce0e000}, 
-    {0xbce10000}, {0xbce12000}, {0xbce14000}, {0xbce16000}, 
-    {0xbce18000}, {0xbce1a000}, {0xbce1c000}, {0xbce1e000}, 
-    {0xbce20000}, {0xbce22000}, {0xbce24000}, {0xbce26000}, 
-    {0xbce28000}, {0xbce2a000}, {0xbce2c000}, {0xbce2e000}, 
-    {0xbce30000}, {0xbce32000}, {0xbce34000}, {0xbce36000}, 
-    {0xbce38000}, {0xbce3a000}, {0xbce3c000}, {0xbce3e000}, 
-    {0xbce40000}, {0xbce42000}, {0xbce44000}, {0xbce46000}, 
-    {0xbce48000}, {0xbce4a000}, {0xbce4c000}, {0xbce4e000}, 
-    {0xbce50000}, {0xbce52000}, {0xbce54000}, {0xbce56000}, 
-    {0xbce58000}, {0xbce5a000}, {0xbce5c000}, {0xbce5e000}, 
-    {0xbce60000}, {0xbce62000}, {0xbce64000}, {0xbce66000}, 
-    {0xbce68000}, {0xbce6a000}, {0xbce6c000}, {0xbce6e000}, 
-    {0xbce70000}, {0xbce72000}, {0xbce74000}, {0xbce76000}, 
-    {0xbce78000}, {0xbce7a000}, {0xbce7c000}, {0xbce7e000}, 
-    {0xbce80000}, {0xbce82000}, {0xbce84000}, {0xbce86000}, 
-    {0xbce88000}, {0xbce8a000}, {0xbce8c000}, {0xbce8e000}, 
-    {0xbce90000}, {0xbce92000}, {0xbce94000}, {0xbce96000}, 
-    {0xbce98000}, {0xbce9a000}, {0xbce9c000}, {0xbce9e000}, 
-    {0xbcea0000}, {0xbcea2000}, {0xbcea4000}, {0xbcea6000}, 
-    {0xbcea8000}, {0xbceaa000}, {0xbceac000}, {0xbceae000}, 
-    {0xbceb0000}, {0xbceb2000}, {0xbceb4000}, {0xbceb6000}, 
-    {0xbceb8000}, {0xbceba000}, {0xbcebc000}, {0xbcebe000}, 
-    {0xbcec0000}, {0xbcec2000}, {0xbcec4000}, {0xbcec6000}, 
-    {0xbcec8000}, {0xbceca000}, {0xbcecc000}, {0xbcece000}, 
-    {0xbced0000}, {0xbced2000}, {0xbced4000}, {0xbced6000}, 
-    {0xbced8000}, {0xbceda000}, {0xbcedc000}, {0xbcede000}, 
-    {0xbcee0000}, {0xbcee2000}, {0xbcee4000}, {0xbcee6000}, 
-    {0xbcee8000}, {0xbceea000}, {0xbceec000}, {0xbceee000}, 
-    {0xbcef0000}, {0xbcef2000}, {0xbcef4000}, {0xbcef6000}, 
-    {0xbcef8000}, {0xbcefa000}, {0xbcefc000}, {0xbcefe000}, 
-    {0xbcf00000}, {0xbcf02000}, {0xbcf04000}, {0xbcf06000}, 
-    {0xbcf08000}, {0xbcf0a000}, {0xbcf0c000}, {0xbcf0e000}, 
-    {0xbcf10000}, {0xbcf12000}, {0xbcf14000}, {0xbcf16000}, 
-    {0xbcf18000}, {0xbcf1a000}, {0xbcf1c000}, {0xbcf1e000}, 
-    {0xbcf20000}, {0xbcf22000}, {0xbcf24000}, {0xbcf26000}, 
-    {0xbcf28000}, {0xbcf2a000}, {0xbcf2c000}, {0xbcf2e000}, 
-    {0xbcf30000}, {0xbcf32000}, {0xbcf34000}, {0xbcf36000}, 
-    {0xbcf38000}, {0xbcf3a000}, {0xbcf3c000}, {0xbcf3e000}, 
-    {0xbcf40000}, {0xbcf42000}, {0xbcf44000}, {0xbcf46000}, 
-    {0xbcf48000}, {0xbcf4a000}, {0xbcf4c000}, {0xbcf4e000}, 
-    {0xbcf50000}, {0xbcf52000}, {0xbcf54000}, {0xbcf56000}, 
-    {0xbcf58000}, {0xbcf5a000}, {0xbcf5c000}, {0xbcf5e000}, 
-    {0xbcf60000}, {0xbcf62000}, {0xbcf64000}, {0xbcf66000}, 
-    {0xbcf68000}, {0xbcf6a000}, {0xbcf6c000}, {0xbcf6e000}, 
-    {0xbcf70000}, {0xbcf72000}, {0xbcf74000}, {0xbcf76000}, 
-    {0xbcf78000}, {0xbcf7a000}, {0xbcf7c000}, {0xbcf7e000}, 
-    {0xbcf80000}, {0xbcf82000}, {0xbcf84000}, {0xbcf86000}, 
-    {0xbcf88000}, {0xbcf8a000}, {0xbcf8c000}, {0xbcf8e000}, 
-    {0xbcf90000}, {0xbcf92000}, {0xbcf94000}, {0xbcf96000}, 
-    {0xbcf98000}, {0xbcf9a000}, {0xbcf9c000}, {0xbcf9e000}, 
-    {0xbcfa0000}, {0xbcfa2000}, {0xbcfa4000}, {0xbcfa6000}, 
-    {0xbcfa8000}, {0xbcfaa000}, {0xbcfac000}, {0xbcfae000}, 
-    {0xbcfb0000}, {0xbcfb2000}, {0xbcfb4000}, {0xbcfb6000}, 
-    {0xbcfb8000}, {0xbcfba000}, {0xbcfbc000}, {0xbcfbe000}, 
-    {0xbcfc0000}, {0xbcfc2000}, {0xbcfc4000}, {0xbcfc6000}, 
-    {0xbcfc8000}, {0xbcfca000}, {0xbcfcc000}, {0xbcfce000}, 
-    {0xbcfd0000}, {0xbcfd2000}, {0xbcfd4000}, {0xbcfd6000}, 
-    {0xbcfd8000}, {0xbcfda000}, {0xbcfdc000}, {0xbcfde000}, 
-    {0xbcfe0000}, {0xbcfe2000}, {0xbcfe4000}, {0xbcfe6000}, 
-    {0xbcfe8000}, {0xbcfea000}, {0xbcfec000}, {0xbcfee000}, 
-    {0xbcff0000}, {0xbcff2000}, {0xbcff4000}, {0xbcff6000}, 
-    {0xbcff8000}, {0xbcffa000}, {0xbcffc000}, {0xbcffe000}, 
-    {0xbd000000}, {0xbd002000}, {0xbd004000}, {0xbd006000}, 
-    {0xbd008000}, {0xbd00a000}, {0xbd00c000}, {0xbd00e000}, 
-    {0xbd010000}, {0xbd012000}, {0xbd014000}, {0xbd016000}, 
-    {0xbd018000}, {0xbd01a000}, {0xbd01c000}, {0xbd01e000}, 
-    {0xbd020000}, {0xbd022000}, {0xbd024000}, {0xbd026000}, 
-    {0xbd028000}, {0xbd02a000}, {0xbd02c000}, {0xbd02e000}, 
-    {0xbd030000}, {0xbd032000}, {0xbd034000}, {0xbd036000}, 
-    {0xbd038000}, {0xbd03a000}, {0xbd03c000}, {0xbd03e000}, 
-    {0xbd040000}, {0xbd042000}, {0xbd044000}, {0xbd046000}, 
-    {0xbd048000}, {0xbd04a000}, {0xbd04c000}, {0xbd04e000}, 
-    {0xbd050000}, {0xbd052000}, {0xbd054000}, {0xbd056000}, 
-    {0xbd058000}, {0xbd05a000}, {0xbd05c000}, {0xbd05e000}, 
-    {0xbd060000}, {0xbd062000}, {0xbd064000}, {0xbd066000}, 
-    {0xbd068000}, {0xbd06a000}, {0xbd06c000}, {0xbd06e000}, 
-    {0xbd070000}, {0xbd072000}, {0xbd074000}, {0xbd076000}, 
-    {0xbd078000}, {0xbd07a000}, {0xbd07c000}, {0xbd07e000}, 
-    {0xbd080000}, {0xbd082000}, {0xbd084000}, {0xbd086000}, 
-    {0xbd088000}, {0xbd08a000}, {0xbd08c000}, {0xbd08e000}, 
-    {0xbd090000}, {0xbd092000}, {0xbd094000}, {0xbd096000}, 
-    {0xbd098000}, {0xbd09a000}, {0xbd09c000}, {0xbd09e000}, 
-    {0xbd0a0000}, {0xbd0a2000}, {0xbd0a4000}, {0xbd0a6000}, 
-    {0xbd0a8000}, {0xbd0aa000}, {0xbd0ac000}, {0xbd0ae000}, 
-    {0xbd0b0000}, {0xbd0b2000}, {0xbd0b4000}, {0xbd0b6000}, 
-    {0xbd0b8000}, {0xbd0ba000}, {0xbd0bc000}, {0xbd0be000}, 
-    {0xbd0c0000}, {0xbd0c2000}, {0xbd0c4000}, {0xbd0c6000}, 
-    {0xbd0c8000}, {0xbd0ca000}, {0xbd0cc000}, {0xbd0ce000}, 
-    {0xbd0d0000}, {0xbd0d2000}, {0xbd0d4000}, {0xbd0d6000}, 
-    {0xbd0d8000}, {0xbd0da000}, {0xbd0dc000}, {0xbd0de000}, 
-    {0xbd0e0000}, {0xbd0e2000}, {0xbd0e4000}, {0xbd0e6000}, 
-    {0xbd0e8000}, {0xbd0ea000}, {0xbd0ec000}, {0xbd0ee000}, 
-    {0xbd0f0000}, {0xbd0f2000}, {0xbd0f4000}, {0xbd0f6000}, 
-    {0xbd0f8000}, {0xbd0fa000}, {0xbd0fc000}, {0xbd0fe000}, 
-    {0xbd100000}, {0xbd102000}, {0xbd104000}, {0xbd106000}, 
-    {0xbd108000}, {0xbd10a000}, {0xbd10c000}, {0xbd10e000}, 
-    {0xbd110000}, {0xbd112000}, {0xbd114000}, {0xbd116000}, 
-    {0xbd118000}, {0xbd11a000}, {0xbd11c000}, {0xbd11e000}, 
-    {0xbd120000}, {0xbd122000}, {0xbd124000}, {0xbd126000}, 
-    {0xbd128000}, {0xbd12a000}, {0xbd12c000}, {0xbd12e000}, 
-    {0xbd130000}, {0xbd132000}, {0xbd134000}, {0xbd136000}, 
-    {0xbd138000}, {0xbd13a000}, {0xbd13c000}, {0xbd13e000}, 
-    {0xbd140000}, {0xbd142000}, {0xbd144000}, {0xbd146000}, 
-    {0xbd148000}, {0xbd14a000}, {0xbd14c000}, {0xbd14e000}, 
-    {0xbd150000}, {0xbd152000}, {0xbd154000}, {0xbd156000}, 
-    {0xbd158000}, {0xbd15a000}, {0xbd15c000}, {0xbd15e000}, 
-    {0xbd160000}, {0xbd162000}, {0xbd164000}, {0xbd166000}, 
-    {0xbd168000}, {0xbd16a000}, {0xbd16c000}, {0xbd16e000}, 
-    {0xbd170000}, {0xbd172000}, {0xbd174000}, {0xbd176000}, 
-    {0xbd178000}, {0xbd17a000}, {0xbd17c000}, {0xbd17e000}, 
-    {0xbd180000}, {0xbd182000}, {0xbd184000}, {0xbd186000}, 
-    {0xbd188000}, {0xbd18a000}, {0xbd18c000}, {0xbd18e000}, 
-    {0xbd190000}, {0xbd192000}, {0xbd194000}, {0xbd196000}, 
-    {0xbd198000}, {0xbd19a000}, {0xbd19c000}, {0xbd19e000}, 
-    {0xbd1a0000}, {0xbd1a2000}, {0xbd1a4000}, {0xbd1a6000}, 
-    {0xbd1a8000}, {0xbd1aa000}, {0xbd1ac000}, {0xbd1ae000}, 
-    {0xbd1b0000}, {0xbd1b2000}, {0xbd1b4000}, {0xbd1b6000}, 
-    {0xbd1b8000}, {0xbd1ba000}, {0xbd1bc000}, {0xbd1be000}, 
-    {0xbd1c0000}, {0xbd1c2000}, {0xbd1c4000}, {0xbd1c6000}, 
-    {0xbd1c8000}, {0xbd1ca000}, {0xbd1cc000}, {0xbd1ce000}, 
-    {0xbd1d0000}, {0xbd1d2000}, {0xbd1d4000}, {0xbd1d6000}, 
-    {0xbd1d8000}, {0xbd1da000}, {0xbd1dc000}, {0xbd1de000}, 
-    {0xbd1e0000}, {0xbd1e2000}, {0xbd1e4000}, {0xbd1e6000}, 
-    {0xbd1e8000}, {0xbd1ea000}, {0xbd1ec000}, {0xbd1ee000}, 
-    {0xbd1f0000}, {0xbd1f2000}, {0xbd1f4000}, {0xbd1f6000}, 
-    {0xbd1f8000}, {0xbd1fa000}, {0xbd1fc000}, {0xbd1fe000}, 
-    {0xbd200000}, {0xbd202000}, {0xbd204000}, {0xbd206000}, 
-    {0xbd208000}, {0xbd20a000}, {0xbd20c000}, {0xbd20e000}, 
-    {0xbd210000}, {0xbd212000}, {0xbd214000}, {0xbd216000}, 
-    {0xbd218000}, {0xbd21a000}, {0xbd21c000}, {0xbd21e000}, 
-    {0xbd220000}, {0xbd222000}, {0xbd224000}, {0xbd226000}, 
-    {0xbd228000}, {0xbd22a000}, {0xbd22c000}, {0xbd22e000}, 
-    {0xbd230000}, {0xbd232000}, {0xbd234000}, {0xbd236000}, 
-    {0xbd238000}, {0xbd23a000}, {0xbd23c000}, {0xbd23e000}, 
-    {0xbd240000}, {0xbd242000}, {0xbd244000}, {0xbd246000}, 
-    {0xbd248000}, {0xbd24a000}, {0xbd24c000}, {0xbd24e000}, 
-    {0xbd250000}, {0xbd252000}, {0xbd254000}, {0xbd256000}, 
-    {0xbd258000}, {0xbd25a000}, {0xbd25c000}, {0xbd25e000}, 
-    {0xbd260000}, {0xbd262000}, {0xbd264000}, {0xbd266000}, 
-    {0xbd268000}, {0xbd26a000}, {0xbd26c000}, {0xbd26e000}, 
-    {0xbd270000}, {0xbd272000}, {0xbd274000}, {0xbd276000}, 
-    {0xbd278000}, {0xbd27a000}, {0xbd27c000}, {0xbd27e000}, 
-    {0xbd280000}, {0xbd282000}, {0xbd284000}, {0xbd286000}, 
-    {0xbd288000}, {0xbd28a000}, {0xbd28c000}, {0xbd28e000}, 
-    {0xbd290000}, {0xbd292000}, {0xbd294000}, {0xbd296000}, 
-    {0xbd298000}, {0xbd29a000}, {0xbd29c000}, {0xbd29e000}, 
-    {0xbd2a0000}, {0xbd2a2000}, {0xbd2a4000}, {0xbd2a6000}, 
-    {0xbd2a8000}, {0xbd2aa000}, {0xbd2ac000}, {0xbd2ae000}, 
-    {0xbd2b0000}, {0xbd2b2000}, {0xbd2b4000}, {0xbd2b6000}, 
-    {0xbd2b8000}, {0xbd2ba000}, {0xbd2bc000}, {0xbd2be000}, 
-    {0xbd2c0000}, {0xbd2c2000}, {0xbd2c4000}, {0xbd2c6000}, 
-    {0xbd2c8000}, {0xbd2ca000}, {0xbd2cc000}, {0xbd2ce000}, 
-    {0xbd2d0000}, {0xbd2d2000}, {0xbd2d4000}, {0xbd2d6000}, 
-    {0xbd2d8000}, {0xbd2da000}, {0xbd2dc000}, {0xbd2de000}, 
-    {0xbd2e0000}, {0xbd2e2000}, {0xbd2e4000}, {0xbd2e6000}, 
-    {0xbd2e8000}, {0xbd2ea000}, {0xbd2ec000}, {0xbd2ee000}, 
-    {0xbd2f0000}, {0xbd2f2000}, {0xbd2f4000}, {0xbd2f6000}, 
-    {0xbd2f8000}, {0xbd2fa000}, {0xbd2fc000}, {0xbd2fe000}, 
-    {0xbd300000}, {0xbd302000}, {0xbd304000}, {0xbd306000}, 
-    {0xbd308000}, {0xbd30a000}, {0xbd30c000}, {0xbd30e000}, 
-    {0xbd310000}, {0xbd312000}, {0xbd314000}, {0xbd316000}, 
-    {0xbd318000}, {0xbd31a000}, {0xbd31c000}, {0xbd31e000}, 
-    {0xbd320000}, {0xbd322000}, {0xbd324000}, {0xbd326000}, 
-    {0xbd328000}, {0xbd32a000}, {0xbd32c000}, {0xbd32e000}, 
-    {0xbd330000}, {0xbd332000}, {0xbd334000}, {0xbd336000}, 
-    {0xbd338000}, {0xbd33a000}, {0xbd33c000}, {0xbd33e000}, 
-    {0xbd340000}, {0xbd342000}, {0xbd344000}, {0xbd346000}, 
-    {0xbd348000}, {0xbd34a000}, {0xbd34c000}, {0xbd34e000}, 
-    {0xbd350000}, {0xbd352000}, {0xbd354000}, {0xbd356000}, 
-    {0xbd358000}, {0xbd35a000}, {0xbd35c000}, {0xbd35e000}, 
-    {0xbd360000}, {0xbd362000}, {0xbd364000}, {0xbd366000}, 
-    {0xbd368000}, {0xbd36a000}, {0xbd36c000}, {0xbd36e000}, 
-    {0xbd370000}, {0xbd372000}, {0xbd374000}, {0xbd376000}, 
-    {0xbd378000}, {0xbd37a000}, {0xbd37c000}, {0xbd37e000}, 
-    {0xbd380000}, {0xbd382000}, {0xbd384000}, {0xbd386000}, 
-    {0xbd388000}, {0xbd38a000}, {0xbd38c000}, {0xbd38e000}, 
-    {0xbd390000}, {0xbd392000}, {0xbd394000}, {0xbd396000}, 
-    {0xbd398000}, {0xbd39a000}, {0xbd39c000}, {0xbd39e000}, 
-    {0xbd3a0000}, {0xbd3a2000}, {0xbd3a4000}, {0xbd3a6000}, 
-    {0xbd3a8000}, {0xbd3aa000}, {0xbd3ac000}, {0xbd3ae000}, 
-    {0xbd3b0000}, {0xbd3b2000}, {0xbd3b4000}, {0xbd3b6000}, 
-    {0xbd3b8000}, {0xbd3ba000}, {0xbd3bc000}, {0xbd3be000}, 
-    {0xbd3c0000}, {0xbd3c2000}, {0xbd3c4000}, {0xbd3c6000}, 
-    {0xbd3c8000}, {0xbd3ca000}, {0xbd3cc000}, {0xbd3ce000}, 
-    {0xbd3d0000}, {0xbd3d2000}, {0xbd3d4000}, {0xbd3d6000}, 
-    {0xbd3d8000}, {0xbd3da000}, {0xbd3dc000}, {0xbd3de000}, 
-    {0xbd3e0000}, {0xbd3e2000}, {0xbd3e4000}, {0xbd3e6000}, 
-    {0xbd3e8000}, {0xbd3ea000}, {0xbd3ec000}, {0xbd3ee000}, 
-    {0xbd3f0000}, {0xbd3f2000}, {0xbd3f4000}, {0xbd3f6000}, 
-    {0xbd3f8000}, {0xbd3fa000}, {0xbd3fc000}, {0xbd3fe000}, 
-    {0xbd400000}, {0xbd402000}, {0xbd404000}, {0xbd406000}, 
-    {0xbd408000}, {0xbd40a000}, {0xbd40c000}, {0xbd40e000}, 
-    {0xbd410000}, {0xbd412000}, {0xbd414000}, {0xbd416000}, 
-    {0xbd418000}, {0xbd41a000}, {0xbd41c000}, {0xbd41e000}, 
-    {0xbd420000}, {0xbd422000}, {0xbd424000}, {0xbd426000}, 
-    {0xbd428000}, {0xbd42a000}, {0xbd42c000}, {0xbd42e000}, 
-    {0xbd430000}, {0xbd432000}, {0xbd434000}, {0xbd436000}, 
-    {0xbd438000}, {0xbd43a000}, {0xbd43c000}, {0xbd43e000}, 
-    {0xbd440000}, {0xbd442000}, {0xbd444000}, {0xbd446000}, 
-    {0xbd448000}, {0xbd44a000}, {0xbd44c000}, {0xbd44e000}, 
-    {0xbd450000}, {0xbd452000}, {0xbd454000}, {0xbd456000}, 
-    {0xbd458000}, {0xbd45a000}, {0xbd45c000}, {0xbd45e000}, 
-    {0xbd460000}, {0xbd462000}, {0xbd464000}, {0xbd466000}, 
-    {0xbd468000}, {0xbd46a000}, {0xbd46c000}, {0xbd46e000}, 
-    {0xbd470000}, {0xbd472000}, {0xbd474000}, {0xbd476000}, 
-    {0xbd478000}, {0xbd47a000}, {0xbd47c000}, {0xbd47e000}, 
-    {0xbd480000}, {0xbd482000}, {0xbd484000}, {0xbd486000}, 
-    {0xbd488000}, {0xbd48a000}, {0xbd48c000}, {0xbd48e000}, 
-    {0xbd490000}, {0xbd492000}, {0xbd494000}, {0xbd496000}, 
-    {0xbd498000}, {0xbd49a000}, {0xbd49c000}, {0xbd49e000}, 
-    {0xbd4a0000}, {0xbd4a2000}, {0xbd4a4000}, {0xbd4a6000}, 
-    {0xbd4a8000}, {0xbd4aa000}, {0xbd4ac000}, {0xbd4ae000}, 
-    {0xbd4b0000}, {0xbd4b2000}, {0xbd4b4000}, {0xbd4b6000}, 
-    {0xbd4b8000}, {0xbd4ba000}, {0xbd4bc000}, {0xbd4be000}, 
-    {0xbd4c0000}, {0xbd4c2000}, {0xbd4c4000}, {0xbd4c6000}, 
-    {0xbd4c8000}, {0xbd4ca000}, {0xbd4cc000}, {0xbd4ce000}, 
-    {0xbd4d0000}, {0xbd4d2000}, {0xbd4d4000}, {0xbd4d6000}, 
-    {0xbd4d8000}, {0xbd4da000}, {0xbd4dc000}, {0xbd4de000}, 
-    {0xbd4e0000}, {0xbd4e2000}, {0xbd4e4000}, {0xbd4e6000}, 
-    {0xbd4e8000}, {0xbd4ea000}, {0xbd4ec000}, {0xbd4ee000}, 
-    {0xbd4f0000}, {0xbd4f2000}, {0xbd4f4000}, {0xbd4f6000}, 
-    {0xbd4f8000}, {0xbd4fa000}, {0xbd4fc000}, {0xbd4fe000}, 
-    {0xbd500000}, {0xbd502000}, {0xbd504000}, {0xbd506000}, 
-    {0xbd508000}, {0xbd50a000}, {0xbd50c000}, {0xbd50e000}, 
-    {0xbd510000}, {0xbd512000}, {0xbd514000}, {0xbd516000}, 
-    {0xbd518000}, {0xbd51a000}, {0xbd51c000}, {0xbd51e000}, 
-    {0xbd520000}, {0xbd522000}, {0xbd524000}, {0xbd526000}, 
-    {0xbd528000}, {0xbd52a000}, {0xbd52c000}, {0xbd52e000}, 
-    {0xbd530000}, {0xbd532000}, {0xbd534000}, {0xbd536000}, 
-    {0xbd538000}, {0xbd53a000}, {0xbd53c000}, {0xbd53e000}, 
-    {0xbd540000}, {0xbd542000}, {0xbd544000}, {0xbd546000}, 
-    {0xbd548000}, {0xbd54a000}, {0xbd54c000}, {0xbd54e000}, 
-    {0xbd550000}, {0xbd552000}, {0xbd554000}, {0xbd556000}, 
-    {0xbd558000}, {0xbd55a000}, {0xbd55c000}, {0xbd55e000}, 
-    {0xbd560000}, {0xbd562000}, {0xbd564000}, {0xbd566000}, 
-    {0xbd568000}, {0xbd56a000}, {0xbd56c000}, {0xbd56e000}, 
-    {0xbd570000}, {0xbd572000}, {0xbd574000}, {0xbd576000}, 
-    {0xbd578000}, {0xbd57a000}, {0xbd57c000}, {0xbd57e000}, 
-    {0xbd580000}, {0xbd582000}, {0xbd584000}, {0xbd586000}, 
-    {0xbd588000}, {0xbd58a000}, {0xbd58c000}, {0xbd58e000}, 
-    {0xbd590000}, {0xbd592000}, {0xbd594000}, {0xbd596000}, 
-    {0xbd598000}, {0xbd59a000}, {0xbd59c000}, {0xbd59e000}, 
-    {0xbd5a0000}, {0xbd5a2000}, {0xbd5a4000}, {0xbd5a6000}, 
-    {0xbd5a8000}, {0xbd5aa000}, {0xbd5ac000}, {0xbd5ae000}, 
-    {0xbd5b0000}, {0xbd5b2000}, {0xbd5b4000}, {0xbd5b6000}, 
-    {0xbd5b8000}, {0xbd5ba000}, {0xbd5bc000}, {0xbd5be000}, 
-    {0xbd5c0000}, {0xbd5c2000}, {0xbd5c4000}, {0xbd5c6000}, 
-    {0xbd5c8000}, {0xbd5ca000}, {0xbd5cc000}, {0xbd5ce000}, 
-    {0xbd5d0000}, {0xbd5d2000}, {0xbd5d4000}, {0xbd5d6000}, 
-    {0xbd5d8000}, {0xbd5da000}, {0xbd5dc000}, {0xbd5de000}, 
-    {0xbd5e0000}, {0xbd5e2000}, {0xbd5e4000}, {0xbd5e6000}, 
-    {0xbd5e8000}, {0xbd5ea000}, {0xbd5ec000}, {0xbd5ee000}, 
-    {0xbd5f0000}, {0xbd5f2000}, {0xbd5f4000}, {0xbd5f6000}, 
-    {0xbd5f8000}, {0xbd5fa000}, {0xbd5fc000}, {0xbd5fe000}, 
-    {0xbd600000}, {0xbd602000}, {0xbd604000}, {0xbd606000}, 
-    {0xbd608000}, {0xbd60a000}, {0xbd60c000}, {0xbd60e000}, 
-    {0xbd610000}, {0xbd612000}, {0xbd614000}, {0xbd616000}, 
-    {0xbd618000}, {0xbd61a000}, {0xbd61c000}, {0xbd61e000}, 
-    {0xbd620000}, {0xbd622000}, {0xbd624000}, {0xbd626000}, 
-    {0xbd628000}, {0xbd62a000}, {0xbd62c000}, {0xbd62e000}, 
-    {0xbd630000}, {0xbd632000}, {0xbd634000}, {0xbd636000}, 
-    {0xbd638000}, {0xbd63a000}, {0xbd63c000}, {0xbd63e000}, 
-    {0xbd640000}, {0xbd642000}, {0xbd644000}, {0xbd646000}, 
-    {0xbd648000}, {0xbd64a000}, {0xbd64c000}, {0xbd64e000}, 
-    {0xbd650000}, {0xbd652000}, {0xbd654000}, {0xbd656000}, 
-    {0xbd658000}, {0xbd65a000}, {0xbd65c000}, {0xbd65e000}, 
-    {0xbd660000}, {0xbd662000}, {0xbd664000}, {0xbd666000}, 
-    {0xbd668000}, {0xbd66a000}, {0xbd66c000}, {0xbd66e000}, 
-    {0xbd670000}, {0xbd672000}, {0xbd674000}, {0xbd676000}, 
-    {0xbd678000}, {0xbd67a000}, {0xbd67c000}, {0xbd67e000}, 
-    {0xbd680000}, {0xbd682000}, {0xbd684000}, {0xbd686000}, 
-    {0xbd688000}, {0xbd68a000}, {0xbd68c000}, {0xbd68e000}, 
-    {0xbd690000}, {0xbd692000}, {0xbd694000}, {0xbd696000}, 
-    {0xbd698000}, {0xbd69a000}, {0xbd69c000}, {0xbd69e000}, 
-    {0xbd6a0000}, {0xbd6a2000}, {0xbd6a4000}, {0xbd6a6000}, 
-    {0xbd6a8000}, {0xbd6aa000}, {0xbd6ac000}, {0xbd6ae000}, 
-    {0xbd6b0000}, {0xbd6b2000}, {0xbd6b4000}, {0xbd6b6000}, 
-    {0xbd6b8000}, {0xbd6ba000}, {0xbd6bc000}, {0xbd6be000}, 
-    {0xbd6c0000}, {0xbd6c2000}, {0xbd6c4000}, {0xbd6c6000}, 
-    {0xbd6c8000}, {0xbd6ca000}, {0xbd6cc000}, {0xbd6ce000}, 
-    {0xbd6d0000}, {0xbd6d2000}, {0xbd6d4000}, {0xbd6d6000}, 
-    {0xbd6d8000}, {0xbd6da000}, {0xbd6dc000}, {0xbd6de000}, 
-    {0xbd6e0000}, {0xbd6e2000}, {0xbd6e4000}, {0xbd6e6000}, 
-    {0xbd6e8000}, {0xbd6ea000}, {0xbd6ec000}, {0xbd6ee000}, 
-    {0xbd6f0000}, {0xbd6f2000}, {0xbd6f4000}, {0xbd6f6000}, 
-    {0xbd6f8000}, {0xbd6fa000}, {0xbd6fc000}, {0xbd6fe000}, 
-    {0xbd700000}, {0xbd702000}, {0xbd704000}, {0xbd706000}, 
-    {0xbd708000}, {0xbd70a000}, {0xbd70c000}, {0xbd70e000}, 
-    {0xbd710000}, {0xbd712000}, {0xbd714000}, {0xbd716000}, 
-    {0xbd718000}, {0xbd71a000}, {0xbd71c000}, {0xbd71e000}, 
-    {0xbd720000}, {0xbd722000}, {0xbd724000}, {0xbd726000}, 
-    {0xbd728000}, {0xbd72a000}, {0xbd72c000}, {0xbd72e000}, 
-    {0xbd730000}, {0xbd732000}, {0xbd734000}, {0xbd736000}, 
-    {0xbd738000}, {0xbd73a000}, {0xbd73c000}, {0xbd73e000}, 
-    {0xbd740000}, {0xbd742000}, {0xbd744000}, {0xbd746000}, 
-    {0xbd748000}, {0xbd74a000}, {0xbd74c000}, {0xbd74e000}, 
-    {0xbd750000}, {0xbd752000}, {0xbd754000}, {0xbd756000}, 
-    {0xbd758000}, {0xbd75a000}, {0xbd75c000}, {0xbd75e000}, 
-    {0xbd760000}, {0xbd762000}, {0xbd764000}, {0xbd766000}, 
-    {0xbd768000}, {0xbd76a000}, {0xbd76c000}, {0xbd76e000}, 
-    {0xbd770000}, {0xbd772000}, {0xbd774000}, {0xbd776000}, 
-    {0xbd778000}, {0xbd77a000}, {0xbd77c000}, {0xbd77e000}, 
-    {0xbd780000}, {0xbd782000}, {0xbd784000}, {0xbd786000}, 
-    {0xbd788000}, {0xbd78a000}, {0xbd78c000}, {0xbd78e000}, 
-    {0xbd790000}, {0xbd792000}, {0xbd794000}, {0xbd796000}, 
-    {0xbd798000}, {0xbd79a000}, {0xbd79c000}, {0xbd79e000}, 
-    {0xbd7a0000}, {0xbd7a2000}, {0xbd7a4000}, {0xbd7a6000}, 
-    {0xbd7a8000}, {0xbd7aa000}, {0xbd7ac000}, {0xbd7ae000}, 
-    {0xbd7b0000}, {0xbd7b2000}, {0xbd7b4000}, {0xbd7b6000}, 
-    {0xbd7b8000}, {0xbd7ba000}, {0xbd7bc000}, {0xbd7be000}, 
-    {0xbd7c0000}, {0xbd7c2000}, {0xbd7c4000}, {0xbd7c6000}, 
-    {0xbd7c8000}, {0xbd7ca000}, {0xbd7cc000}, {0xbd7ce000}, 
-    {0xbd7d0000}, {0xbd7d2000}, {0xbd7d4000}, {0xbd7d6000}, 
-    {0xbd7d8000}, {0xbd7da000}, {0xbd7dc000}, {0xbd7de000}, 
-    {0xbd7e0000}, {0xbd7e2000}, {0xbd7e4000}, {0xbd7e6000}, 
-    {0xbd7e8000}, {0xbd7ea000}, {0xbd7ec000}, {0xbd7ee000}, 
-    {0xbd7f0000}, {0xbd7f2000}, {0xbd7f4000}, {0xbd7f6000}, 
-    {0xbd7f8000}, {0xbd7fa000}, {0xbd7fc000}, {0xbd7fe000}, 
-    {0xbd800000}, {0xbd802000}, {0xbd804000}, {0xbd806000}, 
-    {0xbd808000}, {0xbd80a000}, {0xbd80c000}, {0xbd80e000}, 
-    {0xbd810000}, {0xbd812000}, {0xbd814000}, {0xbd816000}, 
-    {0xbd818000}, {0xbd81a000}, {0xbd81c000}, {0xbd81e000}, 
-    {0xbd820000}, {0xbd822000}, {0xbd824000}, {0xbd826000}, 
-    {0xbd828000}, {0xbd82a000}, {0xbd82c000}, {0xbd82e000}, 
-    {0xbd830000}, {0xbd832000}, {0xbd834000}, {0xbd836000}, 
-    {0xbd838000}, {0xbd83a000}, {0xbd83c000}, {0xbd83e000}, 
-    {0xbd840000}, {0xbd842000}, {0xbd844000}, {0xbd846000}, 
-    {0xbd848000}, {0xbd84a000}, {0xbd84c000}, {0xbd84e000}, 
-    {0xbd850000}, {0xbd852000}, {0xbd854000}, {0xbd856000}, 
-    {0xbd858000}, {0xbd85a000}, {0xbd85c000}, {0xbd85e000}, 
-    {0xbd860000}, {0xbd862000}, {0xbd864000}, {0xbd866000}, 
-    {0xbd868000}, {0xbd86a000}, {0xbd86c000}, {0xbd86e000}, 
-    {0xbd870000}, {0xbd872000}, {0xbd874000}, {0xbd876000}, 
-    {0xbd878000}, {0xbd87a000}, {0xbd87c000}, {0xbd87e000}, 
-    {0xbd880000}, {0xbd882000}, {0xbd884000}, {0xbd886000}, 
-    {0xbd888000}, {0xbd88a000}, {0xbd88c000}, {0xbd88e000}, 
-    {0xbd890000}, {0xbd892000}, {0xbd894000}, {0xbd896000}, 
-    {0xbd898000}, {0xbd89a000}, {0xbd89c000}, {0xbd89e000}, 
-    {0xbd8a0000}, {0xbd8a2000}, {0xbd8a4000}, {0xbd8a6000}, 
-    {0xbd8a8000}, {0xbd8aa000}, {0xbd8ac000}, {0xbd8ae000}, 
-    {0xbd8b0000}, {0xbd8b2000}, {0xbd8b4000}, {0xbd8b6000}, 
-    {0xbd8b8000}, {0xbd8ba000}, {0xbd8bc000}, {0xbd8be000}, 
-    {0xbd8c0000}, {0xbd8c2000}, {0xbd8c4000}, {0xbd8c6000}, 
-    {0xbd8c8000}, {0xbd8ca000}, {0xbd8cc000}, {0xbd8ce000}, 
-    {0xbd8d0000}, {0xbd8d2000}, {0xbd8d4000}, {0xbd8d6000}, 
-    {0xbd8d8000}, {0xbd8da000}, {0xbd8dc000}, {0xbd8de000}, 
-    {0xbd8e0000}, {0xbd8e2000}, {0xbd8e4000}, {0xbd8e6000}, 
-    {0xbd8e8000}, {0xbd8ea000}, {0xbd8ec000}, {0xbd8ee000}, 
-    {0xbd8f0000}, {0xbd8f2000}, {0xbd8f4000}, {0xbd8f6000}, 
-    {0xbd8f8000}, {0xbd8fa000}, {0xbd8fc000}, {0xbd8fe000}, 
-    {0xbd900000}, {0xbd902000}, {0xbd904000}, {0xbd906000}, 
-    {0xbd908000}, {0xbd90a000}, {0xbd90c000}, {0xbd90e000}, 
-    {0xbd910000}, {0xbd912000}, {0xbd914000}, {0xbd916000}, 
-    {0xbd918000}, {0xbd91a000}, {0xbd91c000}, {0xbd91e000}, 
-    {0xbd920000}, {0xbd922000}, {0xbd924000}, {0xbd926000}, 
-    {0xbd928000}, {0xbd92a000}, {0xbd92c000}, {0xbd92e000}, 
-    {0xbd930000}, {0xbd932000}, {0xbd934000}, {0xbd936000}, 
-    {0xbd938000}, {0xbd93a000}, {0xbd93c000}, {0xbd93e000}, 
-    {0xbd940000}, {0xbd942000}, {0xbd944000}, {0xbd946000}, 
-    {0xbd948000}, {0xbd94a000}, {0xbd94c000}, {0xbd94e000}, 
-    {0xbd950000}, {0xbd952000}, {0xbd954000}, {0xbd956000}, 
-    {0xbd958000}, {0xbd95a000}, {0xbd95c000}, {0xbd95e000}, 
-    {0xbd960000}, {0xbd962000}, {0xbd964000}, {0xbd966000}, 
-    {0xbd968000}, {0xbd96a000}, {0xbd96c000}, {0xbd96e000}, 
-    {0xbd970000}, {0xbd972000}, {0xbd974000}, {0xbd976000}, 
-    {0xbd978000}, {0xbd97a000}, {0xbd97c000}, {0xbd97e000}, 
-    {0xbd980000}, {0xbd982000}, {0xbd984000}, {0xbd986000}, 
-    {0xbd988000}, {0xbd98a000}, {0xbd98c000}, {0xbd98e000}, 
-    {0xbd990000}, {0xbd992000}, {0xbd994000}, {0xbd996000}, 
-    {0xbd998000}, {0xbd99a000}, {0xbd99c000}, {0xbd99e000}, 
-    {0xbd9a0000}, {0xbd9a2000}, {0xbd9a4000}, {0xbd9a6000}, 
-    {0xbd9a8000}, {0xbd9aa000}, {0xbd9ac000}, {0xbd9ae000}, 
-    {0xbd9b0000}, {0xbd9b2000}, {0xbd9b4000}, {0xbd9b6000}, 
-    {0xbd9b8000}, {0xbd9ba000}, {0xbd9bc000}, {0xbd9be000}, 
-    {0xbd9c0000}, {0xbd9c2000}, {0xbd9c4000}, {0xbd9c6000}, 
-    {0xbd9c8000}, {0xbd9ca000}, {0xbd9cc000}, {0xbd9ce000}, 
-    {0xbd9d0000}, {0xbd9d2000}, {0xbd9d4000}, {0xbd9d6000}, 
-    {0xbd9d8000}, {0xbd9da000}, {0xbd9dc000}, {0xbd9de000}, 
-    {0xbd9e0000}, {0xbd9e2000}, {0xbd9e4000}, {0xbd9e6000}, 
-    {0xbd9e8000}, {0xbd9ea000}, {0xbd9ec000}, {0xbd9ee000}, 
-    {0xbd9f0000}, {0xbd9f2000}, {0xbd9f4000}, {0xbd9f6000}, 
-    {0xbd9f8000}, {0xbd9fa000}, {0xbd9fc000}, {0xbd9fe000}, 
-    {0xbda00000}, {0xbda02000}, {0xbda04000}, {0xbda06000}, 
-    {0xbda08000}, {0xbda0a000}, {0xbda0c000}, {0xbda0e000}, 
-    {0xbda10000}, {0xbda12000}, {0xbda14000}, {0xbda16000}, 
-    {0xbda18000}, {0xbda1a000}, {0xbda1c000}, {0xbda1e000}, 
-    {0xbda20000}, {0xbda22000}, {0xbda24000}, {0xbda26000}, 
-    {0xbda28000}, {0xbda2a000}, {0xbda2c000}, {0xbda2e000}, 
-    {0xbda30000}, {0xbda32000}, {0xbda34000}, {0xbda36000}, 
-    {0xbda38000}, {0xbda3a000}, {0xbda3c000}, {0xbda3e000}, 
-    {0xbda40000}, {0xbda42000}, {0xbda44000}, {0xbda46000}, 
-    {0xbda48000}, {0xbda4a000}, {0xbda4c000}, {0xbda4e000}, 
-    {0xbda50000}, {0xbda52000}, {0xbda54000}, {0xbda56000}, 
-    {0xbda58000}, {0xbda5a000}, {0xbda5c000}, {0xbda5e000}, 
-    {0xbda60000}, {0xbda62000}, {0xbda64000}, {0xbda66000}, 
-    {0xbda68000}, {0xbda6a000}, {0xbda6c000}, {0xbda6e000}, 
-    {0xbda70000}, {0xbda72000}, {0xbda74000}, {0xbda76000}, 
-    {0xbda78000}, {0xbda7a000}, {0xbda7c000}, {0xbda7e000}, 
-    {0xbda80000}, {0xbda82000}, {0xbda84000}, {0xbda86000}, 
-    {0xbda88000}, {0xbda8a000}, {0xbda8c000}, {0xbda8e000}, 
-    {0xbda90000}, {0xbda92000}, {0xbda94000}, {0xbda96000}, 
-    {0xbda98000}, {0xbda9a000}, {0xbda9c000}, {0xbda9e000}, 
-    {0xbdaa0000}, {0xbdaa2000}, {0xbdaa4000}, {0xbdaa6000}, 
-    {0xbdaa8000}, {0xbdaaa000}, {0xbdaac000}, {0xbdaae000}, 
-    {0xbdab0000}, {0xbdab2000}, {0xbdab4000}, {0xbdab6000}, 
-    {0xbdab8000}, {0xbdaba000}, {0xbdabc000}, {0xbdabe000}, 
-    {0xbdac0000}, {0xbdac2000}, {0xbdac4000}, {0xbdac6000}, 
-    {0xbdac8000}, {0xbdaca000}, {0xbdacc000}, {0xbdace000}, 
-    {0xbdad0000}, {0xbdad2000}, {0xbdad4000}, {0xbdad6000}, 
-    {0xbdad8000}, {0xbdada000}, {0xbdadc000}, {0xbdade000}, 
-    {0xbdae0000}, {0xbdae2000}, {0xbdae4000}, {0xbdae6000}, 
-    {0xbdae8000}, {0xbdaea000}, {0xbdaec000}, {0xbdaee000}, 
-    {0xbdaf0000}, {0xbdaf2000}, {0xbdaf4000}, {0xbdaf6000}, 
-    {0xbdaf8000}, {0xbdafa000}, {0xbdafc000}, {0xbdafe000}, 
-    {0xbdb00000}, {0xbdb02000}, {0xbdb04000}, {0xbdb06000}, 
-    {0xbdb08000}, {0xbdb0a000}, {0xbdb0c000}, {0xbdb0e000}, 
-    {0xbdb10000}, {0xbdb12000}, {0xbdb14000}, {0xbdb16000}, 
-    {0xbdb18000}, {0xbdb1a000}, {0xbdb1c000}, {0xbdb1e000}, 
-    {0xbdb20000}, {0xbdb22000}, {0xbdb24000}, {0xbdb26000}, 
-    {0xbdb28000}, {0xbdb2a000}, {0xbdb2c000}, {0xbdb2e000}, 
-    {0xbdb30000}, {0xbdb32000}, {0xbdb34000}, {0xbdb36000}, 
-    {0xbdb38000}, {0xbdb3a000}, {0xbdb3c000}, {0xbdb3e000}, 
-    {0xbdb40000}, {0xbdb42000}, {0xbdb44000}, {0xbdb46000}, 
-    {0xbdb48000}, {0xbdb4a000}, {0xbdb4c000}, {0xbdb4e000}, 
-    {0xbdb50000}, {0xbdb52000}, {0xbdb54000}, {0xbdb56000}, 
-    {0xbdb58000}, {0xbdb5a000}, {0xbdb5c000}, {0xbdb5e000}, 
-    {0xbdb60000}, {0xbdb62000}, {0xbdb64000}, {0xbdb66000}, 
-    {0xbdb68000}, {0xbdb6a000}, {0xbdb6c000}, {0xbdb6e000}, 
-    {0xbdb70000}, {0xbdb72000}, {0xbdb74000}, {0xbdb76000}, 
-    {0xbdb78000}, {0xbdb7a000}, {0xbdb7c000}, {0xbdb7e000}, 
-    {0xbdb80000}, {0xbdb82000}, {0xbdb84000}, {0xbdb86000}, 
-    {0xbdb88000}, {0xbdb8a000}, {0xbdb8c000}, {0xbdb8e000}, 
-    {0xbdb90000}, {0xbdb92000}, {0xbdb94000}, {0xbdb96000}, 
-    {0xbdb98000}, {0xbdb9a000}, {0xbdb9c000}, {0xbdb9e000}, 
-    {0xbdba0000}, {0xbdba2000}, {0xbdba4000}, {0xbdba6000}, 
-    {0xbdba8000}, {0xbdbaa000}, {0xbdbac000}, {0xbdbae000}, 
-    {0xbdbb0000}, {0xbdbb2000}, {0xbdbb4000}, {0xbdbb6000}, 
-    {0xbdbb8000}, {0xbdbba000}, {0xbdbbc000}, {0xbdbbe000}, 
-    {0xbdbc0000}, {0xbdbc2000}, {0xbdbc4000}, {0xbdbc6000}, 
-    {0xbdbc8000}, {0xbdbca000}, {0xbdbcc000}, {0xbdbce000}, 
-    {0xbdbd0000}, {0xbdbd2000}, {0xbdbd4000}, {0xbdbd6000}, 
-    {0xbdbd8000}, {0xbdbda000}, {0xbdbdc000}, {0xbdbde000}, 
-    {0xbdbe0000}, {0xbdbe2000}, {0xbdbe4000}, {0xbdbe6000}, 
-    {0xbdbe8000}, {0xbdbea000}, {0xbdbec000}, {0xbdbee000}, 
-    {0xbdbf0000}, {0xbdbf2000}, {0xbdbf4000}, {0xbdbf6000}, 
-    {0xbdbf8000}, {0xbdbfa000}, {0xbdbfc000}, {0xbdbfe000}, 
-    {0xbdc00000}, {0xbdc02000}, {0xbdc04000}, {0xbdc06000}, 
-    {0xbdc08000}, {0xbdc0a000}, {0xbdc0c000}, {0xbdc0e000}, 
-    {0xbdc10000}, {0xbdc12000}, {0xbdc14000}, {0xbdc16000}, 
-    {0xbdc18000}, {0xbdc1a000}, {0xbdc1c000}, {0xbdc1e000}, 
-    {0xbdc20000}, {0xbdc22000}, {0xbdc24000}, {0xbdc26000}, 
-    {0xbdc28000}, {0xbdc2a000}, {0xbdc2c000}, {0xbdc2e000}, 
-    {0xbdc30000}, {0xbdc32000}, {0xbdc34000}, {0xbdc36000}, 
-    {0xbdc38000}, {0xbdc3a000}, {0xbdc3c000}, {0xbdc3e000}, 
-    {0xbdc40000}, {0xbdc42000}, {0xbdc44000}, {0xbdc46000}, 
-    {0xbdc48000}, {0xbdc4a000}, {0xbdc4c000}, {0xbdc4e000}, 
-    {0xbdc50000}, {0xbdc52000}, {0xbdc54000}, {0xbdc56000}, 
-    {0xbdc58000}, {0xbdc5a000}, {0xbdc5c000}, {0xbdc5e000}, 
-    {0xbdc60000}, {0xbdc62000}, {0xbdc64000}, {0xbdc66000}, 
-    {0xbdc68000}, {0xbdc6a000}, {0xbdc6c000}, {0xbdc6e000}, 
-    {0xbdc70000}, {0xbdc72000}, {0xbdc74000}, {0xbdc76000}, 
-    {0xbdc78000}, {0xbdc7a000}, {0xbdc7c000}, {0xbdc7e000}, 
-    {0xbdc80000}, {0xbdc82000}, {0xbdc84000}, {0xbdc86000}, 
-    {0xbdc88000}, {0xbdc8a000}, {0xbdc8c000}, {0xbdc8e000}, 
-    {0xbdc90000}, {0xbdc92000}, {0xbdc94000}, {0xbdc96000}, 
-    {0xbdc98000}, {0xbdc9a000}, {0xbdc9c000}, {0xbdc9e000}, 
-    {0xbdca0000}, {0xbdca2000}, {0xbdca4000}, {0xbdca6000}, 
-    {0xbdca8000}, {0xbdcaa000}, {0xbdcac000}, {0xbdcae000}, 
-    {0xbdcb0000}, {0xbdcb2000}, {0xbdcb4000}, {0xbdcb6000}, 
-    {0xbdcb8000}, {0xbdcba000}, {0xbdcbc000}, {0xbdcbe000}, 
-    {0xbdcc0000}, {0xbdcc2000}, {0xbdcc4000}, {0xbdcc6000}, 
-    {0xbdcc8000}, {0xbdcca000}, {0xbdccc000}, {0xbdcce000}, 
-    {0xbdcd0000}, {0xbdcd2000}, {0xbdcd4000}, {0xbdcd6000}, 
-    {0xbdcd8000}, {0xbdcda000}, {0xbdcdc000}, {0xbdcde000}, 
-    {0xbdce0000}, {0xbdce2000}, {0xbdce4000}, {0xbdce6000}, 
-    {0xbdce8000}, {0xbdcea000}, {0xbdcec000}, {0xbdcee000}, 
-    {0xbdcf0000}, {0xbdcf2000}, {0xbdcf4000}, {0xbdcf6000}, 
-    {0xbdcf8000}, {0xbdcfa000}, {0xbdcfc000}, {0xbdcfe000}, 
-    {0xbdd00000}, {0xbdd02000}, {0xbdd04000}, {0xbdd06000}, 
-    {0xbdd08000}, {0xbdd0a000}, {0xbdd0c000}, {0xbdd0e000}, 
-    {0xbdd10000}, {0xbdd12000}, {0xbdd14000}, {0xbdd16000}, 
-    {0xbdd18000}, {0xbdd1a000}, {0xbdd1c000}, {0xbdd1e000}, 
-    {0xbdd20000}, {0xbdd22000}, {0xbdd24000}, {0xbdd26000}, 
-    {0xbdd28000}, {0xbdd2a000}, {0xbdd2c000}, {0xbdd2e000}, 
-    {0xbdd30000}, {0xbdd32000}, {0xbdd34000}, {0xbdd36000}, 
-    {0xbdd38000}, {0xbdd3a000}, {0xbdd3c000}, {0xbdd3e000}, 
-    {0xbdd40000}, {0xbdd42000}, {0xbdd44000}, {0xbdd46000}, 
-    {0xbdd48000}, {0xbdd4a000}, {0xbdd4c000}, {0xbdd4e000}, 
-    {0xbdd50000}, {0xbdd52000}, {0xbdd54000}, {0xbdd56000}, 
-    {0xbdd58000}, {0xbdd5a000}, {0xbdd5c000}, {0xbdd5e000}, 
-    {0xbdd60000}, {0xbdd62000}, {0xbdd64000}, {0xbdd66000}, 
-    {0xbdd68000}, {0xbdd6a000}, {0xbdd6c000}, {0xbdd6e000}, 
-    {0xbdd70000}, {0xbdd72000}, {0xbdd74000}, {0xbdd76000}, 
-    {0xbdd78000}, {0xbdd7a000}, {0xbdd7c000}, {0xbdd7e000}, 
-    {0xbdd80000}, {0xbdd82000}, {0xbdd84000}, {0xbdd86000}, 
-    {0xbdd88000}, {0xbdd8a000}, {0xbdd8c000}, {0xbdd8e000}, 
-    {0xbdd90000}, {0xbdd92000}, {0xbdd94000}, {0xbdd96000}, 
-    {0xbdd98000}, {0xbdd9a000}, {0xbdd9c000}, {0xbdd9e000}, 
-    {0xbdda0000}, {0xbdda2000}, {0xbdda4000}, {0xbdda6000}, 
-    {0xbdda8000}, {0xbddaa000}, {0xbddac000}, {0xbddae000}, 
-    {0xbddb0000}, {0xbddb2000}, {0xbddb4000}, {0xbddb6000}, 
-    {0xbddb8000}, {0xbddba000}, {0xbddbc000}, {0xbddbe000}, 
-    {0xbddc0000}, {0xbddc2000}, {0xbddc4000}, {0xbddc6000}, 
-    {0xbddc8000}, {0xbddca000}, {0xbddcc000}, {0xbddce000}, 
-    {0xbddd0000}, {0xbddd2000}, {0xbddd4000}, {0xbddd6000}, 
-    {0xbddd8000}, {0xbddda000}, {0xbdddc000}, {0xbddde000}, 
-    {0xbdde0000}, {0xbdde2000}, {0xbdde4000}, {0xbdde6000}, 
-    {0xbdde8000}, {0xbddea000}, {0xbddec000}, {0xbddee000}, 
-    {0xbddf0000}, {0xbddf2000}, {0xbddf4000}, {0xbddf6000}, 
-    {0xbddf8000}, {0xbddfa000}, {0xbddfc000}, {0xbddfe000}, 
-    {0xbde00000}, {0xbde02000}, {0xbde04000}, {0xbde06000}, 
-    {0xbde08000}, {0xbde0a000}, {0xbde0c000}, {0xbde0e000}, 
-    {0xbde10000}, {0xbde12000}, {0xbde14000}, {0xbde16000}, 
-    {0xbde18000}, {0xbde1a000}, {0xbde1c000}, {0xbde1e000}, 
-    {0xbde20000}, {0xbde22000}, {0xbde24000}, {0xbde26000}, 
-    {0xbde28000}, {0xbde2a000}, {0xbde2c000}, {0xbde2e000}, 
-    {0xbde30000}, {0xbde32000}, {0xbde34000}, {0xbde36000}, 
-    {0xbde38000}, {0xbde3a000}, {0xbde3c000}, {0xbde3e000}, 
-    {0xbde40000}, {0xbde42000}, {0xbde44000}, {0xbde46000}, 
-    {0xbde48000}, {0xbde4a000}, {0xbde4c000}, {0xbde4e000}, 
-    {0xbde50000}, {0xbde52000}, {0xbde54000}, {0xbde56000}, 
-    {0xbde58000}, {0xbde5a000}, {0xbde5c000}, {0xbde5e000}, 
-    {0xbde60000}, {0xbde62000}, {0xbde64000}, {0xbde66000}, 
-    {0xbde68000}, {0xbde6a000}, {0xbde6c000}, {0xbde6e000}, 
-    {0xbde70000}, {0xbde72000}, {0xbde74000}, {0xbde76000}, 
-    {0xbde78000}, {0xbde7a000}, {0xbde7c000}, {0xbde7e000}, 
-    {0xbde80000}, {0xbde82000}, {0xbde84000}, {0xbde86000}, 
-    {0xbde88000}, {0xbde8a000}, {0xbde8c000}, {0xbde8e000}, 
-    {0xbde90000}, {0xbde92000}, {0xbde94000}, {0xbde96000}, 
-    {0xbde98000}, {0xbde9a000}, {0xbde9c000}, {0xbde9e000}, 
-    {0xbdea0000}, {0xbdea2000}, {0xbdea4000}, {0xbdea6000}, 
-    {0xbdea8000}, {0xbdeaa000}, {0xbdeac000}, {0xbdeae000}, 
-    {0xbdeb0000}, {0xbdeb2000}, {0xbdeb4000}, {0xbdeb6000}, 
-    {0xbdeb8000}, {0xbdeba000}, {0xbdebc000}, {0xbdebe000}, 
-    {0xbdec0000}, {0xbdec2000}, {0xbdec4000}, {0xbdec6000}, 
-    {0xbdec8000}, {0xbdeca000}, {0xbdecc000}, {0xbdece000}, 
-    {0xbded0000}, {0xbded2000}, {0xbded4000}, {0xbded6000}, 
-    {0xbded8000}, {0xbdeda000}, {0xbdedc000}, {0xbdede000}, 
-    {0xbdee0000}, {0xbdee2000}, {0xbdee4000}, {0xbdee6000}, 
-    {0xbdee8000}, {0xbdeea000}, {0xbdeec000}, {0xbdeee000}, 
-    {0xbdef0000}, {0xbdef2000}, {0xbdef4000}, {0xbdef6000}, 
-    {0xbdef8000}, {0xbdefa000}, {0xbdefc000}, {0xbdefe000}, 
-    {0xbdf00000}, {0xbdf02000}, {0xbdf04000}, {0xbdf06000}, 
-    {0xbdf08000}, {0xbdf0a000}, {0xbdf0c000}, {0xbdf0e000}, 
-    {0xbdf10000}, {0xbdf12000}, {0xbdf14000}, {0xbdf16000}, 
-    {0xbdf18000}, {0xbdf1a000}, {0xbdf1c000}, {0xbdf1e000}, 
-    {0xbdf20000}, {0xbdf22000}, {0xbdf24000}, {0xbdf26000}, 
-    {0xbdf28000}, {0xbdf2a000}, {0xbdf2c000}, {0xbdf2e000}, 
-    {0xbdf30000}, {0xbdf32000}, {0xbdf34000}, {0xbdf36000}, 
-    {0xbdf38000}, {0xbdf3a000}, {0xbdf3c000}, {0xbdf3e000}, 
-    {0xbdf40000}, {0xbdf42000}, {0xbdf44000}, {0xbdf46000}, 
-    {0xbdf48000}, {0xbdf4a000}, {0xbdf4c000}, {0xbdf4e000}, 
-    {0xbdf50000}, {0xbdf52000}, {0xbdf54000}, {0xbdf56000}, 
-    {0xbdf58000}, {0xbdf5a000}, {0xbdf5c000}, {0xbdf5e000}, 
-    {0xbdf60000}, {0xbdf62000}, {0xbdf64000}, {0xbdf66000}, 
-    {0xbdf68000}, {0xbdf6a000}, {0xbdf6c000}, {0xbdf6e000}, 
-    {0xbdf70000}, {0xbdf72000}, {0xbdf74000}, {0xbdf76000}, 
-    {0xbdf78000}, {0xbdf7a000}, {0xbdf7c000}, {0xbdf7e000}, 
-    {0xbdf80000}, {0xbdf82000}, {0xbdf84000}, {0xbdf86000}, 
-    {0xbdf88000}, {0xbdf8a000}, {0xbdf8c000}, {0xbdf8e000}, 
-    {0xbdf90000}, {0xbdf92000}, {0xbdf94000}, {0xbdf96000}, 
-    {0xbdf98000}, {0xbdf9a000}, {0xbdf9c000}, {0xbdf9e000}, 
-    {0xbdfa0000}, {0xbdfa2000}, {0xbdfa4000}, {0xbdfa6000}, 
-    {0xbdfa8000}, {0xbdfaa000}, {0xbdfac000}, {0xbdfae000}, 
-    {0xbdfb0000}, {0xbdfb2000}, {0xbdfb4000}, {0xbdfb6000}, 
-    {0xbdfb8000}, {0xbdfba000}, {0xbdfbc000}, {0xbdfbe000}, 
-    {0xbdfc0000}, {0xbdfc2000}, {0xbdfc4000}, {0xbdfc6000}, 
-    {0xbdfc8000}, {0xbdfca000}, {0xbdfcc000}, {0xbdfce000}, 
-    {0xbdfd0000}, {0xbdfd2000}, {0xbdfd4000}, {0xbdfd6000}, 
-    {0xbdfd8000}, {0xbdfda000}, {0xbdfdc000}, {0xbdfde000}, 
-    {0xbdfe0000}, {0xbdfe2000}, {0xbdfe4000}, {0xbdfe6000}, 
-    {0xbdfe8000}, {0xbdfea000}, {0xbdfec000}, {0xbdfee000}, 
-    {0xbdff0000}, {0xbdff2000}, {0xbdff4000}, {0xbdff6000}, 
-    {0xbdff8000}, {0xbdffa000}, {0xbdffc000}, {0xbdffe000}, 
-    {0xbe000000}, {0xbe002000}, {0xbe004000}, {0xbe006000}, 
-    {0xbe008000}, {0xbe00a000}, {0xbe00c000}, {0xbe00e000}, 
-    {0xbe010000}, {0xbe012000}, {0xbe014000}, {0xbe016000}, 
-    {0xbe018000}, {0xbe01a000}, {0xbe01c000}, {0xbe01e000}, 
-    {0xbe020000}, {0xbe022000}, {0xbe024000}, {0xbe026000}, 
-    {0xbe028000}, {0xbe02a000}, {0xbe02c000}, {0xbe02e000}, 
-    {0xbe030000}, {0xbe032000}, {0xbe034000}, {0xbe036000}, 
-    {0xbe038000}, {0xbe03a000}, {0xbe03c000}, {0xbe03e000}, 
-    {0xbe040000}, {0xbe042000}, {0xbe044000}, {0xbe046000}, 
-    {0xbe048000}, {0xbe04a000}, {0xbe04c000}, {0xbe04e000}, 
-    {0xbe050000}, {0xbe052000}, {0xbe054000}, {0xbe056000}, 
-    {0xbe058000}, {0xbe05a000}, {0xbe05c000}, {0xbe05e000}, 
-    {0xbe060000}, {0xbe062000}, {0xbe064000}, {0xbe066000}, 
-    {0xbe068000}, {0xbe06a000}, {0xbe06c000}, {0xbe06e000}, 
-    {0xbe070000}, {0xbe072000}, {0xbe074000}, {0xbe076000}, 
-    {0xbe078000}, {0xbe07a000}, {0xbe07c000}, {0xbe07e000}, 
-    {0xbe080000}, {0xbe082000}, {0xbe084000}, {0xbe086000}, 
-    {0xbe088000}, {0xbe08a000}, {0xbe08c000}, {0xbe08e000}, 
-    {0xbe090000}, {0xbe092000}, {0xbe094000}, {0xbe096000}, 
-    {0xbe098000}, {0xbe09a000}, {0xbe09c000}, {0xbe09e000}, 
-    {0xbe0a0000}, {0xbe0a2000}, {0xbe0a4000}, {0xbe0a6000}, 
-    {0xbe0a8000}, {0xbe0aa000}, {0xbe0ac000}, {0xbe0ae000}, 
-    {0xbe0b0000}, {0xbe0b2000}, {0xbe0b4000}, {0xbe0b6000}, 
-    {0xbe0b8000}, {0xbe0ba000}, {0xbe0bc000}, {0xbe0be000}, 
-    {0xbe0c0000}, {0xbe0c2000}, {0xbe0c4000}, {0xbe0c6000}, 
-    {0xbe0c8000}, {0xbe0ca000}, {0xbe0cc000}, {0xbe0ce000}, 
-    {0xbe0d0000}, {0xbe0d2000}, {0xbe0d4000}, {0xbe0d6000}, 
-    {0xbe0d8000}, {0xbe0da000}, {0xbe0dc000}, {0xbe0de000}, 
-    {0xbe0e0000}, {0xbe0e2000}, {0xbe0e4000}, {0xbe0e6000}, 
-    {0xbe0e8000}, {0xbe0ea000}, {0xbe0ec000}, {0xbe0ee000}, 
-    {0xbe0f0000}, {0xbe0f2000}, {0xbe0f4000}, {0xbe0f6000}, 
-    {0xbe0f8000}, {0xbe0fa000}, {0xbe0fc000}, {0xbe0fe000}, 
-    {0xbe100000}, {0xbe102000}, {0xbe104000}, {0xbe106000}, 
-    {0xbe108000}, {0xbe10a000}, {0xbe10c000}, {0xbe10e000}, 
-    {0xbe110000}, {0xbe112000}, {0xbe114000}, {0xbe116000}, 
-    {0xbe118000}, {0xbe11a000}, {0xbe11c000}, {0xbe11e000}, 
-    {0xbe120000}, {0xbe122000}, {0xbe124000}, {0xbe126000}, 
-    {0xbe128000}, {0xbe12a000}, {0xbe12c000}, {0xbe12e000}, 
-    {0xbe130000}, {0xbe132000}, {0xbe134000}, {0xbe136000}, 
-    {0xbe138000}, {0xbe13a000}, {0xbe13c000}, {0xbe13e000}, 
-    {0xbe140000}, {0xbe142000}, {0xbe144000}, {0xbe146000}, 
-    {0xbe148000}, {0xbe14a000}, {0xbe14c000}, {0xbe14e000}, 
-    {0xbe150000}, {0xbe152000}, {0xbe154000}, {0xbe156000}, 
-    {0xbe158000}, {0xbe15a000}, {0xbe15c000}, {0xbe15e000}, 
-    {0xbe160000}, {0xbe162000}, {0xbe164000}, {0xbe166000}, 
-    {0xbe168000}, {0xbe16a000}, {0xbe16c000}, {0xbe16e000}, 
-    {0xbe170000}, {0xbe172000}, {0xbe174000}, {0xbe176000}, 
-    {0xbe178000}, {0xbe17a000}, {0xbe17c000}, {0xbe17e000}, 
-    {0xbe180000}, {0xbe182000}, {0xbe184000}, {0xbe186000}, 
-    {0xbe188000}, {0xbe18a000}, {0xbe18c000}, {0xbe18e000}, 
-    {0xbe190000}, {0xbe192000}, {0xbe194000}, {0xbe196000}, 
-    {0xbe198000}, {0xbe19a000}, {0xbe19c000}, {0xbe19e000}, 
-    {0xbe1a0000}, {0xbe1a2000}, {0xbe1a4000}, {0xbe1a6000}, 
-    {0xbe1a8000}, {0xbe1aa000}, {0xbe1ac000}, {0xbe1ae000}, 
-    {0xbe1b0000}, {0xbe1b2000}, {0xbe1b4000}, {0xbe1b6000}, 
-    {0xbe1b8000}, {0xbe1ba000}, {0xbe1bc000}, {0xbe1be000}, 
-    {0xbe1c0000}, {0xbe1c2000}, {0xbe1c4000}, {0xbe1c6000}, 
-    {0xbe1c8000}, {0xbe1ca000}, {0xbe1cc000}, {0xbe1ce000}, 
-    {0xbe1d0000}, {0xbe1d2000}, {0xbe1d4000}, {0xbe1d6000}, 
-    {0xbe1d8000}, {0xbe1da000}, {0xbe1dc000}, {0xbe1de000}, 
-    {0xbe1e0000}, {0xbe1e2000}, {0xbe1e4000}, {0xbe1e6000}, 
-    {0xbe1e8000}, {0xbe1ea000}, {0xbe1ec000}, {0xbe1ee000}, 
-    {0xbe1f0000}, {0xbe1f2000}, {0xbe1f4000}, {0xbe1f6000}, 
-    {0xbe1f8000}, {0xbe1fa000}, {0xbe1fc000}, {0xbe1fe000}, 
-    {0xbe200000}, {0xbe202000}, {0xbe204000}, {0xbe206000}, 
-    {0xbe208000}, {0xbe20a000}, {0xbe20c000}, {0xbe20e000}, 
-    {0xbe210000}, {0xbe212000}, {0xbe214000}, {0xbe216000}, 
-    {0xbe218000}, {0xbe21a000}, {0xbe21c000}, {0xbe21e000}, 
-    {0xbe220000}, {0xbe222000}, {0xbe224000}, {0xbe226000}, 
-    {0xbe228000}, {0xbe22a000}, {0xbe22c000}, {0xbe22e000}, 
-    {0xbe230000}, {0xbe232000}, {0xbe234000}, {0xbe236000}, 
-    {0xbe238000}, {0xbe23a000}, {0xbe23c000}, {0xbe23e000}, 
-    {0xbe240000}, {0xbe242000}, {0xbe244000}, {0xbe246000}, 
-    {0xbe248000}, {0xbe24a000}, {0xbe24c000}, {0xbe24e000}, 
-    {0xbe250000}, {0xbe252000}, {0xbe254000}, {0xbe256000}, 
-    {0xbe258000}, {0xbe25a000}, {0xbe25c000}, {0xbe25e000}, 
-    {0xbe260000}, {0xbe262000}, {0xbe264000}, {0xbe266000}, 
-    {0xbe268000}, {0xbe26a000}, {0xbe26c000}, {0xbe26e000}, 
-    {0xbe270000}, {0xbe272000}, {0xbe274000}, {0xbe276000}, 
-    {0xbe278000}, {0xbe27a000}, {0xbe27c000}, {0xbe27e000}, 
-    {0xbe280000}, {0xbe282000}, {0xbe284000}, {0xbe286000}, 
-    {0xbe288000}, {0xbe28a000}, {0xbe28c000}, {0xbe28e000}, 
-    {0xbe290000}, {0xbe292000}, {0xbe294000}, {0xbe296000}, 
-    {0xbe298000}, {0xbe29a000}, {0xbe29c000}, {0xbe29e000}, 
-    {0xbe2a0000}, {0xbe2a2000}, {0xbe2a4000}, {0xbe2a6000}, 
-    {0xbe2a8000}, {0xbe2aa000}, {0xbe2ac000}, {0xbe2ae000}, 
-    {0xbe2b0000}, {0xbe2b2000}, {0xbe2b4000}, {0xbe2b6000}, 
-    {0xbe2b8000}, {0xbe2ba000}, {0xbe2bc000}, {0xbe2be000}, 
-    {0xbe2c0000}, {0xbe2c2000}, {0xbe2c4000}, {0xbe2c6000}, 
-    {0xbe2c8000}, {0xbe2ca000}, {0xbe2cc000}, {0xbe2ce000}, 
-    {0xbe2d0000}, {0xbe2d2000}, {0xbe2d4000}, {0xbe2d6000}, 
-    {0xbe2d8000}, {0xbe2da000}, {0xbe2dc000}, {0xbe2de000}, 
-    {0xbe2e0000}, {0xbe2e2000}, {0xbe2e4000}, {0xbe2e6000}, 
-    {0xbe2e8000}, {0xbe2ea000}, {0xbe2ec000}, {0xbe2ee000}, 
-    {0xbe2f0000}, {0xbe2f2000}, {0xbe2f4000}, {0xbe2f6000}, 
-    {0xbe2f8000}, {0xbe2fa000}, {0xbe2fc000}, {0xbe2fe000}, 
-    {0xbe300000}, {0xbe302000}, {0xbe304000}, {0xbe306000}, 
-    {0xbe308000}, {0xbe30a000}, {0xbe30c000}, {0xbe30e000}, 
-    {0xbe310000}, {0xbe312000}, {0xbe314000}, {0xbe316000}, 
-    {0xbe318000}, {0xbe31a000}, {0xbe31c000}, {0xbe31e000}, 
-    {0xbe320000}, {0xbe322000}, {0xbe324000}, {0xbe326000}, 
-    {0xbe328000}, {0xbe32a000}, {0xbe32c000}, {0xbe32e000}, 
-    {0xbe330000}, {0xbe332000}, {0xbe334000}, {0xbe336000}, 
-    {0xbe338000}, {0xbe33a000}, {0xbe33c000}, {0xbe33e000}, 
-    {0xbe340000}, {0xbe342000}, {0xbe344000}, {0xbe346000}, 
-    {0xbe348000}, {0xbe34a000}, {0xbe34c000}, {0xbe34e000}, 
-    {0xbe350000}, {0xbe352000}, {0xbe354000}, {0xbe356000}, 
-    {0xbe358000}, {0xbe35a000}, {0xbe35c000}, {0xbe35e000}, 
-    {0xbe360000}, {0xbe362000}, {0xbe364000}, {0xbe366000}, 
-    {0xbe368000}, {0xbe36a000}, {0xbe36c000}, {0xbe36e000}, 
-    {0xbe370000}, {0xbe372000}, {0xbe374000}, {0xbe376000}, 
-    {0xbe378000}, {0xbe37a000}, {0xbe37c000}, {0xbe37e000}, 
-    {0xbe380000}, {0xbe382000}, {0xbe384000}, {0xbe386000}, 
-    {0xbe388000}, {0xbe38a000}, {0xbe38c000}, {0xbe38e000}, 
-    {0xbe390000}, {0xbe392000}, {0xbe394000}, {0xbe396000}, 
-    {0xbe398000}, {0xbe39a000}, {0xbe39c000}, {0xbe39e000}, 
-    {0xbe3a0000}, {0xbe3a2000}, {0xbe3a4000}, {0xbe3a6000}, 
-    {0xbe3a8000}, {0xbe3aa000}, {0xbe3ac000}, {0xbe3ae000}, 
-    {0xbe3b0000}, {0xbe3b2000}, {0xbe3b4000}, {0xbe3b6000}, 
-    {0xbe3b8000}, {0xbe3ba000}, {0xbe3bc000}, {0xbe3be000}, 
-    {0xbe3c0000}, {0xbe3c2000}, {0xbe3c4000}, {0xbe3c6000}, 
-    {0xbe3c8000}, {0xbe3ca000}, {0xbe3cc000}, {0xbe3ce000}, 
-    {0xbe3d0000}, {0xbe3d2000}, {0xbe3d4000}, {0xbe3d6000}, 
-    {0xbe3d8000}, {0xbe3da000}, {0xbe3dc000}, {0xbe3de000}, 
-    {0xbe3e0000}, {0xbe3e2000}, {0xbe3e4000}, {0xbe3e6000}, 
-    {0xbe3e8000}, {0xbe3ea000}, {0xbe3ec000}, {0xbe3ee000}, 
-    {0xbe3f0000}, {0xbe3f2000}, {0xbe3f4000}, {0xbe3f6000}, 
-    {0xbe3f8000}, {0xbe3fa000}, {0xbe3fc000}, {0xbe3fe000}, 
-    {0xbe400000}, {0xbe402000}, {0xbe404000}, {0xbe406000}, 
-    {0xbe408000}, {0xbe40a000}, {0xbe40c000}, {0xbe40e000}, 
-    {0xbe410000}, {0xbe412000}, {0xbe414000}, {0xbe416000}, 
-    {0xbe418000}, {0xbe41a000}, {0xbe41c000}, {0xbe41e000}, 
-    {0xbe420000}, {0xbe422000}, {0xbe424000}, {0xbe426000}, 
-    {0xbe428000}, {0xbe42a000}, {0xbe42c000}, {0xbe42e000}, 
-    {0xbe430000}, {0xbe432000}, {0xbe434000}, {0xbe436000}, 
-    {0xbe438000}, {0xbe43a000}, {0xbe43c000}, {0xbe43e000}, 
-    {0xbe440000}, {0xbe442000}, {0xbe444000}, {0xbe446000}, 
-    {0xbe448000}, {0xbe44a000}, {0xbe44c000}, {0xbe44e000}, 
-    {0xbe450000}, {0xbe452000}, {0xbe454000}, {0xbe456000}, 
-    {0xbe458000}, {0xbe45a000}, {0xbe45c000}, {0xbe45e000}, 
-    {0xbe460000}, {0xbe462000}, {0xbe464000}, {0xbe466000}, 
-    {0xbe468000}, {0xbe46a000}, {0xbe46c000}, {0xbe46e000}, 
-    {0xbe470000}, {0xbe472000}, {0xbe474000}, {0xbe476000}, 
-    {0xbe478000}, {0xbe47a000}, {0xbe47c000}, {0xbe47e000}, 
-    {0xbe480000}, {0xbe482000}, {0xbe484000}, {0xbe486000}, 
-    {0xbe488000}, {0xbe48a000}, {0xbe48c000}, {0xbe48e000}, 
-    {0xbe490000}, {0xbe492000}, {0xbe494000}, {0xbe496000}, 
-    {0xbe498000}, {0xbe49a000}, {0xbe49c000}, {0xbe49e000}, 
-    {0xbe4a0000}, {0xbe4a2000}, {0xbe4a4000}, {0xbe4a6000}, 
-    {0xbe4a8000}, {0xbe4aa000}, {0xbe4ac000}, {0xbe4ae000}, 
-    {0xbe4b0000}, {0xbe4b2000}, {0xbe4b4000}, {0xbe4b6000}, 
-    {0xbe4b8000}, {0xbe4ba000}, {0xbe4bc000}, {0xbe4be000}, 
-    {0xbe4c0000}, {0xbe4c2000}, {0xbe4c4000}, {0xbe4c6000}, 
-    {0xbe4c8000}, {0xbe4ca000}, {0xbe4cc000}, {0xbe4ce000}, 
-    {0xbe4d0000}, {0xbe4d2000}, {0xbe4d4000}, {0xbe4d6000}, 
-    {0xbe4d8000}, {0xbe4da000}, {0xbe4dc000}, {0xbe4de000}, 
-    {0xbe4e0000}, {0xbe4e2000}, {0xbe4e4000}, {0xbe4e6000}, 
-    {0xbe4e8000}, {0xbe4ea000}, {0xbe4ec000}, {0xbe4ee000}, 
-    {0xbe4f0000}, {0xbe4f2000}, {0xbe4f4000}, {0xbe4f6000}, 
-    {0xbe4f8000}, {0xbe4fa000}, {0xbe4fc000}, {0xbe4fe000}, 
-    {0xbe500000}, {0xbe502000}, {0xbe504000}, {0xbe506000}, 
-    {0xbe508000}, {0xbe50a000}, {0xbe50c000}, {0xbe50e000}, 
-    {0xbe510000}, {0xbe512000}, {0xbe514000}, {0xbe516000}, 
-    {0xbe518000}, {0xbe51a000}, {0xbe51c000}, {0xbe51e000}, 
-    {0xbe520000}, {0xbe522000}, {0xbe524000}, {0xbe526000}, 
-    {0xbe528000}, {0xbe52a000}, {0xbe52c000}, {0xbe52e000}, 
-    {0xbe530000}, {0xbe532000}, {0xbe534000}, {0xbe536000}, 
-    {0xbe538000}, {0xbe53a000}, {0xbe53c000}, {0xbe53e000}, 
-    {0xbe540000}, {0xbe542000}, {0xbe544000}, {0xbe546000}, 
-    {0xbe548000}, {0xbe54a000}, {0xbe54c000}, {0xbe54e000}, 
-    {0xbe550000}, {0xbe552000}, {0xbe554000}, {0xbe556000}, 
-    {0xbe558000}, {0xbe55a000}, {0xbe55c000}, {0xbe55e000}, 
-    {0xbe560000}, {0xbe562000}, {0xbe564000}, {0xbe566000}, 
-    {0xbe568000}, {0xbe56a000}, {0xbe56c000}, {0xbe56e000}, 
-    {0xbe570000}, {0xbe572000}, {0xbe574000}, {0xbe576000}, 
-    {0xbe578000}, {0xbe57a000}, {0xbe57c000}, {0xbe57e000}, 
-    {0xbe580000}, {0xbe582000}, {0xbe584000}, {0xbe586000}, 
-    {0xbe588000}, {0xbe58a000}, {0xbe58c000}, {0xbe58e000}, 
-    {0xbe590000}, {0xbe592000}, {0xbe594000}, {0xbe596000}, 
-    {0xbe598000}, {0xbe59a000}, {0xbe59c000}, {0xbe59e000}, 
-    {0xbe5a0000}, {0xbe5a2000}, {0xbe5a4000}, {0xbe5a6000}, 
-    {0xbe5a8000}, {0xbe5aa000}, {0xbe5ac000}, {0xbe5ae000}, 
-    {0xbe5b0000}, {0xbe5b2000}, {0xbe5b4000}, {0xbe5b6000}, 
-    {0xbe5b8000}, {0xbe5ba000}, {0xbe5bc000}, {0xbe5be000}, 
-    {0xbe5c0000}, {0xbe5c2000}, {0xbe5c4000}, {0xbe5c6000}, 
-    {0xbe5c8000}, {0xbe5ca000}, {0xbe5cc000}, {0xbe5ce000}, 
-    {0xbe5d0000}, {0xbe5d2000}, {0xbe5d4000}, {0xbe5d6000}, 
-    {0xbe5d8000}, {0xbe5da000}, {0xbe5dc000}, {0xbe5de000}, 
-    {0xbe5e0000}, {0xbe5e2000}, {0xbe5e4000}, {0xbe5e6000}, 
-    {0xbe5e8000}, {0xbe5ea000}, {0xbe5ec000}, {0xbe5ee000}, 
-    {0xbe5f0000}, {0xbe5f2000}, {0xbe5f4000}, {0xbe5f6000}, 
-    {0xbe5f8000}, {0xbe5fa000}, {0xbe5fc000}, {0xbe5fe000}, 
-    {0xbe600000}, {0xbe602000}, {0xbe604000}, {0xbe606000}, 
-    {0xbe608000}, {0xbe60a000}, {0xbe60c000}, {0xbe60e000}, 
-    {0xbe610000}, {0xbe612000}, {0xbe614000}, {0xbe616000}, 
-    {0xbe618000}, {0xbe61a000}, {0xbe61c000}, {0xbe61e000}, 
-    {0xbe620000}, {0xbe622000}, {0xbe624000}, {0xbe626000}, 
-    {0xbe628000}, {0xbe62a000}, {0xbe62c000}, {0xbe62e000}, 
-    {0xbe630000}, {0xbe632000}, {0xbe634000}, {0xbe636000}, 
-    {0xbe638000}, {0xbe63a000}, {0xbe63c000}, {0xbe63e000}, 
-    {0xbe640000}, {0xbe642000}, {0xbe644000}, {0xbe646000}, 
-    {0xbe648000}, {0xbe64a000}, {0xbe64c000}, {0xbe64e000}, 
-    {0xbe650000}, {0xbe652000}, {0xbe654000}, {0xbe656000}, 
-    {0xbe658000}, {0xbe65a000}, {0xbe65c000}, {0xbe65e000}, 
-    {0xbe660000}, {0xbe662000}, {0xbe664000}, {0xbe666000}, 
-    {0xbe668000}, {0xbe66a000}, {0xbe66c000}, {0xbe66e000}, 
-    {0xbe670000}, {0xbe672000}, {0xbe674000}, {0xbe676000}, 
-    {0xbe678000}, {0xbe67a000}, {0xbe67c000}, {0xbe67e000}, 
-    {0xbe680000}, {0xbe682000}, {0xbe684000}, {0xbe686000}, 
-    {0xbe688000}, {0xbe68a000}, {0xbe68c000}, {0xbe68e000}, 
-    {0xbe690000}, {0xbe692000}, {0xbe694000}, {0xbe696000}, 
-    {0xbe698000}, {0xbe69a000}, {0xbe69c000}, {0xbe69e000}, 
-    {0xbe6a0000}, {0xbe6a2000}, {0xbe6a4000}, {0xbe6a6000}, 
-    {0xbe6a8000}, {0xbe6aa000}, {0xbe6ac000}, {0xbe6ae000}, 
-    {0xbe6b0000}, {0xbe6b2000}, {0xbe6b4000}, {0xbe6b6000}, 
-    {0xbe6b8000}, {0xbe6ba000}, {0xbe6bc000}, {0xbe6be000}, 
-    {0xbe6c0000}, {0xbe6c2000}, {0xbe6c4000}, {0xbe6c6000}, 
-    {0xbe6c8000}, {0xbe6ca000}, {0xbe6cc000}, {0xbe6ce000}, 
-    {0xbe6d0000}, {0xbe6d2000}, {0xbe6d4000}, {0xbe6d6000}, 
-    {0xbe6d8000}, {0xbe6da000}, {0xbe6dc000}, {0xbe6de000}, 
-    {0xbe6e0000}, {0xbe6e2000}, {0xbe6e4000}, {0xbe6e6000}, 
-    {0xbe6e8000}, {0xbe6ea000}, {0xbe6ec000}, {0xbe6ee000}, 
-    {0xbe6f0000}, {0xbe6f2000}, {0xbe6f4000}, {0xbe6f6000}, 
-    {0xbe6f8000}, {0xbe6fa000}, {0xbe6fc000}, {0xbe6fe000}, 
-    {0xbe700000}, {0xbe702000}, {0xbe704000}, {0xbe706000}, 
-    {0xbe708000}, {0xbe70a000}, {0xbe70c000}, {0xbe70e000}, 
-    {0xbe710000}, {0xbe712000}, {0xbe714000}, {0xbe716000}, 
-    {0xbe718000}, {0xbe71a000}, {0xbe71c000}, {0xbe71e000}, 
-    {0xbe720000}, {0xbe722000}, {0xbe724000}, {0xbe726000}, 
-    {0xbe728000}, {0xbe72a000}, {0xbe72c000}, {0xbe72e000}, 
-    {0xbe730000}, {0xbe732000}, {0xbe734000}, {0xbe736000}, 
-    {0xbe738000}, {0xbe73a000}, {0xbe73c000}, {0xbe73e000}, 
-    {0xbe740000}, {0xbe742000}, {0xbe744000}, {0xbe746000}, 
-    {0xbe748000}, {0xbe74a000}, {0xbe74c000}, {0xbe74e000}, 
-    {0xbe750000}, {0xbe752000}, {0xbe754000}, {0xbe756000}, 
-    {0xbe758000}, {0xbe75a000}, {0xbe75c000}, {0xbe75e000}, 
-    {0xbe760000}, {0xbe762000}, {0xbe764000}, {0xbe766000}, 
-    {0xbe768000}, {0xbe76a000}, {0xbe76c000}, {0xbe76e000}, 
-    {0xbe770000}, {0xbe772000}, {0xbe774000}, {0xbe776000}, 
-    {0xbe778000}, {0xbe77a000}, {0xbe77c000}, {0xbe77e000}, 
-    {0xbe780000}, {0xbe782000}, {0xbe784000}, {0xbe786000}, 
-    {0xbe788000}, {0xbe78a000}, {0xbe78c000}, {0xbe78e000}, 
-    {0xbe790000}, {0xbe792000}, {0xbe794000}, {0xbe796000}, 
-    {0xbe798000}, {0xbe79a000}, {0xbe79c000}, {0xbe79e000}, 
-    {0xbe7a0000}, {0xbe7a2000}, {0xbe7a4000}, {0xbe7a6000}, 
-    {0xbe7a8000}, {0xbe7aa000}, {0xbe7ac000}, {0xbe7ae000}, 
-    {0xbe7b0000}, {0xbe7b2000}, {0xbe7b4000}, {0xbe7b6000}, 
-    {0xbe7b8000}, {0xbe7ba000}, {0xbe7bc000}, {0xbe7be000}, 
-    {0xbe7c0000}, {0xbe7c2000}, {0xbe7c4000}, {0xbe7c6000}, 
-    {0xbe7c8000}, {0xbe7ca000}, {0xbe7cc000}, {0xbe7ce000}, 
-    {0xbe7d0000}, {0xbe7d2000}, {0xbe7d4000}, {0xbe7d6000}, 
-    {0xbe7d8000}, {0xbe7da000}, {0xbe7dc000}, {0xbe7de000}, 
-    {0xbe7e0000}, {0xbe7e2000}, {0xbe7e4000}, {0xbe7e6000}, 
-    {0xbe7e8000}, {0xbe7ea000}, {0xbe7ec000}, {0xbe7ee000}, 
-    {0xbe7f0000}, {0xbe7f2000}, {0xbe7f4000}, {0xbe7f6000}, 
-    {0xbe7f8000}, {0xbe7fa000}, {0xbe7fc000}, {0xbe7fe000}, 
-    {0xbe800000}, {0xbe802000}, {0xbe804000}, {0xbe806000}, 
-    {0xbe808000}, {0xbe80a000}, {0xbe80c000}, {0xbe80e000}, 
-    {0xbe810000}, {0xbe812000}, {0xbe814000}, {0xbe816000}, 
-    {0xbe818000}, {0xbe81a000}, {0xbe81c000}, {0xbe81e000}, 
-    {0xbe820000}, {0xbe822000}, {0xbe824000}, {0xbe826000}, 
-    {0xbe828000}, {0xbe82a000}, {0xbe82c000}, {0xbe82e000}, 
-    {0xbe830000}, {0xbe832000}, {0xbe834000}, {0xbe836000}, 
-    {0xbe838000}, {0xbe83a000}, {0xbe83c000}, {0xbe83e000}, 
-    {0xbe840000}, {0xbe842000}, {0xbe844000}, {0xbe846000}, 
-    {0xbe848000}, {0xbe84a000}, {0xbe84c000}, {0xbe84e000}, 
-    {0xbe850000}, {0xbe852000}, {0xbe854000}, {0xbe856000}, 
-    {0xbe858000}, {0xbe85a000}, {0xbe85c000}, {0xbe85e000}, 
-    {0xbe860000}, {0xbe862000}, {0xbe864000}, {0xbe866000}, 
-    {0xbe868000}, {0xbe86a000}, {0xbe86c000}, {0xbe86e000}, 
-    {0xbe870000}, {0xbe872000}, {0xbe874000}, {0xbe876000}, 
-    {0xbe878000}, {0xbe87a000}, {0xbe87c000}, {0xbe87e000}, 
-    {0xbe880000}, {0xbe882000}, {0xbe884000}, {0xbe886000}, 
-    {0xbe888000}, {0xbe88a000}, {0xbe88c000}, {0xbe88e000}, 
-    {0xbe890000}, {0xbe892000}, {0xbe894000}, {0xbe896000}, 
-    {0xbe898000}, {0xbe89a000}, {0xbe89c000}, {0xbe89e000}, 
-    {0xbe8a0000}, {0xbe8a2000}, {0xbe8a4000}, {0xbe8a6000}, 
-    {0xbe8a8000}, {0xbe8aa000}, {0xbe8ac000}, {0xbe8ae000}, 
-    {0xbe8b0000}, {0xbe8b2000}, {0xbe8b4000}, {0xbe8b6000}, 
-    {0xbe8b8000}, {0xbe8ba000}, {0xbe8bc000}, {0xbe8be000}, 
-    {0xbe8c0000}, {0xbe8c2000}, {0xbe8c4000}, {0xbe8c6000}, 
-    {0xbe8c8000}, {0xbe8ca000}, {0xbe8cc000}, {0xbe8ce000}, 
-    {0xbe8d0000}, {0xbe8d2000}, {0xbe8d4000}, {0xbe8d6000}, 
-    {0xbe8d8000}, {0xbe8da000}, {0xbe8dc000}, {0xbe8de000}, 
-    {0xbe8e0000}, {0xbe8e2000}, {0xbe8e4000}, {0xbe8e6000}, 
-    {0xbe8e8000}, {0xbe8ea000}, {0xbe8ec000}, {0xbe8ee000}, 
-    {0xbe8f0000}, {0xbe8f2000}, {0xbe8f4000}, {0xbe8f6000}, 
-    {0xbe8f8000}, {0xbe8fa000}, {0xbe8fc000}, {0xbe8fe000}, 
-    {0xbe900000}, {0xbe902000}, {0xbe904000}, {0xbe906000}, 
-    {0xbe908000}, {0xbe90a000}, {0xbe90c000}, {0xbe90e000}, 
-    {0xbe910000}, {0xbe912000}, {0xbe914000}, {0xbe916000}, 
-    {0xbe918000}, {0xbe91a000}, {0xbe91c000}, {0xbe91e000}, 
-    {0xbe920000}, {0xbe922000}, {0xbe924000}, {0xbe926000}, 
-    {0xbe928000}, {0xbe92a000}, {0xbe92c000}, {0xbe92e000}, 
-    {0xbe930000}, {0xbe932000}, {0xbe934000}, {0xbe936000}, 
-    {0xbe938000}, {0xbe93a000}, {0xbe93c000}, {0xbe93e000}, 
-    {0xbe940000}, {0xbe942000}, {0xbe944000}, {0xbe946000}, 
-    {0xbe948000}, {0xbe94a000}, {0xbe94c000}, {0xbe94e000}, 
-    {0xbe950000}, {0xbe952000}, {0xbe954000}, {0xbe956000}, 
-    {0xbe958000}, {0xbe95a000}, {0xbe95c000}, {0xbe95e000}, 
-    {0xbe960000}, {0xbe962000}, {0xbe964000}, {0xbe966000}, 
-    {0xbe968000}, {0xbe96a000}, {0xbe96c000}, {0xbe96e000}, 
-    {0xbe970000}, {0xbe972000}, {0xbe974000}, {0xbe976000}, 
-    {0xbe978000}, {0xbe97a000}, {0xbe97c000}, {0xbe97e000}, 
-    {0xbe980000}, {0xbe982000}, {0xbe984000}, {0xbe986000}, 
-    {0xbe988000}, {0xbe98a000}, {0xbe98c000}, {0xbe98e000}, 
-    {0xbe990000}, {0xbe992000}, {0xbe994000}, {0xbe996000}, 
-    {0xbe998000}, {0xbe99a000}, {0xbe99c000}, {0xbe99e000}, 
-    {0xbe9a0000}, {0xbe9a2000}, {0xbe9a4000}, {0xbe9a6000}, 
-    {0xbe9a8000}, {0xbe9aa000}, {0xbe9ac000}, {0xbe9ae000}, 
-    {0xbe9b0000}, {0xbe9b2000}, {0xbe9b4000}, {0xbe9b6000}, 
-    {0xbe9b8000}, {0xbe9ba000}, {0xbe9bc000}, {0xbe9be000}, 
-    {0xbe9c0000}, {0xbe9c2000}, {0xbe9c4000}, {0xbe9c6000}, 
-    {0xbe9c8000}, {0xbe9ca000}, {0xbe9cc000}, {0xbe9ce000}, 
-    {0xbe9d0000}, {0xbe9d2000}, {0xbe9d4000}, {0xbe9d6000}, 
-    {0xbe9d8000}, {0xbe9da000}, {0xbe9dc000}, {0xbe9de000}, 
-    {0xbe9e0000}, {0xbe9e2000}, {0xbe9e4000}, {0xbe9e6000}, 
-    {0xbe9e8000}, {0xbe9ea000}, {0xbe9ec000}, {0xbe9ee000}, 
-    {0xbe9f0000}, {0xbe9f2000}, {0xbe9f4000}, {0xbe9f6000}, 
-    {0xbe9f8000}, {0xbe9fa000}, {0xbe9fc000}, {0xbe9fe000}, 
-    {0xbea00000}, {0xbea02000}, {0xbea04000}, {0xbea06000}, 
-    {0xbea08000}, {0xbea0a000}, {0xbea0c000}, {0xbea0e000}, 
-    {0xbea10000}, {0xbea12000}, {0xbea14000}, {0xbea16000}, 
-    {0xbea18000}, {0xbea1a000}, {0xbea1c000}, {0xbea1e000}, 
-    {0xbea20000}, {0xbea22000}, {0xbea24000}, {0xbea26000}, 
-    {0xbea28000}, {0xbea2a000}, {0xbea2c000}, {0xbea2e000}, 
-    {0xbea30000}, {0xbea32000}, {0xbea34000}, {0xbea36000}, 
-    {0xbea38000}, {0xbea3a000}, {0xbea3c000}, {0xbea3e000}, 
-    {0xbea40000}, {0xbea42000}, {0xbea44000}, {0xbea46000}, 
-    {0xbea48000}, {0xbea4a000}, {0xbea4c000}, {0xbea4e000}, 
-    {0xbea50000}, {0xbea52000}, {0xbea54000}, {0xbea56000}, 
-    {0xbea58000}, {0xbea5a000}, {0xbea5c000}, {0xbea5e000}, 
-    {0xbea60000}, {0xbea62000}, {0xbea64000}, {0xbea66000}, 
-    {0xbea68000}, {0xbea6a000}, {0xbea6c000}, {0xbea6e000}, 
-    {0xbea70000}, {0xbea72000}, {0xbea74000}, {0xbea76000}, 
-    {0xbea78000}, {0xbea7a000}, {0xbea7c000}, {0xbea7e000}, 
-    {0xbea80000}, {0xbea82000}, {0xbea84000}, {0xbea86000}, 
-    {0xbea88000}, {0xbea8a000}, {0xbea8c000}, {0xbea8e000}, 
-    {0xbea90000}, {0xbea92000}, {0xbea94000}, {0xbea96000}, 
-    {0xbea98000}, {0xbea9a000}, {0xbea9c000}, {0xbea9e000}, 
-    {0xbeaa0000}, {0xbeaa2000}, {0xbeaa4000}, {0xbeaa6000}, 
-    {0xbeaa8000}, {0xbeaaa000}, {0xbeaac000}, {0xbeaae000}, 
-    {0xbeab0000}, {0xbeab2000}, {0xbeab4000}, {0xbeab6000}, 
-    {0xbeab8000}, {0xbeaba000}, {0xbeabc000}, {0xbeabe000}, 
-    {0xbeac0000}, {0xbeac2000}, {0xbeac4000}, {0xbeac6000}, 
-    {0xbeac8000}, {0xbeaca000}, {0xbeacc000}, {0xbeace000}, 
-    {0xbead0000}, {0xbead2000}, {0xbead4000}, {0xbead6000}, 
-    {0xbead8000}, {0xbeada000}, {0xbeadc000}, {0xbeade000}, 
-    {0xbeae0000}, {0xbeae2000}, {0xbeae4000}, {0xbeae6000}, 
-    {0xbeae8000}, {0xbeaea000}, {0xbeaec000}, {0xbeaee000}, 
-    {0xbeaf0000}, {0xbeaf2000}, {0xbeaf4000}, {0xbeaf6000}, 
-    {0xbeaf8000}, {0xbeafa000}, {0xbeafc000}, {0xbeafe000}, 
-    {0xbeb00000}, {0xbeb02000}, {0xbeb04000}, {0xbeb06000}, 
-    {0xbeb08000}, {0xbeb0a000}, {0xbeb0c000}, {0xbeb0e000}, 
-    {0xbeb10000}, {0xbeb12000}, {0xbeb14000}, {0xbeb16000}, 
-    {0xbeb18000}, {0xbeb1a000}, {0xbeb1c000}, {0xbeb1e000}, 
-    {0xbeb20000}, {0xbeb22000}, {0xbeb24000}, {0xbeb26000}, 
-    {0xbeb28000}, {0xbeb2a000}, {0xbeb2c000}, {0xbeb2e000}, 
-    {0xbeb30000}, {0xbeb32000}, {0xbeb34000}, {0xbeb36000}, 
-    {0xbeb38000}, {0xbeb3a000}, {0xbeb3c000}, {0xbeb3e000}, 
-    {0xbeb40000}, {0xbeb42000}, {0xbeb44000}, {0xbeb46000}, 
-    {0xbeb48000}, {0xbeb4a000}, {0xbeb4c000}, {0xbeb4e000}, 
-    {0xbeb50000}, {0xbeb52000}, {0xbeb54000}, {0xbeb56000}, 
-    {0xbeb58000}, {0xbeb5a000}, {0xbeb5c000}, {0xbeb5e000}, 
-    {0xbeb60000}, {0xbeb62000}, {0xbeb64000}, {0xbeb66000}, 
-    {0xbeb68000}, {0xbeb6a000}, {0xbeb6c000}, {0xbeb6e000}, 
-    {0xbeb70000}, {0xbeb72000}, {0xbeb74000}, {0xbeb76000}, 
-    {0xbeb78000}, {0xbeb7a000}, {0xbeb7c000}, {0xbeb7e000}, 
-    {0xbeb80000}, {0xbeb82000}, {0xbeb84000}, {0xbeb86000}, 
-    {0xbeb88000}, {0xbeb8a000}, {0xbeb8c000}, {0xbeb8e000}, 
-    {0xbeb90000}, {0xbeb92000}, {0xbeb94000}, {0xbeb96000}, 
-    {0xbeb98000}, {0xbeb9a000}, {0xbeb9c000}, {0xbeb9e000}, 
-    {0xbeba0000}, {0xbeba2000}, {0xbeba4000}, {0xbeba6000}, 
-    {0xbeba8000}, {0xbebaa000}, {0xbebac000}, {0xbebae000}, 
-    {0xbebb0000}, {0xbebb2000}, {0xbebb4000}, {0xbebb6000}, 
-    {0xbebb8000}, {0xbebba000}, {0xbebbc000}, {0xbebbe000}, 
-    {0xbebc0000}, {0xbebc2000}, {0xbebc4000}, {0xbebc6000}, 
-    {0xbebc8000}, {0xbebca000}, {0xbebcc000}, {0xbebce000}, 
-    {0xbebd0000}, {0xbebd2000}, {0xbebd4000}, {0xbebd6000}, 
-    {0xbebd8000}, {0xbebda000}, {0xbebdc000}, {0xbebde000}, 
-    {0xbebe0000}, {0xbebe2000}, {0xbebe4000}, {0xbebe6000}, 
-    {0xbebe8000}, {0xbebea000}, {0xbebec000}, {0xbebee000}, 
-    {0xbebf0000}, {0xbebf2000}, {0xbebf4000}, {0xbebf6000}, 
-    {0xbebf8000}, {0xbebfa000}, {0xbebfc000}, {0xbebfe000}, 
-    {0xbec00000}, {0xbec02000}, {0xbec04000}, {0xbec06000}, 
-    {0xbec08000}, {0xbec0a000}, {0xbec0c000}, {0xbec0e000}, 
-    {0xbec10000}, {0xbec12000}, {0xbec14000}, {0xbec16000}, 
-    {0xbec18000}, {0xbec1a000}, {0xbec1c000}, {0xbec1e000}, 
-    {0xbec20000}, {0xbec22000}, {0xbec24000}, {0xbec26000}, 
-    {0xbec28000}, {0xbec2a000}, {0xbec2c000}, {0xbec2e000}, 
-    {0xbec30000}, {0xbec32000}, {0xbec34000}, {0xbec36000}, 
-    {0xbec38000}, {0xbec3a000}, {0xbec3c000}, {0xbec3e000}, 
-    {0xbec40000}, {0xbec42000}, {0xbec44000}, {0xbec46000}, 
-    {0xbec48000}, {0xbec4a000}, {0xbec4c000}, {0xbec4e000}, 
-    {0xbec50000}, {0xbec52000}, {0xbec54000}, {0xbec56000}, 
-    {0xbec58000}, {0xbec5a000}, {0xbec5c000}, {0xbec5e000}, 
-    {0xbec60000}, {0xbec62000}, {0xbec64000}, {0xbec66000}, 
-    {0xbec68000}, {0xbec6a000}, {0xbec6c000}, {0xbec6e000}, 
-    {0xbec70000}, {0xbec72000}, {0xbec74000}, {0xbec76000}, 
-    {0xbec78000}, {0xbec7a000}, {0xbec7c000}, {0xbec7e000}, 
-    {0xbec80000}, {0xbec82000}, {0xbec84000}, {0xbec86000}, 
-    {0xbec88000}, {0xbec8a000}, {0xbec8c000}, {0xbec8e000}, 
-    {0xbec90000}, {0xbec92000}, {0xbec94000}, {0xbec96000}, 
-    {0xbec98000}, {0xbec9a000}, {0xbec9c000}, {0xbec9e000}, 
-    {0xbeca0000}, {0xbeca2000}, {0xbeca4000}, {0xbeca6000}, 
-    {0xbeca8000}, {0xbecaa000}, {0xbecac000}, {0xbecae000}, 
-    {0xbecb0000}, {0xbecb2000}, {0xbecb4000}, {0xbecb6000}, 
-    {0xbecb8000}, {0xbecba000}, {0xbecbc000}, {0xbecbe000}, 
-    {0xbecc0000}, {0xbecc2000}, {0xbecc4000}, {0xbecc6000}, 
-    {0xbecc8000}, {0xbecca000}, {0xbeccc000}, {0xbecce000}, 
-    {0xbecd0000}, {0xbecd2000}, {0xbecd4000}, {0xbecd6000}, 
-    {0xbecd8000}, {0xbecda000}, {0xbecdc000}, {0xbecde000}, 
-    {0xbece0000}, {0xbece2000}, {0xbece4000}, {0xbece6000}, 
-    {0xbece8000}, {0xbecea000}, {0xbecec000}, {0xbecee000}, 
-    {0xbecf0000}, {0xbecf2000}, {0xbecf4000}, {0xbecf6000}, 
-    {0xbecf8000}, {0xbecfa000}, {0xbecfc000}, {0xbecfe000}, 
-    {0xbed00000}, {0xbed02000}, {0xbed04000}, {0xbed06000}, 
-    {0xbed08000}, {0xbed0a000}, {0xbed0c000}, {0xbed0e000}, 
-    {0xbed10000}, {0xbed12000}, {0xbed14000}, {0xbed16000}, 
-    {0xbed18000}, {0xbed1a000}, {0xbed1c000}, {0xbed1e000}, 
-    {0xbed20000}, {0xbed22000}, {0xbed24000}, {0xbed26000}, 
-    {0xbed28000}, {0xbed2a000}, {0xbed2c000}, {0xbed2e000}, 
-    {0xbed30000}, {0xbed32000}, {0xbed34000}, {0xbed36000}, 
-    {0xbed38000}, {0xbed3a000}, {0xbed3c000}, {0xbed3e000}, 
-    {0xbed40000}, {0xbed42000}, {0xbed44000}, {0xbed46000}, 
-    {0xbed48000}, {0xbed4a000}, {0xbed4c000}, {0xbed4e000}, 
-    {0xbed50000}, {0xbed52000}, {0xbed54000}, {0xbed56000}, 
-    {0xbed58000}, {0xbed5a000}, {0xbed5c000}, {0xbed5e000}, 
-    {0xbed60000}, {0xbed62000}, {0xbed64000}, {0xbed66000}, 
-    {0xbed68000}, {0xbed6a000}, {0xbed6c000}, {0xbed6e000}, 
-    {0xbed70000}, {0xbed72000}, {0xbed74000}, {0xbed76000}, 
-    {0xbed78000}, {0xbed7a000}, {0xbed7c000}, {0xbed7e000}, 
-    {0xbed80000}, {0xbed82000}, {0xbed84000}, {0xbed86000}, 
-    {0xbed88000}, {0xbed8a000}, {0xbed8c000}, {0xbed8e000}, 
-    {0xbed90000}, {0xbed92000}, {0xbed94000}, {0xbed96000}, 
-    {0xbed98000}, {0xbed9a000}, {0xbed9c000}, {0xbed9e000}, 
-    {0xbeda0000}, {0xbeda2000}, {0xbeda4000}, {0xbeda6000}, 
-    {0xbeda8000}, {0xbedaa000}, {0xbedac000}, {0xbedae000}, 
-    {0xbedb0000}, {0xbedb2000}, {0xbedb4000}, {0xbedb6000}, 
-    {0xbedb8000}, {0xbedba000}, {0xbedbc000}, {0xbedbe000}, 
-    {0xbedc0000}, {0xbedc2000}, {0xbedc4000}, {0xbedc6000}, 
-    {0xbedc8000}, {0xbedca000}, {0xbedcc000}, {0xbedce000}, 
-    {0xbedd0000}, {0xbedd2000}, {0xbedd4000}, {0xbedd6000}, 
-    {0xbedd8000}, {0xbedda000}, {0xbeddc000}, {0xbedde000}, 
-    {0xbede0000}, {0xbede2000}, {0xbede4000}, {0xbede6000}, 
-    {0xbede8000}, {0xbedea000}, {0xbedec000}, {0xbedee000}, 
-    {0xbedf0000}, {0xbedf2000}, {0xbedf4000}, {0xbedf6000}, 
-    {0xbedf8000}, {0xbedfa000}, {0xbedfc000}, {0xbedfe000}, 
-    {0xbee00000}, {0xbee02000}, {0xbee04000}, {0xbee06000}, 
-    {0xbee08000}, {0xbee0a000}, {0xbee0c000}, {0xbee0e000}, 
-    {0xbee10000}, {0xbee12000}, {0xbee14000}, {0xbee16000}, 
-    {0xbee18000}, {0xbee1a000}, {0xbee1c000}, {0xbee1e000}, 
-    {0xbee20000}, {0xbee22000}, {0xbee24000}, {0xbee26000}, 
-    {0xbee28000}, {0xbee2a000}, {0xbee2c000}, {0xbee2e000}, 
-    {0xbee30000}, {0xbee32000}, {0xbee34000}, {0xbee36000}, 
-    {0xbee38000}, {0xbee3a000}, {0xbee3c000}, {0xbee3e000}, 
-    {0xbee40000}, {0xbee42000}, {0xbee44000}, {0xbee46000}, 
-    {0xbee48000}, {0xbee4a000}, {0xbee4c000}, {0xbee4e000}, 
-    {0xbee50000}, {0xbee52000}, {0xbee54000}, {0xbee56000}, 
-    {0xbee58000}, {0xbee5a000}, {0xbee5c000}, {0xbee5e000}, 
-    {0xbee60000}, {0xbee62000}, {0xbee64000}, {0xbee66000}, 
-    {0xbee68000}, {0xbee6a000}, {0xbee6c000}, {0xbee6e000}, 
-    {0xbee70000}, {0xbee72000}, {0xbee74000}, {0xbee76000}, 
-    {0xbee78000}, {0xbee7a000}, {0xbee7c000}, {0xbee7e000}, 
-    {0xbee80000}, {0xbee82000}, {0xbee84000}, {0xbee86000}, 
-    {0xbee88000}, {0xbee8a000}, {0xbee8c000}, {0xbee8e000}, 
-    {0xbee90000}, {0xbee92000}, {0xbee94000}, {0xbee96000}, 
-    {0xbee98000}, {0xbee9a000}, {0xbee9c000}, {0xbee9e000}, 
-    {0xbeea0000}, {0xbeea2000}, {0xbeea4000}, {0xbeea6000}, 
-    {0xbeea8000}, {0xbeeaa000}, {0xbeeac000}, {0xbeeae000}, 
-    {0xbeeb0000}, {0xbeeb2000}, {0xbeeb4000}, {0xbeeb6000}, 
-    {0xbeeb8000}, {0xbeeba000}, {0xbeebc000}, {0xbeebe000}, 
-    {0xbeec0000}, {0xbeec2000}, {0xbeec4000}, {0xbeec6000}, 
-    {0xbeec8000}, {0xbeeca000}, {0xbeecc000}, {0xbeece000}, 
-    {0xbeed0000}, {0xbeed2000}, {0xbeed4000}, {0xbeed6000}, 
-    {0xbeed8000}, {0xbeeda000}, {0xbeedc000}, {0xbeede000}, 
-    {0xbeee0000}, {0xbeee2000}, {0xbeee4000}, {0xbeee6000}, 
-    {0xbeee8000}, {0xbeeea000}, {0xbeeec000}, {0xbeeee000}, 
-    {0xbeef0000}, {0xbeef2000}, {0xbeef4000}, {0xbeef6000}, 
-    {0xbeef8000}, {0xbeefa000}, {0xbeefc000}, {0xbeefe000}, 
-    {0xbef00000}, {0xbef02000}, {0xbef04000}, {0xbef06000}, 
-    {0xbef08000}, {0xbef0a000}, {0xbef0c000}, {0xbef0e000}, 
-    {0xbef10000}, {0xbef12000}, {0xbef14000}, {0xbef16000}, 
-    {0xbef18000}, {0xbef1a000}, {0xbef1c000}, {0xbef1e000}, 
-    {0xbef20000}, {0xbef22000}, {0xbef24000}, {0xbef26000}, 
-    {0xbef28000}, {0xbef2a000}, {0xbef2c000}, {0xbef2e000}, 
-    {0xbef30000}, {0xbef32000}, {0xbef34000}, {0xbef36000}, 
-    {0xbef38000}, {0xbef3a000}, {0xbef3c000}, {0xbef3e000}, 
-    {0xbef40000}, {0xbef42000}, {0xbef44000}, {0xbef46000}, 
-    {0xbef48000}, {0xbef4a000}, {0xbef4c000}, {0xbef4e000}, 
-    {0xbef50000}, {0xbef52000}, {0xbef54000}, {0xbef56000}, 
-    {0xbef58000}, {0xbef5a000}, {0xbef5c000}, {0xbef5e000}, 
-    {0xbef60000}, {0xbef62000}, {0xbef64000}, {0xbef66000}, 
-    {0xbef68000}, {0xbef6a000}, {0xbef6c000}, {0xbef6e000}, 
-    {0xbef70000}, {0xbef72000}, {0xbef74000}, {0xbef76000}, 
-    {0xbef78000}, {0xbef7a000}, {0xbef7c000}, {0xbef7e000}, 
-    {0xbef80000}, {0xbef82000}, {0xbef84000}, {0xbef86000}, 
-    {0xbef88000}, {0xbef8a000}, {0xbef8c000}, {0xbef8e000}, 
-    {0xbef90000}, {0xbef92000}, {0xbef94000}, {0xbef96000}, 
-    {0xbef98000}, {0xbef9a000}, {0xbef9c000}, {0xbef9e000}, 
-    {0xbefa0000}, {0xbefa2000}, {0xbefa4000}, {0xbefa6000}, 
-    {0xbefa8000}, {0xbefaa000}, {0xbefac000}, {0xbefae000}, 
-    {0xbefb0000}, {0xbefb2000}, {0xbefb4000}, {0xbefb6000}, 
-    {0xbefb8000}, {0xbefba000}, {0xbefbc000}, {0xbefbe000}, 
-    {0xbefc0000}, {0xbefc2000}, {0xbefc4000}, {0xbefc6000}, 
-    {0xbefc8000}, {0xbefca000}, {0xbefcc000}, {0xbefce000}, 
-    {0xbefd0000}, {0xbefd2000}, {0xbefd4000}, {0xbefd6000}, 
-    {0xbefd8000}, {0xbefda000}, {0xbefdc000}, {0xbefde000}, 
-    {0xbefe0000}, {0xbefe2000}, {0xbefe4000}, {0xbefe6000}, 
-    {0xbefe8000}, {0xbefea000}, {0xbefec000}, {0xbefee000}, 
-    {0xbeff0000}, {0xbeff2000}, {0xbeff4000}, {0xbeff6000}, 
-    {0xbeff8000}, {0xbeffa000}, {0xbeffc000}, {0xbeffe000}, 
-    {0xbf000000}, {0xbf002000}, {0xbf004000}, {0xbf006000}, 
-    {0xbf008000}, {0xbf00a000}, {0xbf00c000}, {0xbf00e000}, 
-    {0xbf010000}, {0xbf012000}, {0xbf014000}, {0xbf016000}, 
-    {0xbf018000}, {0xbf01a000}, {0xbf01c000}, {0xbf01e000}, 
-    {0xbf020000}, {0xbf022000}, {0xbf024000}, {0xbf026000}, 
-    {0xbf028000}, {0xbf02a000}, {0xbf02c000}, {0xbf02e000}, 
-    {0xbf030000}, {0xbf032000}, {0xbf034000}, {0xbf036000}, 
-    {0xbf038000}, {0xbf03a000}, {0xbf03c000}, {0xbf03e000}, 
-    {0xbf040000}, {0xbf042000}, {0xbf044000}, {0xbf046000}, 
-    {0xbf048000}, {0xbf04a000}, {0xbf04c000}, {0xbf04e000}, 
-    {0xbf050000}, {0xbf052000}, {0xbf054000}, {0xbf056000}, 
-    {0xbf058000}, {0xbf05a000}, {0xbf05c000}, {0xbf05e000}, 
-    {0xbf060000}, {0xbf062000}, {0xbf064000}, {0xbf066000}, 
-    {0xbf068000}, {0xbf06a000}, {0xbf06c000}, {0xbf06e000}, 
-    {0xbf070000}, {0xbf072000}, {0xbf074000}, {0xbf076000}, 
-    {0xbf078000}, {0xbf07a000}, {0xbf07c000}, {0xbf07e000}, 
-    {0xbf080000}, {0xbf082000}, {0xbf084000}, {0xbf086000}, 
-    {0xbf088000}, {0xbf08a000}, {0xbf08c000}, {0xbf08e000}, 
-    {0xbf090000}, {0xbf092000}, {0xbf094000}, {0xbf096000}, 
-    {0xbf098000}, {0xbf09a000}, {0xbf09c000}, {0xbf09e000}, 
-    {0xbf0a0000}, {0xbf0a2000}, {0xbf0a4000}, {0xbf0a6000}, 
-    {0xbf0a8000}, {0xbf0aa000}, {0xbf0ac000}, {0xbf0ae000}, 
-    {0xbf0b0000}, {0xbf0b2000}, {0xbf0b4000}, {0xbf0b6000}, 
-    {0xbf0b8000}, {0xbf0ba000}, {0xbf0bc000}, {0xbf0be000}, 
-    {0xbf0c0000}, {0xbf0c2000}, {0xbf0c4000}, {0xbf0c6000}, 
-    {0xbf0c8000}, {0xbf0ca000}, {0xbf0cc000}, {0xbf0ce000}, 
-    {0xbf0d0000}, {0xbf0d2000}, {0xbf0d4000}, {0xbf0d6000}, 
-    {0xbf0d8000}, {0xbf0da000}, {0xbf0dc000}, {0xbf0de000}, 
-    {0xbf0e0000}, {0xbf0e2000}, {0xbf0e4000}, {0xbf0e6000}, 
-    {0xbf0e8000}, {0xbf0ea000}, {0xbf0ec000}, {0xbf0ee000}, 
-    {0xbf0f0000}, {0xbf0f2000}, {0xbf0f4000}, {0xbf0f6000}, 
-    {0xbf0f8000}, {0xbf0fa000}, {0xbf0fc000}, {0xbf0fe000}, 
-    {0xbf100000}, {0xbf102000}, {0xbf104000}, {0xbf106000}, 
-    {0xbf108000}, {0xbf10a000}, {0xbf10c000}, {0xbf10e000}, 
-    {0xbf110000}, {0xbf112000}, {0xbf114000}, {0xbf116000}, 
-    {0xbf118000}, {0xbf11a000}, {0xbf11c000}, {0xbf11e000}, 
-    {0xbf120000}, {0xbf122000}, {0xbf124000}, {0xbf126000}, 
-    {0xbf128000}, {0xbf12a000}, {0xbf12c000}, {0xbf12e000}, 
-    {0xbf130000}, {0xbf132000}, {0xbf134000}, {0xbf136000}, 
-    {0xbf138000}, {0xbf13a000}, {0xbf13c000}, {0xbf13e000}, 
-    {0xbf140000}, {0xbf142000}, {0xbf144000}, {0xbf146000}, 
-    {0xbf148000}, {0xbf14a000}, {0xbf14c000}, {0xbf14e000}, 
-    {0xbf150000}, {0xbf152000}, {0xbf154000}, {0xbf156000}, 
-    {0xbf158000}, {0xbf15a000}, {0xbf15c000}, {0xbf15e000}, 
-    {0xbf160000}, {0xbf162000}, {0xbf164000}, {0xbf166000}, 
-    {0xbf168000}, {0xbf16a000}, {0xbf16c000}, {0xbf16e000}, 
-    {0xbf170000}, {0xbf172000}, {0xbf174000}, {0xbf176000}, 
-    {0xbf178000}, {0xbf17a000}, {0xbf17c000}, {0xbf17e000}, 
-    {0xbf180000}, {0xbf182000}, {0xbf184000}, {0xbf186000}, 
-    {0xbf188000}, {0xbf18a000}, {0xbf18c000}, {0xbf18e000}, 
-    {0xbf190000}, {0xbf192000}, {0xbf194000}, {0xbf196000}, 
-    {0xbf198000}, {0xbf19a000}, {0xbf19c000}, {0xbf19e000}, 
-    {0xbf1a0000}, {0xbf1a2000}, {0xbf1a4000}, {0xbf1a6000}, 
-    {0xbf1a8000}, {0xbf1aa000}, {0xbf1ac000}, {0xbf1ae000}, 
-    {0xbf1b0000}, {0xbf1b2000}, {0xbf1b4000}, {0xbf1b6000}, 
-    {0xbf1b8000}, {0xbf1ba000}, {0xbf1bc000}, {0xbf1be000}, 
-    {0xbf1c0000}, {0xbf1c2000}, {0xbf1c4000}, {0xbf1c6000}, 
-    {0xbf1c8000}, {0xbf1ca000}, {0xbf1cc000}, {0xbf1ce000}, 
-    {0xbf1d0000}, {0xbf1d2000}, {0xbf1d4000}, {0xbf1d6000}, 
-    {0xbf1d8000}, {0xbf1da000}, {0xbf1dc000}, {0xbf1de000}, 
-    {0xbf1e0000}, {0xbf1e2000}, {0xbf1e4000}, {0xbf1e6000}, 
-    {0xbf1e8000}, {0xbf1ea000}, {0xbf1ec000}, {0xbf1ee000}, 
-    {0xbf1f0000}, {0xbf1f2000}, {0xbf1f4000}, {0xbf1f6000}, 
-    {0xbf1f8000}, {0xbf1fa000}, {0xbf1fc000}, {0xbf1fe000}, 
-    {0xbf200000}, {0xbf202000}, {0xbf204000}, {0xbf206000}, 
-    {0xbf208000}, {0xbf20a000}, {0xbf20c000}, {0xbf20e000}, 
-    {0xbf210000}, {0xbf212000}, {0xbf214000}, {0xbf216000}, 
-    {0xbf218000}, {0xbf21a000}, {0xbf21c000}, {0xbf21e000}, 
-    {0xbf220000}, {0xbf222000}, {0xbf224000}, {0xbf226000}, 
-    {0xbf228000}, {0xbf22a000}, {0xbf22c000}, {0xbf22e000}, 
-    {0xbf230000}, {0xbf232000}, {0xbf234000}, {0xbf236000}, 
-    {0xbf238000}, {0xbf23a000}, {0xbf23c000}, {0xbf23e000}, 
-    {0xbf240000}, {0xbf242000}, {0xbf244000}, {0xbf246000}, 
-    {0xbf248000}, {0xbf24a000}, {0xbf24c000}, {0xbf24e000}, 
-    {0xbf250000}, {0xbf252000}, {0xbf254000}, {0xbf256000}, 
-    {0xbf258000}, {0xbf25a000}, {0xbf25c000}, {0xbf25e000}, 
-    {0xbf260000}, {0xbf262000}, {0xbf264000}, {0xbf266000}, 
-    {0xbf268000}, {0xbf26a000}, {0xbf26c000}, {0xbf26e000}, 
-    {0xbf270000}, {0xbf272000}, {0xbf274000}, {0xbf276000}, 
-    {0xbf278000}, {0xbf27a000}, {0xbf27c000}, {0xbf27e000}, 
-    {0xbf280000}, {0xbf282000}, {0xbf284000}, {0xbf286000}, 
-    {0xbf288000}, {0xbf28a000}, {0xbf28c000}, {0xbf28e000}, 
-    {0xbf290000}, {0xbf292000}, {0xbf294000}, {0xbf296000}, 
-    {0xbf298000}, {0xbf29a000}, {0xbf29c000}, {0xbf29e000}, 
-    {0xbf2a0000}, {0xbf2a2000}, {0xbf2a4000}, {0xbf2a6000}, 
-    {0xbf2a8000}, {0xbf2aa000}, {0xbf2ac000}, {0xbf2ae000}, 
-    {0xbf2b0000}, {0xbf2b2000}, {0xbf2b4000}, {0xbf2b6000}, 
-    {0xbf2b8000}, {0xbf2ba000}, {0xbf2bc000}, {0xbf2be000}, 
-    {0xbf2c0000}, {0xbf2c2000}, {0xbf2c4000}, {0xbf2c6000}, 
-    {0xbf2c8000}, {0xbf2ca000}, {0xbf2cc000}, {0xbf2ce000}, 
-    {0xbf2d0000}, {0xbf2d2000}, {0xbf2d4000}, {0xbf2d6000}, 
-    {0xbf2d8000}, {0xbf2da000}, {0xbf2dc000}, {0xbf2de000}, 
-    {0xbf2e0000}, {0xbf2e2000}, {0xbf2e4000}, {0xbf2e6000}, 
-    {0xbf2e8000}, {0xbf2ea000}, {0xbf2ec000}, {0xbf2ee000}, 
-    {0xbf2f0000}, {0xbf2f2000}, {0xbf2f4000}, {0xbf2f6000}, 
-    {0xbf2f8000}, {0xbf2fa000}, {0xbf2fc000}, {0xbf2fe000}, 
-    {0xbf300000}, {0xbf302000}, {0xbf304000}, {0xbf306000}, 
-    {0xbf308000}, {0xbf30a000}, {0xbf30c000}, {0xbf30e000}, 
-    {0xbf310000}, {0xbf312000}, {0xbf314000}, {0xbf316000}, 
-    {0xbf318000}, {0xbf31a000}, {0xbf31c000}, {0xbf31e000}, 
-    {0xbf320000}, {0xbf322000}, {0xbf324000}, {0xbf326000}, 
-    {0xbf328000}, {0xbf32a000}, {0xbf32c000}, {0xbf32e000}, 
-    {0xbf330000}, {0xbf332000}, {0xbf334000}, {0xbf336000}, 
-    {0xbf338000}, {0xbf33a000}, {0xbf33c000}, {0xbf33e000}, 
-    {0xbf340000}, {0xbf342000}, {0xbf344000}, {0xbf346000}, 
-    {0xbf348000}, {0xbf34a000}, {0xbf34c000}, {0xbf34e000}, 
-    {0xbf350000}, {0xbf352000}, {0xbf354000}, {0xbf356000}, 
-    {0xbf358000}, {0xbf35a000}, {0xbf35c000}, {0xbf35e000}, 
-    {0xbf360000}, {0xbf362000}, {0xbf364000}, {0xbf366000}, 
-    {0xbf368000}, {0xbf36a000}, {0xbf36c000}, {0xbf36e000}, 
-    {0xbf370000}, {0xbf372000}, {0xbf374000}, {0xbf376000}, 
-    {0xbf378000}, {0xbf37a000}, {0xbf37c000}, {0xbf37e000}, 
-    {0xbf380000}, {0xbf382000}, {0xbf384000}, {0xbf386000}, 
-    {0xbf388000}, {0xbf38a000}, {0xbf38c000}, {0xbf38e000}, 
-    {0xbf390000}, {0xbf392000}, {0xbf394000}, {0xbf396000}, 
-    {0xbf398000}, {0xbf39a000}, {0xbf39c000}, {0xbf39e000}, 
-    {0xbf3a0000}, {0xbf3a2000}, {0xbf3a4000}, {0xbf3a6000}, 
-    {0xbf3a8000}, {0xbf3aa000}, {0xbf3ac000}, {0xbf3ae000}, 
-    {0xbf3b0000}, {0xbf3b2000}, {0xbf3b4000}, {0xbf3b6000}, 
-    {0xbf3b8000}, {0xbf3ba000}, {0xbf3bc000}, {0xbf3be000}, 
-    {0xbf3c0000}, {0xbf3c2000}, {0xbf3c4000}, {0xbf3c6000}, 
-    {0xbf3c8000}, {0xbf3ca000}, {0xbf3cc000}, {0xbf3ce000}, 
-    {0xbf3d0000}, {0xbf3d2000}, {0xbf3d4000}, {0xbf3d6000}, 
-    {0xbf3d8000}, {0xbf3da000}, {0xbf3dc000}, {0xbf3de000}, 
-    {0xbf3e0000}, {0xbf3e2000}, {0xbf3e4000}, {0xbf3e6000}, 
-    {0xbf3e8000}, {0xbf3ea000}, {0xbf3ec000}, {0xbf3ee000}, 
-    {0xbf3f0000}, {0xbf3f2000}, {0xbf3f4000}, {0xbf3f6000}, 
-    {0xbf3f8000}, {0xbf3fa000}, {0xbf3fc000}, {0xbf3fe000}, 
-    {0xbf400000}, {0xbf402000}, {0xbf404000}, {0xbf406000}, 
-    {0xbf408000}, {0xbf40a000}, {0xbf40c000}, {0xbf40e000}, 
-    {0xbf410000}, {0xbf412000}, {0xbf414000}, {0xbf416000}, 
-    {0xbf418000}, {0xbf41a000}, {0xbf41c000}, {0xbf41e000}, 
-    {0xbf420000}, {0xbf422000}, {0xbf424000}, {0xbf426000}, 
-    {0xbf428000}, {0xbf42a000}, {0xbf42c000}, {0xbf42e000}, 
-    {0xbf430000}, {0xbf432000}, {0xbf434000}, {0xbf436000}, 
-    {0xbf438000}, {0xbf43a000}, {0xbf43c000}, {0xbf43e000}, 
-    {0xbf440000}, {0xbf442000}, {0xbf444000}, {0xbf446000}, 
-    {0xbf448000}, {0xbf44a000}, {0xbf44c000}, {0xbf44e000}, 
-    {0xbf450000}, {0xbf452000}, {0xbf454000}, {0xbf456000}, 
-    {0xbf458000}, {0xbf45a000}, {0xbf45c000}, {0xbf45e000}, 
-    {0xbf460000}, {0xbf462000}, {0xbf464000}, {0xbf466000}, 
-    {0xbf468000}, {0xbf46a000}, {0xbf46c000}, {0xbf46e000}, 
-    {0xbf470000}, {0xbf472000}, {0xbf474000}, {0xbf476000}, 
-    {0xbf478000}, {0xbf47a000}, {0xbf47c000}, {0xbf47e000}, 
-    {0xbf480000}, {0xbf482000}, {0xbf484000}, {0xbf486000}, 
-    {0xbf488000}, {0xbf48a000}, {0xbf48c000}, {0xbf48e000}, 
-    {0xbf490000}, {0xbf492000}, {0xbf494000}, {0xbf496000}, 
-    {0xbf498000}, {0xbf49a000}, {0xbf49c000}, {0xbf49e000}, 
-    {0xbf4a0000}, {0xbf4a2000}, {0xbf4a4000}, {0xbf4a6000}, 
-    {0xbf4a8000}, {0xbf4aa000}, {0xbf4ac000}, {0xbf4ae000}, 
-    {0xbf4b0000}, {0xbf4b2000}, {0xbf4b4000}, {0xbf4b6000}, 
-    {0xbf4b8000}, {0xbf4ba000}, {0xbf4bc000}, {0xbf4be000}, 
-    {0xbf4c0000}, {0xbf4c2000}, {0xbf4c4000}, {0xbf4c6000}, 
-    {0xbf4c8000}, {0xbf4ca000}, {0xbf4cc000}, {0xbf4ce000}, 
-    {0xbf4d0000}, {0xbf4d2000}, {0xbf4d4000}, {0xbf4d6000}, 
-    {0xbf4d8000}, {0xbf4da000}, {0xbf4dc000}, {0xbf4de000}, 
-    {0xbf4e0000}, {0xbf4e2000}, {0xbf4e4000}, {0xbf4e6000}, 
-    {0xbf4e8000}, {0xbf4ea000}, {0xbf4ec000}, {0xbf4ee000}, 
-    {0xbf4f0000}, {0xbf4f2000}, {0xbf4f4000}, {0xbf4f6000}, 
-    {0xbf4f8000}, {0xbf4fa000}, {0xbf4fc000}, {0xbf4fe000}, 
-    {0xbf500000}, {0xbf502000}, {0xbf504000}, {0xbf506000}, 
-    {0xbf508000}, {0xbf50a000}, {0xbf50c000}, {0xbf50e000}, 
-    {0xbf510000}, {0xbf512000}, {0xbf514000}, {0xbf516000}, 
-    {0xbf518000}, {0xbf51a000}, {0xbf51c000}, {0xbf51e000}, 
-    {0xbf520000}, {0xbf522000}, {0xbf524000}, {0xbf526000}, 
-    {0xbf528000}, {0xbf52a000}, {0xbf52c000}, {0xbf52e000}, 
-    {0xbf530000}, {0xbf532000}, {0xbf534000}, {0xbf536000}, 
-    {0xbf538000}, {0xbf53a000}, {0xbf53c000}, {0xbf53e000}, 
-    {0xbf540000}, {0xbf542000}, {0xbf544000}, {0xbf546000}, 
-    {0xbf548000}, {0xbf54a000}, {0xbf54c000}, {0xbf54e000}, 
-    {0xbf550000}, {0xbf552000}, {0xbf554000}, {0xbf556000}, 
-    {0xbf558000}, {0xbf55a000}, {0xbf55c000}, {0xbf55e000}, 
-    {0xbf560000}, {0xbf562000}, {0xbf564000}, {0xbf566000}, 
-    {0xbf568000}, {0xbf56a000}, {0xbf56c000}, {0xbf56e000}, 
-    {0xbf570000}, {0xbf572000}, {0xbf574000}, {0xbf576000}, 
-    {0xbf578000}, {0xbf57a000}, {0xbf57c000}, {0xbf57e000}, 
-    {0xbf580000}, {0xbf582000}, {0xbf584000}, {0xbf586000}, 
-    {0xbf588000}, {0xbf58a000}, {0xbf58c000}, {0xbf58e000}, 
-    {0xbf590000}, {0xbf592000}, {0xbf594000}, {0xbf596000}, 
-    {0xbf598000}, {0xbf59a000}, {0xbf59c000}, {0xbf59e000}, 
-    {0xbf5a0000}, {0xbf5a2000}, {0xbf5a4000}, {0xbf5a6000}, 
-    {0xbf5a8000}, {0xbf5aa000}, {0xbf5ac000}, {0xbf5ae000}, 
-    {0xbf5b0000}, {0xbf5b2000}, {0xbf5b4000}, {0xbf5b6000}, 
-    {0xbf5b8000}, {0xbf5ba000}, {0xbf5bc000}, {0xbf5be000}, 
-    {0xbf5c0000}, {0xbf5c2000}, {0xbf5c4000}, {0xbf5c6000}, 
-    {0xbf5c8000}, {0xbf5ca000}, {0xbf5cc000}, {0xbf5ce000}, 
-    {0xbf5d0000}, {0xbf5d2000}, {0xbf5d4000}, {0xbf5d6000}, 
-    {0xbf5d8000}, {0xbf5da000}, {0xbf5dc000}, {0xbf5de000}, 
-    {0xbf5e0000}, {0xbf5e2000}, {0xbf5e4000}, {0xbf5e6000}, 
-    {0xbf5e8000}, {0xbf5ea000}, {0xbf5ec000}, {0xbf5ee000}, 
-    {0xbf5f0000}, {0xbf5f2000}, {0xbf5f4000}, {0xbf5f6000}, 
-    {0xbf5f8000}, {0xbf5fa000}, {0xbf5fc000}, {0xbf5fe000}, 
-    {0xbf600000}, {0xbf602000}, {0xbf604000}, {0xbf606000}, 
-    {0xbf608000}, {0xbf60a000}, {0xbf60c000}, {0xbf60e000}, 
-    {0xbf610000}, {0xbf612000}, {0xbf614000}, {0xbf616000}, 
-    {0xbf618000}, {0xbf61a000}, {0xbf61c000}, {0xbf61e000}, 
-    {0xbf620000}, {0xbf622000}, {0xbf624000}, {0xbf626000}, 
-    {0xbf628000}, {0xbf62a000}, {0xbf62c000}, {0xbf62e000}, 
-    {0xbf630000}, {0xbf632000}, {0xbf634000}, {0xbf636000}, 
-    {0xbf638000}, {0xbf63a000}, {0xbf63c000}, {0xbf63e000}, 
-    {0xbf640000}, {0xbf642000}, {0xbf644000}, {0xbf646000}, 
-    {0xbf648000}, {0xbf64a000}, {0xbf64c000}, {0xbf64e000}, 
-    {0xbf650000}, {0xbf652000}, {0xbf654000}, {0xbf656000}, 
-    {0xbf658000}, {0xbf65a000}, {0xbf65c000}, {0xbf65e000}, 
-    {0xbf660000}, {0xbf662000}, {0xbf664000}, {0xbf666000}, 
-    {0xbf668000}, {0xbf66a000}, {0xbf66c000}, {0xbf66e000}, 
-    {0xbf670000}, {0xbf672000}, {0xbf674000}, {0xbf676000}, 
-    {0xbf678000}, {0xbf67a000}, {0xbf67c000}, {0xbf67e000}, 
-    {0xbf680000}, {0xbf682000}, {0xbf684000}, {0xbf686000}, 
-    {0xbf688000}, {0xbf68a000}, {0xbf68c000}, {0xbf68e000}, 
-    {0xbf690000}, {0xbf692000}, {0xbf694000}, {0xbf696000}, 
-    {0xbf698000}, {0xbf69a000}, {0xbf69c000}, {0xbf69e000}, 
-    {0xbf6a0000}, {0xbf6a2000}, {0xbf6a4000}, {0xbf6a6000}, 
-    {0xbf6a8000}, {0xbf6aa000}, {0xbf6ac000}, {0xbf6ae000}, 
-    {0xbf6b0000}, {0xbf6b2000}, {0xbf6b4000}, {0xbf6b6000}, 
-    {0xbf6b8000}, {0xbf6ba000}, {0xbf6bc000}, {0xbf6be000}, 
-    {0xbf6c0000}, {0xbf6c2000}, {0xbf6c4000}, {0xbf6c6000}, 
-    {0xbf6c8000}, {0xbf6ca000}, {0xbf6cc000}, {0xbf6ce000}, 
-    {0xbf6d0000}, {0xbf6d2000}, {0xbf6d4000}, {0xbf6d6000}, 
-    {0xbf6d8000}, {0xbf6da000}, {0xbf6dc000}, {0xbf6de000}, 
-    {0xbf6e0000}, {0xbf6e2000}, {0xbf6e4000}, {0xbf6e6000}, 
-    {0xbf6e8000}, {0xbf6ea000}, {0xbf6ec000}, {0xbf6ee000}, 
-    {0xbf6f0000}, {0xbf6f2000}, {0xbf6f4000}, {0xbf6f6000}, 
-    {0xbf6f8000}, {0xbf6fa000}, {0xbf6fc000}, {0xbf6fe000}, 
-    {0xbf700000}, {0xbf702000}, {0xbf704000}, {0xbf706000}, 
-    {0xbf708000}, {0xbf70a000}, {0xbf70c000}, {0xbf70e000}, 
-    {0xbf710000}, {0xbf712000}, {0xbf714000}, {0xbf716000}, 
-    {0xbf718000}, {0xbf71a000}, {0xbf71c000}, {0xbf71e000}, 
-    {0xbf720000}, {0xbf722000}, {0xbf724000}, {0xbf726000}, 
-    {0xbf728000}, {0xbf72a000}, {0xbf72c000}, {0xbf72e000}, 
-    {0xbf730000}, {0xbf732000}, {0xbf734000}, {0xbf736000}, 
-    {0xbf738000}, {0xbf73a000}, {0xbf73c000}, {0xbf73e000}, 
-    {0xbf740000}, {0xbf742000}, {0xbf744000}, {0xbf746000}, 
-    {0xbf748000}, {0xbf74a000}, {0xbf74c000}, {0xbf74e000}, 
-    {0xbf750000}, {0xbf752000}, {0xbf754000}, {0xbf756000}, 
-    {0xbf758000}, {0xbf75a000}, {0xbf75c000}, {0xbf75e000}, 
-    {0xbf760000}, {0xbf762000}, {0xbf764000}, {0xbf766000}, 
-    {0xbf768000}, {0xbf76a000}, {0xbf76c000}, {0xbf76e000}, 
-    {0xbf770000}, {0xbf772000}, {0xbf774000}, {0xbf776000}, 
-    {0xbf778000}, {0xbf77a000}, {0xbf77c000}, {0xbf77e000}, 
-    {0xbf780000}, {0xbf782000}, {0xbf784000}, {0xbf786000}, 
-    {0xbf788000}, {0xbf78a000}, {0xbf78c000}, {0xbf78e000}, 
-    {0xbf790000}, {0xbf792000}, {0xbf794000}, {0xbf796000}, 
-    {0xbf798000}, {0xbf79a000}, {0xbf79c000}, {0xbf79e000}, 
-    {0xbf7a0000}, {0xbf7a2000}, {0xbf7a4000}, {0xbf7a6000}, 
-    {0xbf7a8000}, {0xbf7aa000}, {0xbf7ac000}, {0xbf7ae000}, 
-    {0xbf7b0000}, {0xbf7b2000}, {0xbf7b4000}, {0xbf7b6000}, 
-    {0xbf7b8000}, {0xbf7ba000}, {0xbf7bc000}, {0xbf7be000}, 
-    {0xbf7c0000}, {0xbf7c2000}, {0xbf7c4000}, {0xbf7c6000}, 
-    {0xbf7c8000}, {0xbf7ca000}, {0xbf7cc000}, {0xbf7ce000}, 
-    {0xbf7d0000}, {0xbf7d2000}, {0xbf7d4000}, {0xbf7d6000}, 
-    {0xbf7d8000}, {0xbf7da000}, {0xbf7dc000}, {0xbf7de000}, 
-    {0xbf7e0000}, {0xbf7e2000}, {0xbf7e4000}, {0xbf7e6000}, 
-    {0xbf7e8000}, {0xbf7ea000}, {0xbf7ec000}, {0xbf7ee000}, 
-    {0xbf7f0000}, {0xbf7f2000}, {0xbf7f4000}, {0xbf7f6000}, 
-    {0xbf7f8000}, {0xbf7fa000}, {0xbf7fc000}, {0xbf7fe000}, 
-    {0xbf800000}, {0xbf802000}, {0xbf804000}, {0xbf806000}, 
-    {0xbf808000}, {0xbf80a000}, {0xbf80c000}, {0xbf80e000}, 
-    {0xbf810000}, {0xbf812000}, {0xbf814000}, {0xbf816000}, 
-    {0xbf818000}, {0xbf81a000}, {0xbf81c000}, {0xbf81e000}, 
-    {0xbf820000}, {0xbf822000}, {0xbf824000}, {0xbf826000}, 
-    {0xbf828000}, {0xbf82a000}, {0xbf82c000}, {0xbf82e000}, 
-    {0xbf830000}, {0xbf832000}, {0xbf834000}, {0xbf836000}, 
-    {0xbf838000}, {0xbf83a000}, {0xbf83c000}, {0xbf83e000}, 
-    {0xbf840000}, {0xbf842000}, {0xbf844000}, {0xbf846000}, 
-    {0xbf848000}, {0xbf84a000}, {0xbf84c000}, {0xbf84e000}, 
-    {0xbf850000}, {0xbf852000}, {0xbf854000}, {0xbf856000}, 
-    {0xbf858000}, {0xbf85a000}, {0xbf85c000}, {0xbf85e000}, 
-    {0xbf860000}, {0xbf862000}, {0xbf864000}, {0xbf866000}, 
-    {0xbf868000}, {0xbf86a000}, {0xbf86c000}, {0xbf86e000}, 
-    {0xbf870000}, {0xbf872000}, {0xbf874000}, {0xbf876000}, 
-    {0xbf878000}, {0xbf87a000}, {0xbf87c000}, {0xbf87e000}, 
-    {0xbf880000}, {0xbf882000}, {0xbf884000}, {0xbf886000}, 
-    {0xbf888000}, {0xbf88a000}, {0xbf88c000}, {0xbf88e000}, 
-    {0xbf890000}, {0xbf892000}, {0xbf894000}, {0xbf896000}, 
-    {0xbf898000}, {0xbf89a000}, {0xbf89c000}, {0xbf89e000}, 
-    {0xbf8a0000}, {0xbf8a2000}, {0xbf8a4000}, {0xbf8a6000}, 
-    {0xbf8a8000}, {0xbf8aa000}, {0xbf8ac000}, {0xbf8ae000}, 
-    {0xbf8b0000}, {0xbf8b2000}, {0xbf8b4000}, {0xbf8b6000}, 
-    {0xbf8b8000}, {0xbf8ba000}, {0xbf8bc000}, {0xbf8be000}, 
-    {0xbf8c0000}, {0xbf8c2000}, {0xbf8c4000}, {0xbf8c6000}, 
-    {0xbf8c8000}, {0xbf8ca000}, {0xbf8cc000}, {0xbf8ce000}, 
-    {0xbf8d0000}, {0xbf8d2000}, {0xbf8d4000}, {0xbf8d6000}, 
-    {0xbf8d8000}, {0xbf8da000}, {0xbf8dc000}, {0xbf8de000}, 
-    {0xbf8e0000}, {0xbf8e2000}, {0xbf8e4000}, {0xbf8e6000}, 
-    {0xbf8e8000}, {0xbf8ea000}, {0xbf8ec000}, {0xbf8ee000}, 
-    {0xbf8f0000}, {0xbf8f2000}, {0xbf8f4000}, {0xbf8f6000}, 
-    {0xbf8f8000}, {0xbf8fa000}, {0xbf8fc000}, {0xbf8fe000}, 
-    {0xbf900000}, {0xbf902000}, {0xbf904000}, {0xbf906000}, 
-    {0xbf908000}, {0xbf90a000}, {0xbf90c000}, {0xbf90e000}, 
-    {0xbf910000}, {0xbf912000}, {0xbf914000}, {0xbf916000}, 
-    {0xbf918000}, {0xbf91a000}, {0xbf91c000}, {0xbf91e000}, 
-    {0xbf920000}, {0xbf922000}, {0xbf924000}, {0xbf926000}, 
-    {0xbf928000}, {0xbf92a000}, {0xbf92c000}, {0xbf92e000}, 
-    {0xbf930000}, {0xbf932000}, {0xbf934000}, {0xbf936000}, 
-    {0xbf938000}, {0xbf93a000}, {0xbf93c000}, {0xbf93e000}, 
-    {0xbf940000}, {0xbf942000}, {0xbf944000}, {0xbf946000}, 
-    {0xbf948000}, {0xbf94a000}, {0xbf94c000}, {0xbf94e000}, 
-    {0xbf950000}, {0xbf952000}, {0xbf954000}, {0xbf956000}, 
-    {0xbf958000}, {0xbf95a000}, {0xbf95c000}, {0xbf95e000}, 
-    {0xbf960000}, {0xbf962000}, {0xbf964000}, {0xbf966000}, 
-    {0xbf968000}, {0xbf96a000}, {0xbf96c000}, {0xbf96e000}, 
-    {0xbf970000}, {0xbf972000}, {0xbf974000}, {0xbf976000}, 
-    {0xbf978000}, {0xbf97a000}, {0xbf97c000}, {0xbf97e000}, 
-    {0xbf980000}, {0xbf982000}, {0xbf984000}, {0xbf986000}, 
-    {0xbf988000}, {0xbf98a000}, {0xbf98c000}, {0xbf98e000}, 
-    {0xbf990000}, {0xbf992000}, {0xbf994000}, {0xbf996000}, 
-    {0xbf998000}, {0xbf99a000}, {0xbf99c000}, {0xbf99e000}, 
-    {0xbf9a0000}, {0xbf9a2000}, {0xbf9a4000}, {0xbf9a6000}, 
-    {0xbf9a8000}, {0xbf9aa000}, {0xbf9ac000}, {0xbf9ae000}, 
-    {0xbf9b0000}, {0xbf9b2000}, {0xbf9b4000}, {0xbf9b6000}, 
-    {0xbf9b8000}, {0xbf9ba000}, {0xbf9bc000}, {0xbf9be000}, 
-    {0xbf9c0000}, {0xbf9c2000}, {0xbf9c4000}, {0xbf9c6000}, 
-    {0xbf9c8000}, {0xbf9ca000}, {0xbf9cc000}, {0xbf9ce000}, 
-    {0xbf9d0000}, {0xbf9d2000}, {0xbf9d4000}, {0xbf9d6000}, 
-    {0xbf9d8000}, {0xbf9da000}, {0xbf9dc000}, {0xbf9de000}, 
-    {0xbf9e0000}, {0xbf9e2000}, {0xbf9e4000}, {0xbf9e6000}, 
-    {0xbf9e8000}, {0xbf9ea000}, {0xbf9ec000}, {0xbf9ee000}, 
-    {0xbf9f0000}, {0xbf9f2000}, {0xbf9f4000}, {0xbf9f6000}, 
-    {0xbf9f8000}, {0xbf9fa000}, {0xbf9fc000}, {0xbf9fe000}, 
-    {0xbfa00000}, {0xbfa02000}, {0xbfa04000}, {0xbfa06000}, 
-    {0xbfa08000}, {0xbfa0a000}, {0xbfa0c000}, {0xbfa0e000}, 
-    {0xbfa10000}, {0xbfa12000}, {0xbfa14000}, {0xbfa16000}, 
-    {0xbfa18000}, {0xbfa1a000}, {0xbfa1c000}, {0xbfa1e000}, 
-    {0xbfa20000}, {0xbfa22000}, {0xbfa24000}, {0xbfa26000}, 
-    {0xbfa28000}, {0xbfa2a000}, {0xbfa2c000}, {0xbfa2e000}, 
-    {0xbfa30000}, {0xbfa32000}, {0xbfa34000}, {0xbfa36000}, 
-    {0xbfa38000}, {0xbfa3a000}, {0xbfa3c000}, {0xbfa3e000}, 
-    {0xbfa40000}, {0xbfa42000}, {0xbfa44000}, {0xbfa46000}, 
-    {0xbfa48000}, {0xbfa4a000}, {0xbfa4c000}, {0xbfa4e000}, 
-    {0xbfa50000}, {0xbfa52000}, {0xbfa54000}, {0xbfa56000}, 
-    {0xbfa58000}, {0xbfa5a000}, {0xbfa5c000}, {0xbfa5e000}, 
-    {0xbfa60000}, {0xbfa62000}, {0xbfa64000}, {0xbfa66000}, 
-    {0xbfa68000}, {0xbfa6a000}, {0xbfa6c000}, {0xbfa6e000}, 
-    {0xbfa70000}, {0xbfa72000}, {0xbfa74000}, {0xbfa76000}, 
-    {0xbfa78000}, {0xbfa7a000}, {0xbfa7c000}, {0xbfa7e000}, 
-    {0xbfa80000}, {0xbfa82000}, {0xbfa84000}, {0xbfa86000}, 
-    {0xbfa88000}, {0xbfa8a000}, {0xbfa8c000}, {0xbfa8e000}, 
-    {0xbfa90000}, {0xbfa92000}, {0xbfa94000}, {0xbfa96000}, 
-    {0xbfa98000}, {0xbfa9a000}, {0xbfa9c000}, {0xbfa9e000}, 
-    {0xbfaa0000}, {0xbfaa2000}, {0xbfaa4000}, {0xbfaa6000}, 
-    {0xbfaa8000}, {0xbfaaa000}, {0xbfaac000}, {0xbfaae000}, 
-    {0xbfab0000}, {0xbfab2000}, {0xbfab4000}, {0xbfab6000}, 
-    {0xbfab8000}, {0xbfaba000}, {0xbfabc000}, {0xbfabe000}, 
-    {0xbfac0000}, {0xbfac2000}, {0xbfac4000}, {0xbfac6000}, 
-    {0xbfac8000}, {0xbfaca000}, {0xbfacc000}, {0xbface000}, 
-    {0xbfad0000}, {0xbfad2000}, {0xbfad4000}, {0xbfad6000}, 
-    {0xbfad8000}, {0xbfada000}, {0xbfadc000}, {0xbfade000}, 
-    {0xbfae0000}, {0xbfae2000}, {0xbfae4000}, {0xbfae6000}, 
-    {0xbfae8000}, {0xbfaea000}, {0xbfaec000}, {0xbfaee000}, 
-    {0xbfaf0000}, {0xbfaf2000}, {0xbfaf4000}, {0xbfaf6000}, 
-    {0xbfaf8000}, {0xbfafa000}, {0xbfafc000}, {0xbfafe000}, 
-    {0xbfb00000}, {0xbfb02000}, {0xbfb04000}, {0xbfb06000}, 
-    {0xbfb08000}, {0xbfb0a000}, {0xbfb0c000}, {0xbfb0e000}, 
-    {0xbfb10000}, {0xbfb12000}, {0xbfb14000}, {0xbfb16000}, 
-    {0xbfb18000}, {0xbfb1a000}, {0xbfb1c000}, {0xbfb1e000}, 
-    {0xbfb20000}, {0xbfb22000}, {0xbfb24000}, {0xbfb26000}, 
-    {0xbfb28000}, {0xbfb2a000}, {0xbfb2c000}, {0xbfb2e000}, 
-    {0xbfb30000}, {0xbfb32000}, {0xbfb34000}, {0xbfb36000}, 
-    {0xbfb38000}, {0xbfb3a000}, {0xbfb3c000}, {0xbfb3e000}, 
-    {0xbfb40000}, {0xbfb42000}, {0xbfb44000}, {0xbfb46000}, 
-    {0xbfb48000}, {0xbfb4a000}, {0xbfb4c000}, {0xbfb4e000}, 
-    {0xbfb50000}, {0xbfb52000}, {0xbfb54000}, {0xbfb56000}, 
-    {0xbfb58000}, {0xbfb5a000}, {0xbfb5c000}, {0xbfb5e000}, 
-    {0xbfb60000}, {0xbfb62000}, {0xbfb64000}, {0xbfb66000}, 
-    {0xbfb68000}, {0xbfb6a000}, {0xbfb6c000}, {0xbfb6e000}, 
-    {0xbfb70000}, {0xbfb72000}, {0xbfb74000}, {0xbfb76000}, 
-    {0xbfb78000}, {0xbfb7a000}, {0xbfb7c000}, {0xbfb7e000}, 
-    {0xbfb80000}, {0xbfb82000}, {0xbfb84000}, {0xbfb86000}, 
-    {0xbfb88000}, {0xbfb8a000}, {0xbfb8c000}, {0xbfb8e000}, 
-    {0xbfb90000}, {0xbfb92000}, {0xbfb94000}, {0xbfb96000}, 
-    {0xbfb98000}, {0xbfb9a000}, {0xbfb9c000}, {0xbfb9e000}, 
-    {0xbfba0000}, {0xbfba2000}, {0xbfba4000}, {0xbfba6000}, 
-    {0xbfba8000}, {0xbfbaa000}, {0xbfbac000}, {0xbfbae000}, 
-    {0xbfbb0000}, {0xbfbb2000}, {0xbfbb4000}, {0xbfbb6000}, 
-    {0xbfbb8000}, {0xbfbba000}, {0xbfbbc000}, {0xbfbbe000}, 
-    {0xbfbc0000}, {0xbfbc2000}, {0xbfbc4000}, {0xbfbc6000}, 
-    {0xbfbc8000}, {0xbfbca000}, {0xbfbcc000}, {0xbfbce000}, 
-    {0xbfbd0000}, {0xbfbd2000}, {0xbfbd4000}, {0xbfbd6000}, 
-    {0xbfbd8000}, {0xbfbda000}, {0xbfbdc000}, {0xbfbde000}, 
-    {0xbfbe0000}, {0xbfbe2000}, {0xbfbe4000}, {0xbfbe6000}, 
-    {0xbfbe8000}, {0xbfbea000}, {0xbfbec000}, {0xbfbee000}, 
-    {0xbfbf0000}, {0xbfbf2000}, {0xbfbf4000}, {0xbfbf6000}, 
-    {0xbfbf8000}, {0xbfbfa000}, {0xbfbfc000}, {0xbfbfe000}, 
-    {0xbfc00000}, {0xbfc02000}, {0xbfc04000}, {0xbfc06000}, 
-    {0xbfc08000}, {0xbfc0a000}, {0xbfc0c000}, {0xbfc0e000}, 
-    {0xbfc10000}, {0xbfc12000}, {0xbfc14000}, {0xbfc16000}, 
-    {0xbfc18000}, {0xbfc1a000}, {0xbfc1c000}, {0xbfc1e000}, 
-    {0xbfc20000}, {0xbfc22000}, {0xbfc24000}, {0xbfc26000}, 
-    {0xbfc28000}, {0xbfc2a000}, {0xbfc2c000}, {0xbfc2e000}, 
-    {0xbfc30000}, {0xbfc32000}, {0xbfc34000}, {0xbfc36000}, 
-    {0xbfc38000}, {0xbfc3a000}, {0xbfc3c000}, {0xbfc3e000}, 
-    {0xbfc40000}, {0xbfc42000}, {0xbfc44000}, {0xbfc46000}, 
-    {0xbfc48000}, {0xbfc4a000}, {0xbfc4c000}, {0xbfc4e000}, 
-    {0xbfc50000}, {0xbfc52000}, {0xbfc54000}, {0xbfc56000}, 
-    {0xbfc58000}, {0xbfc5a000}, {0xbfc5c000}, {0xbfc5e000}, 
-    {0xbfc60000}, {0xbfc62000}, {0xbfc64000}, {0xbfc66000}, 
-    {0xbfc68000}, {0xbfc6a000}, {0xbfc6c000}, {0xbfc6e000}, 
-    {0xbfc70000}, {0xbfc72000}, {0xbfc74000}, {0xbfc76000}, 
-    {0xbfc78000}, {0xbfc7a000}, {0xbfc7c000}, {0xbfc7e000}, 
-    {0xbfc80000}, {0xbfc82000}, {0xbfc84000}, {0xbfc86000}, 
-    {0xbfc88000}, {0xbfc8a000}, {0xbfc8c000}, {0xbfc8e000}, 
-    {0xbfc90000}, {0xbfc92000}, {0xbfc94000}, {0xbfc96000}, 
-    {0xbfc98000}, {0xbfc9a000}, {0xbfc9c000}, {0xbfc9e000}, 
-    {0xbfca0000}, {0xbfca2000}, {0xbfca4000}, {0xbfca6000}, 
-    {0xbfca8000}, {0xbfcaa000}, {0xbfcac000}, {0xbfcae000}, 
-    {0xbfcb0000}, {0xbfcb2000}, {0xbfcb4000}, {0xbfcb6000}, 
-    {0xbfcb8000}, {0xbfcba000}, {0xbfcbc000}, {0xbfcbe000}, 
-    {0xbfcc0000}, {0xbfcc2000}, {0xbfcc4000}, {0xbfcc6000}, 
-    {0xbfcc8000}, {0xbfcca000}, {0xbfccc000}, {0xbfcce000}, 
-    {0xbfcd0000}, {0xbfcd2000}, {0xbfcd4000}, {0xbfcd6000}, 
-    {0xbfcd8000}, {0xbfcda000}, {0xbfcdc000}, {0xbfcde000}, 
-    {0xbfce0000}, {0xbfce2000}, {0xbfce4000}, {0xbfce6000}, 
-    {0xbfce8000}, {0xbfcea000}, {0xbfcec000}, {0xbfcee000}, 
-    {0xbfcf0000}, {0xbfcf2000}, {0xbfcf4000}, {0xbfcf6000}, 
-    {0xbfcf8000}, {0xbfcfa000}, {0xbfcfc000}, {0xbfcfe000}, 
-    {0xbfd00000}, {0xbfd02000}, {0xbfd04000}, {0xbfd06000}, 
-    {0xbfd08000}, {0xbfd0a000}, {0xbfd0c000}, {0xbfd0e000}, 
-    {0xbfd10000}, {0xbfd12000}, {0xbfd14000}, {0xbfd16000}, 
-    {0xbfd18000}, {0xbfd1a000}, {0xbfd1c000}, {0xbfd1e000}, 
-    {0xbfd20000}, {0xbfd22000}, {0xbfd24000}, {0xbfd26000}, 
-    {0xbfd28000}, {0xbfd2a000}, {0xbfd2c000}, {0xbfd2e000}, 
-    {0xbfd30000}, {0xbfd32000}, {0xbfd34000}, {0xbfd36000}, 
-    {0xbfd38000}, {0xbfd3a000}, {0xbfd3c000}, {0xbfd3e000}, 
-    {0xbfd40000}, {0xbfd42000}, {0xbfd44000}, {0xbfd46000}, 
-    {0xbfd48000}, {0xbfd4a000}, {0xbfd4c000}, {0xbfd4e000}, 
-    {0xbfd50000}, {0xbfd52000}, {0xbfd54000}, {0xbfd56000}, 
-    {0xbfd58000}, {0xbfd5a000}, {0xbfd5c000}, {0xbfd5e000}, 
-    {0xbfd60000}, {0xbfd62000}, {0xbfd64000}, {0xbfd66000}, 
-    {0xbfd68000}, {0xbfd6a000}, {0xbfd6c000}, {0xbfd6e000}, 
-    {0xbfd70000}, {0xbfd72000}, {0xbfd74000}, {0xbfd76000}, 
-    {0xbfd78000}, {0xbfd7a000}, {0xbfd7c000}, {0xbfd7e000}, 
-    {0xbfd80000}, {0xbfd82000}, {0xbfd84000}, {0xbfd86000}, 
-    {0xbfd88000}, {0xbfd8a000}, {0xbfd8c000}, {0xbfd8e000}, 
-    {0xbfd90000}, {0xbfd92000}, {0xbfd94000}, {0xbfd96000}, 
-    {0xbfd98000}, {0xbfd9a000}, {0xbfd9c000}, {0xbfd9e000}, 
-    {0xbfda0000}, {0xbfda2000}, {0xbfda4000}, {0xbfda6000}, 
-    {0xbfda8000}, {0xbfdaa000}, {0xbfdac000}, {0xbfdae000}, 
-    {0xbfdb0000}, {0xbfdb2000}, {0xbfdb4000}, {0xbfdb6000}, 
-    {0xbfdb8000}, {0xbfdba000}, {0xbfdbc000}, {0xbfdbe000}, 
-    {0xbfdc0000}, {0xbfdc2000}, {0xbfdc4000}, {0xbfdc6000}, 
-    {0xbfdc8000}, {0xbfdca000}, {0xbfdcc000}, {0xbfdce000}, 
-    {0xbfdd0000}, {0xbfdd2000}, {0xbfdd4000}, {0xbfdd6000}, 
-    {0xbfdd8000}, {0xbfdda000}, {0xbfddc000}, {0xbfdde000}, 
-    {0xbfde0000}, {0xbfde2000}, {0xbfde4000}, {0xbfde6000}, 
-    {0xbfde8000}, {0xbfdea000}, {0xbfdec000}, {0xbfdee000}, 
-    {0xbfdf0000}, {0xbfdf2000}, {0xbfdf4000}, {0xbfdf6000}, 
-    {0xbfdf8000}, {0xbfdfa000}, {0xbfdfc000}, {0xbfdfe000}, 
-    {0xbfe00000}, {0xbfe02000}, {0xbfe04000}, {0xbfe06000}, 
-    {0xbfe08000}, {0xbfe0a000}, {0xbfe0c000}, {0xbfe0e000}, 
-    {0xbfe10000}, {0xbfe12000}, {0xbfe14000}, {0xbfe16000}, 
-    {0xbfe18000}, {0xbfe1a000}, {0xbfe1c000}, {0xbfe1e000}, 
-    {0xbfe20000}, {0xbfe22000}, {0xbfe24000}, {0xbfe26000}, 
-    {0xbfe28000}, {0xbfe2a000}, {0xbfe2c000}, {0xbfe2e000}, 
-    {0xbfe30000}, {0xbfe32000}, {0xbfe34000}, {0xbfe36000}, 
-    {0xbfe38000}, {0xbfe3a000}, {0xbfe3c000}, {0xbfe3e000}, 
-    {0xbfe40000}, {0xbfe42000}, {0xbfe44000}, {0xbfe46000}, 
-    {0xbfe48000}, {0xbfe4a000}, {0xbfe4c000}, {0xbfe4e000}, 
-    {0xbfe50000}, {0xbfe52000}, {0xbfe54000}, {0xbfe56000}, 
-    {0xbfe58000}, {0xbfe5a000}, {0xbfe5c000}, {0xbfe5e000}, 
-    {0xbfe60000}, {0xbfe62000}, {0xbfe64000}, {0xbfe66000}, 
-    {0xbfe68000}, {0xbfe6a000}, {0xbfe6c000}, {0xbfe6e000}, 
-    {0xbfe70000}, {0xbfe72000}, {0xbfe74000}, {0xbfe76000}, 
-    {0xbfe78000}, {0xbfe7a000}, {0xbfe7c000}, {0xbfe7e000}, 
-    {0xbfe80000}, {0xbfe82000}, {0xbfe84000}, {0xbfe86000}, 
-    {0xbfe88000}, {0xbfe8a000}, {0xbfe8c000}, {0xbfe8e000}, 
-    {0xbfe90000}, {0xbfe92000}, {0xbfe94000}, {0xbfe96000}, 
-    {0xbfe98000}, {0xbfe9a000}, {0xbfe9c000}, {0xbfe9e000}, 
-    {0xbfea0000}, {0xbfea2000}, {0xbfea4000}, {0xbfea6000}, 
-    {0xbfea8000}, {0xbfeaa000}, {0xbfeac000}, {0xbfeae000}, 
-    {0xbfeb0000}, {0xbfeb2000}, {0xbfeb4000}, {0xbfeb6000}, 
-    {0xbfeb8000}, {0xbfeba000}, {0xbfebc000}, {0xbfebe000}, 
-    {0xbfec0000}, {0xbfec2000}, {0xbfec4000}, {0xbfec6000}, 
-    {0xbfec8000}, {0xbfeca000}, {0xbfecc000}, {0xbfece000}, 
-    {0xbfed0000}, {0xbfed2000}, {0xbfed4000}, {0xbfed6000}, 
-    {0xbfed8000}, {0xbfeda000}, {0xbfedc000}, {0xbfede000}, 
-    {0xbfee0000}, {0xbfee2000}, {0xbfee4000}, {0xbfee6000}, 
-    {0xbfee8000}, {0xbfeea000}, {0xbfeec000}, {0xbfeee000}, 
-    {0xbfef0000}, {0xbfef2000}, {0xbfef4000}, {0xbfef6000}, 
-    {0xbfef8000}, {0xbfefa000}, {0xbfefc000}, {0xbfefe000}, 
-    {0xbff00000}, {0xbff02000}, {0xbff04000}, {0xbff06000}, 
-    {0xbff08000}, {0xbff0a000}, {0xbff0c000}, {0xbff0e000}, 
-    {0xbff10000}, {0xbff12000}, {0xbff14000}, {0xbff16000}, 
-    {0xbff18000}, {0xbff1a000}, {0xbff1c000}, {0xbff1e000}, 
-    {0xbff20000}, {0xbff22000}, {0xbff24000}, {0xbff26000}, 
-    {0xbff28000}, {0xbff2a000}, {0xbff2c000}, {0xbff2e000}, 
-    {0xbff30000}, {0xbff32000}, {0xbff34000}, {0xbff36000}, 
-    {0xbff38000}, {0xbff3a000}, {0xbff3c000}, {0xbff3e000}, 
-    {0xbff40000}, {0xbff42000}, {0xbff44000}, {0xbff46000}, 
-    {0xbff48000}, {0xbff4a000}, {0xbff4c000}, {0xbff4e000}, 
-    {0xbff50000}, {0xbff52000}, {0xbff54000}, {0xbff56000}, 
-    {0xbff58000}, {0xbff5a000}, {0xbff5c000}, {0xbff5e000}, 
-    {0xbff60000}, {0xbff62000}, {0xbff64000}, {0xbff66000}, 
-    {0xbff68000}, {0xbff6a000}, {0xbff6c000}, {0xbff6e000}, 
-    {0xbff70000}, {0xbff72000}, {0xbff74000}, {0xbff76000}, 
-    {0xbff78000}, {0xbff7a000}, {0xbff7c000}, {0xbff7e000}, 
-    {0xbff80000}, {0xbff82000}, {0xbff84000}, {0xbff86000}, 
-    {0xbff88000}, {0xbff8a000}, {0xbff8c000}, {0xbff8e000}, 
-    {0xbff90000}, {0xbff92000}, {0xbff94000}, {0xbff96000}, 
-    {0xbff98000}, {0xbff9a000}, {0xbff9c000}, {0xbff9e000}, 
-    {0xbffa0000}, {0xbffa2000}, {0xbffa4000}, {0xbffa6000}, 
-    {0xbffa8000}, {0xbffaa000}, {0xbffac000}, {0xbffae000}, 
-    {0xbffb0000}, {0xbffb2000}, {0xbffb4000}, {0xbffb6000}, 
-    {0xbffb8000}, {0xbffba000}, {0xbffbc000}, {0xbffbe000}, 
-    {0xbffc0000}, {0xbffc2000}, {0xbffc4000}, {0xbffc6000}, 
-    {0xbffc8000}, {0xbffca000}, {0xbffcc000}, {0xbffce000}, 
-    {0xbffd0000}, {0xbffd2000}, {0xbffd4000}, {0xbffd6000}, 
-    {0xbffd8000}, {0xbffda000}, {0xbffdc000}, {0xbffde000}, 
-    {0xbffe0000}, {0xbffe2000}, {0xbffe4000}, {0xbffe6000}, 
-    {0xbffe8000}, {0xbffea000}, {0xbffec000}, {0xbffee000}, 
-    {0xbfff0000}, {0xbfff2000}, {0xbfff4000}, {0xbfff6000}, 
-    {0xbfff8000}, {0xbfffa000}, {0xbfffc000}, {0xbfffe000}, 
-    {0xc0000000}, {0xc0002000}, {0xc0004000}, {0xc0006000}, 
-    {0xc0008000}, {0xc000a000}, {0xc000c000}, {0xc000e000}, 
-    {0xc0010000}, {0xc0012000}, {0xc0014000}, {0xc0016000}, 
-    {0xc0018000}, {0xc001a000}, {0xc001c000}, {0xc001e000}, 
-    {0xc0020000}, {0xc0022000}, {0xc0024000}, {0xc0026000}, 
-    {0xc0028000}, {0xc002a000}, {0xc002c000}, {0xc002e000}, 
-    {0xc0030000}, {0xc0032000}, {0xc0034000}, {0xc0036000}, 
-    {0xc0038000}, {0xc003a000}, {0xc003c000}, {0xc003e000}, 
-    {0xc0040000}, {0xc0042000}, {0xc0044000}, {0xc0046000}, 
-    {0xc0048000}, {0xc004a000}, {0xc004c000}, {0xc004e000}, 
-    {0xc0050000}, {0xc0052000}, {0xc0054000}, {0xc0056000}, 
-    {0xc0058000}, {0xc005a000}, {0xc005c000}, {0xc005e000}, 
-    {0xc0060000}, {0xc0062000}, {0xc0064000}, {0xc0066000}, 
-    {0xc0068000}, {0xc006a000}, {0xc006c000}, {0xc006e000}, 
-    {0xc0070000}, {0xc0072000}, {0xc0074000}, {0xc0076000}, 
-    {0xc0078000}, {0xc007a000}, {0xc007c000}, {0xc007e000}, 
-    {0xc0080000}, {0xc0082000}, {0xc0084000}, {0xc0086000}, 
-    {0xc0088000}, {0xc008a000}, {0xc008c000}, {0xc008e000}, 
-    {0xc0090000}, {0xc0092000}, {0xc0094000}, {0xc0096000}, 
-    {0xc0098000}, {0xc009a000}, {0xc009c000}, {0xc009e000}, 
-    {0xc00a0000}, {0xc00a2000}, {0xc00a4000}, {0xc00a6000}, 
-    {0xc00a8000}, {0xc00aa000}, {0xc00ac000}, {0xc00ae000}, 
-    {0xc00b0000}, {0xc00b2000}, {0xc00b4000}, {0xc00b6000}, 
-    {0xc00b8000}, {0xc00ba000}, {0xc00bc000}, {0xc00be000}, 
-    {0xc00c0000}, {0xc00c2000}, {0xc00c4000}, {0xc00c6000}, 
-    {0xc00c8000}, {0xc00ca000}, {0xc00cc000}, {0xc00ce000}, 
-    {0xc00d0000}, {0xc00d2000}, {0xc00d4000}, {0xc00d6000}, 
-    {0xc00d8000}, {0xc00da000}, {0xc00dc000}, {0xc00de000}, 
-    {0xc00e0000}, {0xc00e2000}, {0xc00e4000}, {0xc00e6000}, 
-    {0xc00e8000}, {0xc00ea000}, {0xc00ec000}, {0xc00ee000}, 
-    {0xc00f0000}, {0xc00f2000}, {0xc00f4000}, {0xc00f6000}, 
-    {0xc00f8000}, {0xc00fa000}, {0xc00fc000}, {0xc00fe000}, 
-    {0xc0100000}, {0xc0102000}, {0xc0104000}, {0xc0106000}, 
-    {0xc0108000}, {0xc010a000}, {0xc010c000}, {0xc010e000}, 
-    {0xc0110000}, {0xc0112000}, {0xc0114000}, {0xc0116000}, 
-    {0xc0118000}, {0xc011a000}, {0xc011c000}, {0xc011e000}, 
-    {0xc0120000}, {0xc0122000}, {0xc0124000}, {0xc0126000}, 
-    {0xc0128000}, {0xc012a000}, {0xc012c000}, {0xc012e000}, 
-    {0xc0130000}, {0xc0132000}, {0xc0134000}, {0xc0136000}, 
-    {0xc0138000}, {0xc013a000}, {0xc013c000}, {0xc013e000}, 
-    {0xc0140000}, {0xc0142000}, {0xc0144000}, {0xc0146000}, 
-    {0xc0148000}, {0xc014a000}, {0xc014c000}, {0xc014e000}, 
-    {0xc0150000}, {0xc0152000}, {0xc0154000}, {0xc0156000}, 
-    {0xc0158000}, {0xc015a000}, {0xc015c000}, {0xc015e000}, 
-    {0xc0160000}, {0xc0162000}, {0xc0164000}, {0xc0166000}, 
-    {0xc0168000}, {0xc016a000}, {0xc016c000}, {0xc016e000}, 
-    {0xc0170000}, {0xc0172000}, {0xc0174000}, {0xc0176000}, 
-    {0xc0178000}, {0xc017a000}, {0xc017c000}, {0xc017e000}, 
-    {0xc0180000}, {0xc0182000}, {0xc0184000}, {0xc0186000}, 
-    {0xc0188000}, {0xc018a000}, {0xc018c000}, {0xc018e000}, 
-    {0xc0190000}, {0xc0192000}, {0xc0194000}, {0xc0196000}, 
-    {0xc0198000}, {0xc019a000}, {0xc019c000}, {0xc019e000}, 
-    {0xc01a0000}, {0xc01a2000}, {0xc01a4000}, {0xc01a6000}, 
-    {0xc01a8000}, {0xc01aa000}, {0xc01ac000}, {0xc01ae000}, 
-    {0xc01b0000}, {0xc01b2000}, {0xc01b4000}, {0xc01b6000}, 
-    {0xc01b8000}, {0xc01ba000}, {0xc01bc000}, {0xc01be000}, 
-    {0xc01c0000}, {0xc01c2000}, {0xc01c4000}, {0xc01c6000}, 
-    {0xc01c8000}, {0xc01ca000}, {0xc01cc000}, {0xc01ce000}, 
-    {0xc01d0000}, {0xc01d2000}, {0xc01d4000}, {0xc01d6000}, 
-    {0xc01d8000}, {0xc01da000}, {0xc01dc000}, {0xc01de000}, 
-    {0xc01e0000}, {0xc01e2000}, {0xc01e4000}, {0xc01e6000}, 
-    {0xc01e8000}, {0xc01ea000}, {0xc01ec000}, {0xc01ee000}, 
-    {0xc01f0000}, {0xc01f2000}, {0xc01f4000}, {0xc01f6000}, 
-    {0xc01f8000}, {0xc01fa000}, {0xc01fc000}, {0xc01fe000}, 
-    {0xc0200000}, {0xc0202000}, {0xc0204000}, {0xc0206000}, 
-    {0xc0208000}, {0xc020a000}, {0xc020c000}, {0xc020e000}, 
-    {0xc0210000}, {0xc0212000}, {0xc0214000}, {0xc0216000}, 
-    {0xc0218000}, {0xc021a000}, {0xc021c000}, {0xc021e000}, 
-    {0xc0220000}, {0xc0222000}, {0xc0224000}, {0xc0226000}, 
-    {0xc0228000}, {0xc022a000}, {0xc022c000}, {0xc022e000}, 
-    {0xc0230000}, {0xc0232000}, {0xc0234000}, {0xc0236000}, 
-    {0xc0238000}, {0xc023a000}, {0xc023c000}, {0xc023e000}, 
-    {0xc0240000}, {0xc0242000}, {0xc0244000}, {0xc0246000}, 
-    {0xc0248000}, {0xc024a000}, {0xc024c000}, {0xc024e000}, 
-    {0xc0250000}, {0xc0252000}, {0xc0254000}, {0xc0256000}, 
-    {0xc0258000}, {0xc025a000}, {0xc025c000}, {0xc025e000}, 
-    {0xc0260000}, {0xc0262000}, {0xc0264000}, {0xc0266000}, 
-    {0xc0268000}, {0xc026a000}, {0xc026c000}, {0xc026e000}, 
-    {0xc0270000}, {0xc0272000}, {0xc0274000}, {0xc0276000}, 
-    {0xc0278000}, {0xc027a000}, {0xc027c000}, {0xc027e000}, 
-    {0xc0280000}, {0xc0282000}, {0xc0284000}, {0xc0286000}, 
-    {0xc0288000}, {0xc028a000}, {0xc028c000}, {0xc028e000}, 
-    {0xc0290000}, {0xc0292000}, {0xc0294000}, {0xc0296000}, 
-    {0xc0298000}, {0xc029a000}, {0xc029c000}, {0xc029e000}, 
-    {0xc02a0000}, {0xc02a2000}, {0xc02a4000}, {0xc02a6000}, 
-    {0xc02a8000}, {0xc02aa000}, {0xc02ac000}, {0xc02ae000}, 
-    {0xc02b0000}, {0xc02b2000}, {0xc02b4000}, {0xc02b6000}, 
-    {0xc02b8000}, {0xc02ba000}, {0xc02bc000}, {0xc02be000}, 
-    {0xc02c0000}, {0xc02c2000}, {0xc02c4000}, {0xc02c6000}, 
-    {0xc02c8000}, {0xc02ca000}, {0xc02cc000}, {0xc02ce000}, 
-    {0xc02d0000}, {0xc02d2000}, {0xc02d4000}, {0xc02d6000}, 
-    {0xc02d8000}, {0xc02da000}, {0xc02dc000}, {0xc02de000}, 
-    {0xc02e0000}, {0xc02e2000}, {0xc02e4000}, {0xc02e6000}, 
-    {0xc02e8000}, {0xc02ea000}, {0xc02ec000}, {0xc02ee000}, 
-    {0xc02f0000}, {0xc02f2000}, {0xc02f4000}, {0xc02f6000}, 
-    {0xc02f8000}, {0xc02fa000}, {0xc02fc000}, {0xc02fe000}, 
-    {0xc0300000}, {0xc0302000}, {0xc0304000}, {0xc0306000}, 
-    {0xc0308000}, {0xc030a000}, {0xc030c000}, {0xc030e000}, 
-    {0xc0310000}, {0xc0312000}, {0xc0314000}, {0xc0316000}, 
-    {0xc0318000}, {0xc031a000}, {0xc031c000}, {0xc031e000}, 
-    {0xc0320000}, {0xc0322000}, {0xc0324000}, {0xc0326000}, 
-    {0xc0328000}, {0xc032a000}, {0xc032c000}, {0xc032e000}, 
-    {0xc0330000}, {0xc0332000}, {0xc0334000}, {0xc0336000}, 
-    {0xc0338000}, {0xc033a000}, {0xc033c000}, {0xc033e000}, 
-    {0xc0340000}, {0xc0342000}, {0xc0344000}, {0xc0346000}, 
-    {0xc0348000}, {0xc034a000}, {0xc034c000}, {0xc034e000}, 
-    {0xc0350000}, {0xc0352000}, {0xc0354000}, {0xc0356000}, 
-    {0xc0358000}, {0xc035a000}, {0xc035c000}, {0xc035e000}, 
-    {0xc0360000}, {0xc0362000}, {0xc0364000}, {0xc0366000}, 
-    {0xc0368000}, {0xc036a000}, {0xc036c000}, {0xc036e000}, 
-    {0xc0370000}, {0xc0372000}, {0xc0374000}, {0xc0376000}, 
-    {0xc0378000}, {0xc037a000}, {0xc037c000}, {0xc037e000}, 
-    {0xc0380000}, {0xc0382000}, {0xc0384000}, {0xc0386000}, 
-    {0xc0388000}, {0xc038a000}, {0xc038c000}, {0xc038e000}, 
-    {0xc0390000}, {0xc0392000}, {0xc0394000}, {0xc0396000}, 
-    {0xc0398000}, {0xc039a000}, {0xc039c000}, {0xc039e000}, 
-    {0xc03a0000}, {0xc03a2000}, {0xc03a4000}, {0xc03a6000}, 
-    {0xc03a8000}, {0xc03aa000}, {0xc03ac000}, {0xc03ae000}, 
-    {0xc03b0000}, {0xc03b2000}, {0xc03b4000}, {0xc03b6000}, 
-    {0xc03b8000}, {0xc03ba000}, {0xc03bc000}, {0xc03be000}, 
-    {0xc03c0000}, {0xc03c2000}, {0xc03c4000}, {0xc03c6000}, 
-    {0xc03c8000}, {0xc03ca000}, {0xc03cc000}, {0xc03ce000}, 
-    {0xc03d0000}, {0xc03d2000}, {0xc03d4000}, {0xc03d6000}, 
-    {0xc03d8000}, {0xc03da000}, {0xc03dc000}, {0xc03de000}, 
-    {0xc03e0000}, {0xc03e2000}, {0xc03e4000}, {0xc03e6000}, 
-    {0xc03e8000}, {0xc03ea000}, {0xc03ec000}, {0xc03ee000}, 
-    {0xc03f0000}, {0xc03f2000}, {0xc03f4000}, {0xc03f6000}, 
-    {0xc03f8000}, {0xc03fa000}, {0xc03fc000}, {0xc03fe000}, 
-    {0xc0400000}, {0xc0402000}, {0xc0404000}, {0xc0406000}, 
-    {0xc0408000}, {0xc040a000}, {0xc040c000}, {0xc040e000}, 
-    {0xc0410000}, {0xc0412000}, {0xc0414000}, {0xc0416000}, 
-    {0xc0418000}, {0xc041a000}, {0xc041c000}, {0xc041e000}, 
-    {0xc0420000}, {0xc0422000}, {0xc0424000}, {0xc0426000}, 
-    {0xc0428000}, {0xc042a000}, {0xc042c000}, {0xc042e000}, 
-    {0xc0430000}, {0xc0432000}, {0xc0434000}, {0xc0436000}, 
-    {0xc0438000}, {0xc043a000}, {0xc043c000}, {0xc043e000}, 
-    {0xc0440000}, {0xc0442000}, {0xc0444000}, {0xc0446000}, 
-    {0xc0448000}, {0xc044a000}, {0xc044c000}, {0xc044e000}, 
-    {0xc0450000}, {0xc0452000}, {0xc0454000}, {0xc0456000}, 
-    {0xc0458000}, {0xc045a000}, {0xc045c000}, {0xc045e000}, 
-    {0xc0460000}, {0xc0462000}, {0xc0464000}, {0xc0466000}, 
-    {0xc0468000}, {0xc046a000}, {0xc046c000}, {0xc046e000}, 
-    {0xc0470000}, {0xc0472000}, {0xc0474000}, {0xc0476000}, 
-    {0xc0478000}, {0xc047a000}, {0xc047c000}, {0xc047e000}, 
-    {0xc0480000}, {0xc0482000}, {0xc0484000}, {0xc0486000}, 
-    {0xc0488000}, {0xc048a000}, {0xc048c000}, {0xc048e000}, 
-    {0xc0490000}, {0xc0492000}, {0xc0494000}, {0xc0496000}, 
-    {0xc0498000}, {0xc049a000}, {0xc049c000}, {0xc049e000}, 
-    {0xc04a0000}, {0xc04a2000}, {0xc04a4000}, {0xc04a6000}, 
-    {0xc04a8000}, {0xc04aa000}, {0xc04ac000}, {0xc04ae000}, 
-    {0xc04b0000}, {0xc04b2000}, {0xc04b4000}, {0xc04b6000}, 
-    {0xc04b8000}, {0xc04ba000}, {0xc04bc000}, {0xc04be000}, 
-    {0xc04c0000}, {0xc04c2000}, {0xc04c4000}, {0xc04c6000}, 
-    {0xc04c8000}, {0xc04ca000}, {0xc04cc000}, {0xc04ce000}, 
-    {0xc04d0000}, {0xc04d2000}, {0xc04d4000}, {0xc04d6000}, 
-    {0xc04d8000}, {0xc04da000}, {0xc04dc000}, {0xc04de000}, 
-    {0xc04e0000}, {0xc04e2000}, {0xc04e4000}, {0xc04e6000}, 
-    {0xc04e8000}, {0xc04ea000}, {0xc04ec000}, {0xc04ee000}, 
-    {0xc04f0000}, {0xc04f2000}, {0xc04f4000}, {0xc04f6000}, 
-    {0xc04f8000}, {0xc04fa000}, {0xc04fc000}, {0xc04fe000}, 
-    {0xc0500000}, {0xc0502000}, {0xc0504000}, {0xc0506000}, 
-    {0xc0508000}, {0xc050a000}, {0xc050c000}, {0xc050e000}, 
-    {0xc0510000}, {0xc0512000}, {0xc0514000}, {0xc0516000}, 
-    {0xc0518000}, {0xc051a000}, {0xc051c000}, {0xc051e000}, 
-    {0xc0520000}, {0xc0522000}, {0xc0524000}, {0xc0526000}, 
-    {0xc0528000}, {0xc052a000}, {0xc052c000}, {0xc052e000}, 
-    {0xc0530000}, {0xc0532000}, {0xc0534000}, {0xc0536000}, 
-    {0xc0538000}, {0xc053a000}, {0xc053c000}, {0xc053e000}, 
-    {0xc0540000}, {0xc0542000}, {0xc0544000}, {0xc0546000}, 
-    {0xc0548000}, {0xc054a000}, {0xc054c000}, {0xc054e000}, 
-    {0xc0550000}, {0xc0552000}, {0xc0554000}, {0xc0556000}, 
-    {0xc0558000}, {0xc055a000}, {0xc055c000}, {0xc055e000}, 
-    {0xc0560000}, {0xc0562000}, {0xc0564000}, {0xc0566000}, 
-    {0xc0568000}, {0xc056a000}, {0xc056c000}, {0xc056e000}, 
-    {0xc0570000}, {0xc0572000}, {0xc0574000}, {0xc0576000}, 
-    {0xc0578000}, {0xc057a000}, {0xc057c000}, {0xc057e000}, 
-    {0xc0580000}, {0xc0582000}, {0xc0584000}, {0xc0586000}, 
-    {0xc0588000}, {0xc058a000}, {0xc058c000}, {0xc058e000}, 
-    {0xc0590000}, {0xc0592000}, {0xc0594000}, {0xc0596000}, 
-    {0xc0598000}, {0xc059a000}, {0xc059c000}, {0xc059e000}, 
-    {0xc05a0000}, {0xc05a2000}, {0xc05a4000}, {0xc05a6000}, 
-    {0xc05a8000}, {0xc05aa000}, {0xc05ac000}, {0xc05ae000}, 
-    {0xc05b0000}, {0xc05b2000}, {0xc05b4000}, {0xc05b6000}, 
-    {0xc05b8000}, {0xc05ba000}, {0xc05bc000}, {0xc05be000}, 
-    {0xc05c0000}, {0xc05c2000}, {0xc05c4000}, {0xc05c6000}, 
-    {0xc05c8000}, {0xc05ca000}, {0xc05cc000}, {0xc05ce000}, 
-    {0xc05d0000}, {0xc05d2000}, {0xc05d4000}, {0xc05d6000}, 
-    {0xc05d8000}, {0xc05da000}, {0xc05dc000}, {0xc05de000}, 
-    {0xc05e0000}, {0xc05e2000}, {0xc05e4000}, {0xc05e6000}, 
-    {0xc05e8000}, {0xc05ea000}, {0xc05ec000}, {0xc05ee000}, 
-    {0xc05f0000}, {0xc05f2000}, {0xc05f4000}, {0xc05f6000}, 
-    {0xc05f8000}, {0xc05fa000}, {0xc05fc000}, {0xc05fe000}, 
-    {0xc0600000}, {0xc0602000}, {0xc0604000}, {0xc0606000}, 
-    {0xc0608000}, {0xc060a000}, {0xc060c000}, {0xc060e000}, 
-    {0xc0610000}, {0xc0612000}, {0xc0614000}, {0xc0616000}, 
-    {0xc0618000}, {0xc061a000}, {0xc061c000}, {0xc061e000}, 
-    {0xc0620000}, {0xc0622000}, {0xc0624000}, {0xc0626000}, 
-    {0xc0628000}, {0xc062a000}, {0xc062c000}, {0xc062e000}, 
-    {0xc0630000}, {0xc0632000}, {0xc0634000}, {0xc0636000}, 
-    {0xc0638000}, {0xc063a000}, {0xc063c000}, {0xc063e000}, 
-    {0xc0640000}, {0xc0642000}, {0xc0644000}, {0xc0646000}, 
-    {0xc0648000}, {0xc064a000}, {0xc064c000}, {0xc064e000}, 
-    {0xc0650000}, {0xc0652000}, {0xc0654000}, {0xc0656000}, 
-    {0xc0658000}, {0xc065a000}, {0xc065c000}, {0xc065e000}, 
-    {0xc0660000}, {0xc0662000}, {0xc0664000}, {0xc0666000}, 
-    {0xc0668000}, {0xc066a000}, {0xc066c000}, {0xc066e000}, 
-    {0xc0670000}, {0xc0672000}, {0xc0674000}, {0xc0676000}, 
-    {0xc0678000}, {0xc067a000}, {0xc067c000}, {0xc067e000}, 
-    {0xc0680000}, {0xc0682000}, {0xc0684000}, {0xc0686000}, 
-    {0xc0688000}, {0xc068a000}, {0xc068c000}, {0xc068e000}, 
-    {0xc0690000}, {0xc0692000}, {0xc0694000}, {0xc0696000}, 
-    {0xc0698000}, {0xc069a000}, {0xc069c000}, {0xc069e000}, 
-    {0xc06a0000}, {0xc06a2000}, {0xc06a4000}, {0xc06a6000}, 
-    {0xc06a8000}, {0xc06aa000}, {0xc06ac000}, {0xc06ae000}, 
-    {0xc06b0000}, {0xc06b2000}, {0xc06b4000}, {0xc06b6000}, 
-    {0xc06b8000}, {0xc06ba000}, {0xc06bc000}, {0xc06be000}, 
-    {0xc06c0000}, {0xc06c2000}, {0xc06c4000}, {0xc06c6000}, 
-    {0xc06c8000}, {0xc06ca000}, {0xc06cc000}, {0xc06ce000}, 
-    {0xc06d0000}, {0xc06d2000}, {0xc06d4000}, {0xc06d6000}, 
-    {0xc06d8000}, {0xc06da000}, {0xc06dc000}, {0xc06de000}, 
-    {0xc06e0000}, {0xc06e2000}, {0xc06e4000}, {0xc06e6000}, 
-    {0xc06e8000}, {0xc06ea000}, {0xc06ec000}, {0xc06ee000}, 
-    {0xc06f0000}, {0xc06f2000}, {0xc06f4000}, {0xc06f6000}, 
-    {0xc06f8000}, {0xc06fa000}, {0xc06fc000}, {0xc06fe000}, 
-    {0xc0700000}, {0xc0702000}, {0xc0704000}, {0xc0706000}, 
-    {0xc0708000}, {0xc070a000}, {0xc070c000}, {0xc070e000}, 
-    {0xc0710000}, {0xc0712000}, {0xc0714000}, {0xc0716000}, 
-    {0xc0718000}, {0xc071a000}, {0xc071c000}, {0xc071e000}, 
-    {0xc0720000}, {0xc0722000}, {0xc0724000}, {0xc0726000}, 
-    {0xc0728000}, {0xc072a000}, {0xc072c000}, {0xc072e000}, 
-    {0xc0730000}, {0xc0732000}, {0xc0734000}, {0xc0736000}, 
-    {0xc0738000}, {0xc073a000}, {0xc073c000}, {0xc073e000}, 
-    {0xc0740000}, {0xc0742000}, {0xc0744000}, {0xc0746000}, 
-    {0xc0748000}, {0xc074a000}, {0xc074c000}, {0xc074e000}, 
-    {0xc0750000}, {0xc0752000}, {0xc0754000}, {0xc0756000}, 
-    {0xc0758000}, {0xc075a000}, {0xc075c000}, {0xc075e000}, 
-    {0xc0760000}, {0xc0762000}, {0xc0764000}, {0xc0766000}, 
-    {0xc0768000}, {0xc076a000}, {0xc076c000}, {0xc076e000}, 
-    {0xc0770000}, {0xc0772000}, {0xc0774000}, {0xc0776000}, 
-    {0xc0778000}, {0xc077a000}, {0xc077c000}, {0xc077e000}, 
-    {0xc0780000}, {0xc0782000}, {0xc0784000}, {0xc0786000}, 
-    {0xc0788000}, {0xc078a000}, {0xc078c000}, {0xc078e000}, 
-    {0xc0790000}, {0xc0792000}, {0xc0794000}, {0xc0796000}, 
-    {0xc0798000}, {0xc079a000}, {0xc079c000}, {0xc079e000}, 
-    {0xc07a0000}, {0xc07a2000}, {0xc07a4000}, {0xc07a6000}, 
-    {0xc07a8000}, {0xc07aa000}, {0xc07ac000}, {0xc07ae000}, 
-    {0xc07b0000}, {0xc07b2000}, {0xc07b4000}, {0xc07b6000}, 
-    {0xc07b8000}, {0xc07ba000}, {0xc07bc000}, {0xc07be000}, 
-    {0xc07c0000}, {0xc07c2000}, {0xc07c4000}, {0xc07c6000}, 
-    {0xc07c8000}, {0xc07ca000}, {0xc07cc000}, {0xc07ce000}, 
-    {0xc07d0000}, {0xc07d2000}, {0xc07d4000}, {0xc07d6000}, 
-    {0xc07d8000}, {0xc07da000}, {0xc07dc000}, {0xc07de000}, 
-    {0xc07e0000}, {0xc07e2000}, {0xc07e4000}, {0xc07e6000}, 
-    {0xc07e8000}, {0xc07ea000}, {0xc07ec000}, {0xc07ee000}, 
-    {0xc07f0000}, {0xc07f2000}, {0xc07f4000}, {0xc07f6000}, 
-    {0xc07f8000}, {0xc07fa000}, {0xc07fc000}, {0xc07fe000}, 
-    {0xc0800000}, {0xc0802000}, {0xc0804000}, {0xc0806000}, 
-    {0xc0808000}, {0xc080a000}, {0xc080c000}, {0xc080e000}, 
-    {0xc0810000}, {0xc0812000}, {0xc0814000}, {0xc0816000}, 
-    {0xc0818000}, {0xc081a000}, {0xc081c000}, {0xc081e000}, 
-    {0xc0820000}, {0xc0822000}, {0xc0824000}, {0xc0826000}, 
-    {0xc0828000}, {0xc082a000}, {0xc082c000}, {0xc082e000}, 
-    {0xc0830000}, {0xc0832000}, {0xc0834000}, {0xc0836000}, 
-    {0xc0838000}, {0xc083a000}, {0xc083c000}, {0xc083e000}, 
-    {0xc0840000}, {0xc0842000}, {0xc0844000}, {0xc0846000}, 
-    {0xc0848000}, {0xc084a000}, {0xc084c000}, {0xc084e000}, 
-    {0xc0850000}, {0xc0852000}, {0xc0854000}, {0xc0856000}, 
-    {0xc0858000}, {0xc085a000}, {0xc085c000}, {0xc085e000}, 
-    {0xc0860000}, {0xc0862000}, {0xc0864000}, {0xc0866000}, 
-    {0xc0868000}, {0xc086a000}, {0xc086c000}, {0xc086e000}, 
-    {0xc0870000}, {0xc0872000}, {0xc0874000}, {0xc0876000}, 
-    {0xc0878000}, {0xc087a000}, {0xc087c000}, {0xc087e000}, 
-    {0xc0880000}, {0xc0882000}, {0xc0884000}, {0xc0886000}, 
-    {0xc0888000}, {0xc088a000}, {0xc088c000}, {0xc088e000}, 
-    {0xc0890000}, {0xc0892000}, {0xc0894000}, {0xc0896000}, 
-    {0xc0898000}, {0xc089a000}, {0xc089c000}, {0xc089e000}, 
-    {0xc08a0000}, {0xc08a2000}, {0xc08a4000}, {0xc08a6000}, 
-    {0xc08a8000}, {0xc08aa000}, {0xc08ac000}, {0xc08ae000}, 
-    {0xc08b0000}, {0xc08b2000}, {0xc08b4000}, {0xc08b6000}, 
-    {0xc08b8000}, {0xc08ba000}, {0xc08bc000}, {0xc08be000}, 
-    {0xc08c0000}, {0xc08c2000}, {0xc08c4000}, {0xc08c6000}, 
-    {0xc08c8000}, {0xc08ca000}, {0xc08cc000}, {0xc08ce000}, 
-    {0xc08d0000}, {0xc08d2000}, {0xc08d4000}, {0xc08d6000}, 
-    {0xc08d8000}, {0xc08da000}, {0xc08dc000}, {0xc08de000}, 
-    {0xc08e0000}, {0xc08e2000}, {0xc08e4000}, {0xc08e6000}, 
-    {0xc08e8000}, {0xc08ea000}, {0xc08ec000}, {0xc08ee000}, 
-    {0xc08f0000}, {0xc08f2000}, {0xc08f4000}, {0xc08f6000}, 
-    {0xc08f8000}, {0xc08fa000}, {0xc08fc000}, {0xc08fe000}, 
-    {0xc0900000}, {0xc0902000}, {0xc0904000}, {0xc0906000}, 
-    {0xc0908000}, {0xc090a000}, {0xc090c000}, {0xc090e000}, 
-    {0xc0910000}, {0xc0912000}, {0xc0914000}, {0xc0916000}, 
-    {0xc0918000}, {0xc091a000}, {0xc091c000}, {0xc091e000}, 
-    {0xc0920000}, {0xc0922000}, {0xc0924000}, {0xc0926000}, 
-    {0xc0928000}, {0xc092a000}, {0xc092c000}, {0xc092e000}, 
-    {0xc0930000}, {0xc0932000}, {0xc0934000}, {0xc0936000}, 
-    {0xc0938000}, {0xc093a000}, {0xc093c000}, {0xc093e000}, 
-    {0xc0940000}, {0xc0942000}, {0xc0944000}, {0xc0946000}, 
-    {0xc0948000}, {0xc094a000}, {0xc094c000}, {0xc094e000}, 
-    {0xc0950000}, {0xc0952000}, {0xc0954000}, {0xc0956000}, 
-    {0xc0958000}, {0xc095a000}, {0xc095c000}, {0xc095e000}, 
-    {0xc0960000}, {0xc0962000}, {0xc0964000}, {0xc0966000}, 
-    {0xc0968000}, {0xc096a000}, {0xc096c000}, {0xc096e000}, 
-    {0xc0970000}, {0xc0972000}, {0xc0974000}, {0xc0976000}, 
-    {0xc0978000}, {0xc097a000}, {0xc097c000}, {0xc097e000}, 
-    {0xc0980000}, {0xc0982000}, {0xc0984000}, {0xc0986000}, 
-    {0xc0988000}, {0xc098a000}, {0xc098c000}, {0xc098e000}, 
-    {0xc0990000}, {0xc0992000}, {0xc0994000}, {0xc0996000}, 
-    {0xc0998000}, {0xc099a000}, {0xc099c000}, {0xc099e000}, 
-    {0xc09a0000}, {0xc09a2000}, {0xc09a4000}, {0xc09a6000}, 
-    {0xc09a8000}, {0xc09aa000}, {0xc09ac000}, {0xc09ae000}, 
-    {0xc09b0000}, {0xc09b2000}, {0xc09b4000}, {0xc09b6000}, 
-    {0xc09b8000}, {0xc09ba000}, {0xc09bc000}, {0xc09be000}, 
-    {0xc09c0000}, {0xc09c2000}, {0xc09c4000}, {0xc09c6000}, 
-    {0xc09c8000}, {0xc09ca000}, {0xc09cc000}, {0xc09ce000}, 
-    {0xc09d0000}, {0xc09d2000}, {0xc09d4000}, {0xc09d6000}, 
-    {0xc09d8000}, {0xc09da000}, {0xc09dc000}, {0xc09de000}, 
-    {0xc09e0000}, {0xc09e2000}, {0xc09e4000}, {0xc09e6000}, 
-    {0xc09e8000}, {0xc09ea000}, {0xc09ec000}, {0xc09ee000}, 
-    {0xc09f0000}, {0xc09f2000}, {0xc09f4000}, {0xc09f6000}, 
-    {0xc09f8000}, {0xc09fa000}, {0xc09fc000}, {0xc09fe000}, 
-    {0xc0a00000}, {0xc0a02000}, {0xc0a04000}, {0xc0a06000}, 
-    {0xc0a08000}, {0xc0a0a000}, {0xc0a0c000}, {0xc0a0e000}, 
-    {0xc0a10000}, {0xc0a12000}, {0xc0a14000}, {0xc0a16000}, 
-    {0xc0a18000}, {0xc0a1a000}, {0xc0a1c000}, {0xc0a1e000}, 
-    {0xc0a20000}, {0xc0a22000}, {0xc0a24000}, {0xc0a26000}, 
-    {0xc0a28000}, {0xc0a2a000}, {0xc0a2c000}, {0xc0a2e000}, 
-    {0xc0a30000}, {0xc0a32000}, {0xc0a34000}, {0xc0a36000}, 
-    {0xc0a38000}, {0xc0a3a000}, {0xc0a3c000}, {0xc0a3e000}, 
-    {0xc0a40000}, {0xc0a42000}, {0xc0a44000}, {0xc0a46000}, 
-    {0xc0a48000}, {0xc0a4a000}, {0xc0a4c000}, {0xc0a4e000}, 
-    {0xc0a50000}, {0xc0a52000}, {0xc0a54000}, {0xc0a56000}, 
-    {0xc0a58000}, {0xc0a5a000}, {0xc0a5c000}, {0xc0a5e000}, 
-    {0xc0a60000}, {0xc0a62000}, {0xc0a64000}, {0xc0a66000}, 
-    {0xc0a68000}, {0xc0a6a000}, {0xc0a6c000}, {0xc0a6e000}, 
-    {0xc0a70000}, {0xc0a72000}, {0xc0a74000}, {0xc0a76000}, 
-    {0xc0a78000}, {0xc0a7a000}, {0xc0a7c000}, {0xc0a7e000}, 
-    {0xc0a80000}, {0xc0a82000}, {0xc0a84000}, {0xc0a86000}, 
-    {0xc0a88000}, {0xc0a8a000}, {0xc0a8c000}, {0xc0a8e000}, 
-    {0xc0a90000}, {0xc0a92000}, {0xc0a94000}, {0xc0a96000}, 
-    {0xc0a98000}, {0xc0a9a000}, {0xc0a9c000}, {0xc0a9e000}, 
-    {0xc0aa0000}, {0xc0aa2000}, {0xc0aa4000}, {0xc0aa6000}, 
-    {0xc0aa8000}, {0xc0aaa000}, {0xc0aac000}, {0xc0aae000}, 
-    {0xc0ab0000}, {0xc0ab2000}, {0xc0ab4000}, {0xc0ab6000}, 
-    {0xc0ab8000}, {0xc0aba000}, {0xc0abc000}, {0xc0abe000}, 
-    {0xc0ac0000}, {0xc0ac2000}, {0xc0ac4000}, {0xc0ac6000}, 
-    {0xc0ac8000}, {0xc0aca000}, {0xc0acc000}, {0xc0ace000}, 
-    {0xc0ad0000}, {0xc0ad2000}, {0xc0ad4000}, {0xc0ad6000}, 
-    {0xc0ad8000}, {0xc0ada000}, {0xc0adc000}, {0xc0ade000}, 
-    {0xc0ae0000}, {0xc0ae2000}, {0xc0ae4000}, {0xc0ae6000}, 
-    {0xc0ae8000}, {0xc0aea000}, {0xc0aec000}, {0xc0aee000}, 
-    {0xc0af0000}, {0xc0af2000}, {0xc0af4000}, {0xc0af6000}, 
-    {0xc0af8000}, {0xc0afa000}, {0xc0afc000}, {0xc0afe000}, 
-    {0xc0b00000}, {0xc0b02000}, {0xc0b04000}, {0xc0b06000}, 
-    {0xc0b08000}, {0xc0b0a000}, {0xc0b0c000}, {0xc0b0e000}, 
-    {0xc0b10000}, {0xc0b12000}, {0xc0b14000}, {0xc0b16000}, 
-    {0xc0b18000}, {0xc0b1a000}, {0xc0b1c000}, {0xc0b1e000}, 
-    {0xc0b20000}, {0xc0b22000}, {0xc0b24000}, {0xc0b26000}, 
-    {0xc0b28000}, {0xc0b2a000}, {0xc0b2c000}, {0xc0b2e000}, 
-    {0xc0b30000}, {0xc0b32000}, {0xc0b34000}, {0xc0b36000}, 
-    {0xc0b38000}, {0xc0b3a000}, {0xc0b3c000}, {0xc0b3e000}, 
-    {0xc0b40000}, {0xc0b42000}, {0xc0b44000}, {0xc0b46000}, 
-    {0xc0b48000}, {0xc0b4a000}, {0xc0b4c000}, {0xc0b4e000}, 
-    {0xc0b50000}, {0xc0b52000}, {0xc0b54000}, {0xc0b56000}, 
-    {0xc0b58000}, {0xc0b5a000}, {0xc0b5c000}, {0xc0b5e000}, 
-    {0xc0b60000}, {0xc0b62000}, {0xc0b64000}, {0xc0b66000}, 
-    {0xc0b68000}, {0xc0b6a000}, {0xc0b6c000}, {0xc0b6e000}, 
-    {0xc0b70000}, {0xc0b72000}, {0xc0b74000}, {0xc0b76000}, 
-    {0xc0b78000}, {0xc0b7a000}, {0xc0b7c000}, {0xc0b7e000}, 
-    {0xc0b80000}, {0xc0b82000}, {0xc0b84000}, {0xc0b86000}, 
-    {0xc0b88000}, {0xc0b8a000}, {0xc0b8c000}, {0xc0b8e000}, 
-    {0xc0b90000}, {0xc0b92000}, {0xc0b94000}, {0xc0b96000}, 
-    {0xc0b98000}, {0xc0b9a000}, {0xc0b9c000}, {0xc0b9e000}, 
-    {0xc0ba0000}, {0xc0ba2000}, {0xc0ba4000}, {0xc0ba6000}, 
-    {0xc0ba8000}, {0xc0baa000}, {0xc0bac000}, {0xc0bae000}, 
-    {0xc0bb0000}, {0xc0bb2000}, {0xc0bb4000}, {0xc0bb6000}, 
-    {0xc0bb8000}, {0xc0bba000}, {0xc0bbc000}, {0xc0bbe000}, 
-    {0xc0bc0000}, {0xc0bc2000}, {0xc0bc4000}, {0xc0bc6000}, 
-    {0xc0bc8000}, {0xc0bca000}, {0xc0bcc000}, {0xc0bce000}, 
-    {0xc0bd0000}, {0xc0bd2000}, {0xc0bd4000}, {0xc0bd6000}, 
-    {0xc0bd8000}, {0xc0bda000}, {0xc0bdc000}, {0xc0bde000}, 
-    {0xc0be0000}, {0xc0be2000}, {0xc0be4000}, {0xc0be6000}, 
-    {0xc0be8000}, {0xc0bea000}, {0xc0bec000}, {0xc0bee000}, 
-    {0xc0bf0000}, {0xc0bf2000}, {0xc0bf4000}, {0xc0bf6000}, 
-    {0xc0bf8000}, {0xc0bfa000}, {0xc0bfc000}, {0xc0bfe000}, 
-    {0xc0c00000}, {0xc0c02000}, {0xc0c04000}, {0xc0c06000}, 
-    {0xc0c08000}, {0xc0c0a000}, {0xc0c0c000}, {0xc0c0e000}, 
-    {0xc0c10000}, {0xc0c12000}, {0xc0c14000}, {0xc0c16000}, 
-    {0xc0c18000}, {0xc0c1a000}, {0xc0c1c000}, {0xc0c1e000}, 
-    {0xc0c20000}, {0xc0c22000}, {0xc0c24000}, {0xc0c26000}, 
-    {0xc0c28000}, {0xc0c2a000}, {0xc0c2c000}, {0xc0c2e000}, 
-    {0xc0c30000}, {0xc0c32000}, {0xc0c34000}, {0xc0c36000}, 
-    {0xc0c38000}, {0xc0c3a000}, {0xc0c3c000}, {0xc0c3e000}, 
-    {0xc0c40000}, {0xc0c42000}, {0xc0c44000}, {0xc0c46000}, 
-    {0xc0c48000}, {0xc0c4a000}, {0xc0c4c000}, {0xc0c4e000}, 
-    {0xc0c50000}, {0xc0c52000}, {0xc0c54000}, {0xc0c56000}, 
-    {0xc0c58000}, {0xc0c5a000}, {0xc0c5c000}, {0xc0c5e000}, 
-    {0xc0c60000}, {0xc0c62000}, {0xc0c64000}, {0xc0c66000}, 
-    {0xc0c68000}, {0xc0c6a000}, {0xc0c6c000}, {0xc0c6e000}, 
-    {0xc0c70000}, {0xc0c72000}, {0xc0c74000}, {0xc0c76000}, 
-    {0xc0c78000}, {0xc0c7a000}, {0xc0c7c000}, {0xc0c7e000}, 
-    {0xc0c80000}, {0xc0c82000}, {0xc0c84000}, {0xc0c86000}, 
-    {0xc0c88000}, {0xc0c8a000}, {0xc0c8c000}, {0xc0c8e000}, 
-    {0xc0c90000}, {0xc0c92000}, {0xc0c94000}, {0xc0c96000}, 
-    {0xc0c98000}, {0xc0c9a000}, {0xc0c9c000}, {0xc0c9e000}, 
-    {0xc0ca0000}, {0xc0ca2000}, {0xc0ca4000}, {0xc0ca6000}, 
-    {0xc0ca8000}, {0xc0caa000}, {0xc0cac000}, {0xc0cae000}, 
-    {0xc0cb0000}, {0xc0cb2000}, {0xc0cb4000}, {0xc0cb6000}, 
-    {0xc0cb8000}, {0xc0cba000}, {0xc0cbc000}, {0xc0cbe000}, 
-    {0xc0cc0000}, {0xc0cc2000}, {0xc0cc4000}, {0xc0cc6000}, 
-    {0xc0cc8000}, {0xc0cca000}, {0xc0ccc000}, {0xc0cce000}, 
-    {0xc0cd0000}, {0xc0cd2000}, {0xc0cd4000}, {0xc0cd6000}, 
-    {0xc0cd8000}, {0xc0cda000}, {0xc0cdc000}, {0xc0cde000}, 
-    {0xc0ce0000}, {0xc0ce2000}, {0xc0ce4000}, {0xc0ce6000}, 
-    {0xc0ce8000}, {0xc0cea000}, {0xc0cec000}, {0xc0cee000}, 
-    {0xc0cf0000}, {0xc0cf2000}, {0xc0cf4000}, {0xc0cf6000}, 
-    {0xc0cf8000}, {0xc0cfa000}, {0xc0cfc000}, {0xc0cfe000}, 
-    {0xc0d00000}, {0xc0d02000}, {0xc0d04000}, {0xc0d06000}, 
-    {0xc0d08000}, {0xc0d0a000}, {0xc0d0c000}, {0xc0d0e000}, 
-    {0xc0d10000}, {0xc0d12000}, {0xc0d14000}, {0xc0d16000}, 
-    {0xc0d18000}, {0xc0d1a000}, {0xc0d1c000}, {0xc0d1e000}, 
-    {0xc0d20000}, {0xc0d22000}, {0xc0d24000}, {0xc0d26000}, 
-    {0xc0d28000}, {0xc0d2a000}, {0xc0d2c000}, {0xc0d2e000}, 
-    {0xc0d30000}, {0xc0d32000}, {0xc0d34000}, {0xc0d36000}, 
-    {0xc0d38000}, {0xc0d3a000}, {0xc0d3c000}, {0xc0d3e000}, 
-    {0xc0d40000}, {0xc0d42000}, {0xc0d44000}, {0xc0d46000}, 
-    {0xc0d48000}, {0xc0d4a000}, {0xc0d4c000}, {0xc0d4e000}, 
-    {0xc0d50000}, {0xc0d52000}, {0xc0d54000}, {0xc0d56000}, 
-    {0xc0d58000}, {0xc0d5a000}, {0xc0d5c000}, {0xc0d5e000}, 
-    {0xc0d60000}, {0xc0d62000}, {0xc0d64000}, {0xc0d66000}, 
-    {0xc0d68000}, {0xc0d6a000}, {0xc0d6c000}, {0xc0d6e000}, 
-    {0xc0d70000}, {0xc0d72000}, {0xc0d74000}, {0xc0d76000}, 
-    {0xc0d78000}, {0xc0d7a000}, {0xc0d7c000}, {0xc0d7e000}, 
-    {0xc0d80000}, {0xc0d82000}, {0xc0d84000}, {0xc0d86000}, 
-    {0xc0d88000}, {0xc0d8a000}, {0xc0d8c000}, {0xc0d8e000}, 
-    {0xc0d90000}, {0xc0d92000}, {0xc0d94000}, {0xc0d96000}, 
-    {0xc0d98000}, {0xc0d9a000}, {0xc0d9c000}, {0xc0d9e000}, 
-    {0xc0da0000}, {0xc0da2000}, {0xc0da4000}, {0xc0da6000}, 
-    {0xc0da8000}, {0xc0daa000}, {0xc0dac000}, {0xc0dae000}, 
-    {0xc0db0000}, {0xc0db2000}, {0xc0db4000}, {0xc0db6000}, 
-    {0xc0db8000}, {0xc0dba000}, {0xc0dbc000}, {0xc0dbe000}, 
-    {0xc0dc0000}, {0xc0dc2000}, {0xc0dc4000}, {0xc0dc6000}, 
-    {0xc0dc8000}, {0xc0dca000}, {0xc0dcc000}, {0xc0dce000}, 
-    {0xc0dd0000}, {0xc0dd2000}, {0xc0dd4000}, {0xc0dd6000}, 
-    {0xc0dd8000}, {0xc0dda000}, {0xc0ddc000}, {0xc0dde000}, 
-    {0xc0de0000}, {0xc0de2000}, {0xc0de4000}, {0xc0de6000}, 
-    {0xc0de8000}, {0xc0dea000}, {0xc0dec000}, {0xc0dee000}, 
-    {0xc0df0000}, {0xc0df2000}, {0xc0df4000}, {0xc0df6000}, 
-    {0xc0df8000}, {0xc0dfa000}, {0xc0dfc000}, {0xc0dfe000}, 
-    {0xc0e00000}, {0xc0e02000}, {0xc0e04000}, {0xc0e06000}, 
-    {0xc0e08000}, {0xc0e0a000}, {0xc0e0c000}, {0xc0e0e000}, 
-    {0xc0e10000}, {0xc0e12000}, {0xc0e14000}, {0xc0e16000}, 
-    {0xc0e18000}, {0xc0e1a000}, {0xc0e1c000}, {0xc0e1e000}, 
-    {0xc0e20000}, {0xc0e22000}, {0xc0e24000}, {0xc0e26000}, 
-    {0xc0e28000}, {0xc0e2a000}, {0xc0e2c000}, {0xc0e2e000}, 
-    {0xc0e30000}, {0xc0e32000}, {0xc0e34000}, {0xc0e36000}, 
-    {0xc0e38000}, {0xc0e3a000}, {0xc0e3c000}, {0xc0e3e000}, 
-    {0xc0e40000}, {0xc0e42000}, {0xc0e44000}, {0xc0e46000}, 
-    {0xc0e48000}, {0xc0e4a000}, {0xc0e4c000}, {0xc0e4e000}, 
-    {0xc0e50000}, {0xc0e52000}, {0xc0e54000}, {0xc0e56000}, 
-    {0xc0e58000}, {0xc0e5a000}, {0xc0e5c000}, {0xc0e5e000}, 
-    {0xc0e60000}, {0xc0e62000}, {0xc0e64000}, {0xc0e66000}, 
-    {0xc0e68000}, {0xc0e6a000}, {0xc0e6c000}, {0xc0e6e000}, 
-    {0xc0e70000}, {0xc0e72000}, {0xc0e74000}, {0xc0e76000}, 
-    {0xc0e78000}, {0xc0e7a000}, {0xc0e7c000}, {0xc0e7e000}, 
-    {0xc0e80000}, {0xc0e82000}, {0xc0e84000}, {0xc0e86000}, 
-    {0xc0e88000}, {0xc0e8a000}, {0xc0e8c000}, {0xc0e8e000}, 
-    {0xc0e90000}, {0xc0e92000}, {0xc0e94000}, {0xc0e96000}, 
-    {0xc0e98000}, {0xc0e9a000}, {0xc0e9c000}, {0xc0e9e000}, 
-    {0xc0ea0000}, {0xc0ea2000}, {0xc0ea4000}, {0xc0ea6000}, 
-    {0xc0ea8000}, {0xc0eaa000}, {0xc0eac000}, {0xc0eae000}, 
-    {0xc0eb0000}, {0xc0eb2000}, {0xc0eb4000}, {0xc0eb6000}, 
-    {0xc0eb8000}, {0xc0eba000}, {0xc0ebc000}, {0xc0ebe000}, 
-    {0xc0ec0000}, {0xc0ec2000}, {0xc0ec4000}, {0xc0ec6000}, 
-    {0xc0ec8000}, {0xc0eca000}, {0xc0ecc000}, {0xc0ece000}, 
-    {0xc0ed0000}, {0xc0ed2000}, {0xc0ed4000}, {0xc0ed6000}, 
-    {0xc0ed8000}, {0xc0eda000}, {0xc0edc000}, {0xc0ede000}, 
-    {0xc0ee0000}, {0xc0ee2000}, {0xc0ee4000}, {0xc0ee6000}, 
-    {0xc0ee8000}, {0xc0eea000}, {0xc0eec000}, {0xc0eee000}, 
-    {0xc0ef0000}, {0xc0ef2000}, {0xc0ef4000}, {0xc0ef6000}, 
-    {0xc0ef8000}, {0xc0efa000}, {0xc0efc000}, {0xc0efe000}, 
-    {0xc0f00000}, {0xc0f02000}, {0xc0f04000}, {0xc0f06000}, 
-    {0xc0f08000}, {0xc0f0a000}, {0xc0f0c000}, {0xc0f0e000}, 
-    {0xc0f10000}, {0xc0f12000}, {0xc0f14000}, {0xc0f16000}, 
-    {0xc0f18000}, {0xc0f1a000}, {0xc0f1c000}, {0xc0f1e000}, 
-    {0xc0f20000}, {0xc0f22000}, {0xc0f24000}, {0xc0f26000}, 
-    {0xc0f28000}, {0xc0f2a000}, {0xc0f2c000}, {0xc0f2e000}, 
-    {0xc0f30000}, {0xc0f32000}, {0xc0f34000}, {0xc0f36000}, 
-    {0xc0f38000}, {0xc0f3a000}, {0xc0f3c000}, {0xc0f3e000}, 
-    {0xc0f40000}, {0xc0f42000}, {0xc0f44000}, {0xc0f46000}, 
-    {0xc0f48000}, {0xc0f4a000}, {0xc0f4c000}, {0xc0f4e000}, 
-    {0xc0f50000}, {0xc0f52000}, {0xc0f54000}, {0xc0f56000}, 
-    {0xc0f58000}, {0xc0f5a000}, {0xc0f5c000}, {0xc0f5e000}, 
-    {0xc0f60000}, {0xc0f62000}, {0xc0f64000}, {0xc0f66000}, 
-    {0xc0f68000}, {0xc0f6a000}, {0xc0f6c000}, {0xc0f6e000}, 
-    {0xc0f70000}, {0xc0f72000}, {0xc0f74000}, {0xc0f76000}, 
-    {0xc0f78000}, {0xc0f7a000}, {0xc0f7c000}, {0xc0f7e000}, 
-    {0xc0f80000}, {0xc0f82000}, {0xc0f84000}, {0xc0f86000}, 
-    {0xc0f88000}, {0xc0f8a000}, {0xc0f8c000}, {0xc0f8e000}, 
-    {0xc0f90000}, {0xc0f92000}, {0xc0f94000}, {0xc0f96000}, 
-    {0xc0f98000}, {0xc0f9a000}, {0xc0f9c000}, {0xc0f9e000}, 
-    {0xc0fa0000}, {0xc0fa2000}, {0xc0fa4000}, {0xc0fa6000}, 
-    {0xc0fa8000}, {0xc0faa000}, {0xc0fac000}, {0xc0fae000}, 
-    {0xc0fb0000}, {0xc0fb2000}, {0xc0fb4000}, {0xc0fb6000}, 
-    {0xc0fb8000}, {0xc0fba000}, {0xc0fbc000}, {0xc0fbe000}, 
-    {0xc0fc0000}, {0xc0fc2000}, {0xc0fc4000}, {0xc0fc6000}, 
-    {0xc0fc8000}, {0xc0fca000}, {0xc0fcc000}, {0xc0fce000}, 
-    {0xc0fd0000}, {0xc0fd2000}, {0xc0fd4000}, {0xc0fd6000}, 
-    {0xc0fd8000}, {0xc0fda000}, {0xc0fdc000}, {0xc0fde000}, 
-    {0xc0fe0000}, {0xc0fe2000}, {0xc0fe4000}, {0xc0fe6000}, 
-    {0xc0fe8000}, {0xc0fea000}, {0xc0fec000}, {0xc0fee000}, 
-    {0xc0ff0000}, {0xc0ff2000}, {0xc0ff4000}, {0xc0ff6000}, 
-    {0xc0ff8000}, {0xc0ffa000}, {0xc0ffc000}, {0xc0ffe000}, 
-    {0xc1000000}, {0xc1002000}, {0xc1004000}, {0xc1006000}, 
-    {0xc1008000}, {0xc100a000}, {0xc100c000}, {0xc100e000}, 
-    {0xc1010000}, {0xc1012000}, {0xc1014000}, {0xc1016000}, 
-    {0xc1018000}, {0xc101a000}, {0xc101c000}, {0xc101e000}, 
-    {0xc1020000}, {0xc1022000}, {0xc1024000}, {0xc1026000}, 
-    {0xc1028000}, {0xc102a000}, {0xc102c000}, {0xc102e000}, 
-    {0xc1030000}, {0xc1032000}, {0xc1034000}, {0xc1036000}, 
-    {0xc1038000}, {0xc103a000}, {0xc103c000}, {0xc103e000}, 
-    {0xc1040000}, {0xc1042000}, {0xc1044000}, {0xc1046000}, 
-    {0xc1048000}, {0xc104a000}, {0xc104c000}, {0xc104e000}, 
-    {0xc1050000}, {0xc1052000}, {0xc1054000}, {0xc1056000}, 
-    {0xc1058000}, {0xc105a000}, {0xc105c000}, {0xc105e000}, 
-    {0xc1060000}, {0xc1062000}, {0xc1064000}, {0xc1066000}, 
-    {0xc1068000}, {0xc106a000}, {0xc106c000}, {0xc106e000}, 
-    {0xc1070000}, {0xc1072000}, {0xc1074000}, {0xc1076000}, 
-    {0xc1078000}, {0xc107a000}, {0xc107c000}, {0xc107e000}, 
-    {0xc1080000}, {0xc1082000}, {0xc1084000}, {0xc1086000}, 
-    {0xc1088000}, {0xc108a000}, {0xc108c000}, {0xc108e000}, 
-    {0xc1090000}, {0xc1092000}, {0xc1094000}, {0xc1096000}, 
-    {0xc1098000}, {0xc109a000}, {0xc109c000}, {0xc109e000}, 
-    {0xc10a0000}, {0xc10a2000}, {0xc10a4000}, {0xc10a6000}, 
-    {0xc10a8000}, {0xc10aa000}, {0xc10ac000}, {0xc10ae000}, 
-    {0xc10b0000}, {0xc10b2000}, {0xc10b4000}, {0xc10b6000}, 
-    {0xc10b8000}, {0xc10ba000}, {0xc10bc000}, {0xc10be000}, 
-    {0xc10c0000}, {0xc10c2000}, {0xc10c4000}, {0xc10c6000}, 
-    {0xc10c8000}, {0xc10ca000}, {0xc10cc000}, {0xc10ce000}, 
-    {0xc10d0000}, {0xc10d2000}, {0xc10d4000}, {0xc10d6000}, 
-    {0xc10d8000}, {0xc10da000}, {0xc10dc000}, {0xc10de000}, 
-    {0xc10e0000}, {0xc10e2000}, {0xc10e4000}, {0xc10e6000}, 
-    {0xc10e8000}, {0xc10ea000}, {0xc10ec000}, {0xc10ee000}, 
-    {0xc10f0000}, {0xc10f2000}, {0xc10f4000}, {0xc10f6000}, 
-    {0xc10f8000}, {0xc10fa000}, {0xc10fc000}, {0xc10fe000}, 
-    {0xc1100000}, {0xc1102000}, {0xc1104000}, {0xc1106000}, 
-    {0xc1108000}, {0xc110a000}, {0xc110c000}, {0xc110e000}, 
-    {0xc1110000}, {0xc1112000}, {0xc1114000}, {0xc1116000}, 
-    {0xc1118000}, {0xc111a000}, {0xc111c000}, {0xc111e000}, 
-    {0xc1120000}, {0xc1122000}, {0xc1124000}, {0xc1126000}, 
-    {0xc1128000}, {0xc112a000}, {0xc112c000}, {0xc112e000}, 
-    {0xc1130000}, {0xc1132000}, {0xc1134000}, {0xc1136000}, 
-    {0xc1138000}, {0xc113a000}, {0xc113c000}, {0xc113e000}, 
-    {0xc1140000}, {0xc1142000}, {0xc1144000}, {0xc1146000}, 
-    {0xc1148000}, {0xc114a000}, {0xc114c000}, {0xc114e000}, 
-    {0xc1150000}, {0xc1152000}, {0xc1154000}, {0xc1156000}, 
-    {0xc1158000}, {0xc115a000}, {0xc115c000}, {0xc115e000}, 
-    {0xc1160000}, {0xc1162000}, {0xc1164000}, {0xc1166000}, 
-    {0xc1168000}, {0xc116a000}, {0xc116c000}, {0xc116e000}, 
-    {0xc1170000}, {0xc1172000}, {0xc1174000}, {0xc1176000}, 
-    {0xc1178000}, {0xc117a000}, {0xc117c000}, {0xc117e000}, 
-    {0xc1180000}, {0xc1182000}, {0xc1184000}, {0xc1186000}, 
-    {0xc1188000}, {0xc118a000}, {0xc118c000}, {0xc118e000}, 
-    {0xc1190000}, {0xc1192000}, {0xc1194000}, {0xc1196000}, 
-    {0xc1198000}, {0xc119a000}, {0xc119c000}, {0xc119e000}, 
-    {0xc11a0000}, {0xc11a2000}, {0xc11a4000}, {0xc11a6000}, 
-    {0xc11a8000}, {0xc11aa000}, {0xc11ac000}, {0xc11ae000}, 
-    {0xc11b0000}, {0xc11b2000}, {0xc11b4000}, {0xc11b6000}, 
-    {0xc11b8000}, {0xc11ba000}, {0xc11bc000}, {0xc11be000}, 
-    {0xc11c0000}, {0xc11c2000}, {0xc11c4000}, {0xc11c6000}, 
-    {0xc11c8000}, {0xc11ca000}, {0xc11cc000}, {0xc11ce000}, 
-    {0xc11d0000}, {0xc11d2000}, {0xc11d4000}, {0xc11d6000}, 
-    {0xc11d8000}, {0xc11da000}, {0xc11dc000}, {0xc11de000}, 
-    {0xc11e0000}, {0xc11e2000}, {0xc11e4000}, {0xc11e6000}, 
-    {0xc11e8000}, {0xc11ea000}, {0xc11ec000}, {0xc11ee000}, 
-    {0xc11f0000}, {0xc11f2000}, {0xc11f4000}, {0xc11f6000}, 
-    {0xc11f8000}, {0xc11fa000}, {0xc11fc000}, {0xc11fe000}, 
-    {0xc1200000}, {0xc1202000}, {0xc1204000}, {0xc1206000}, 
-    {0xc1208000}, {0xc120a000}, {0xc120c000}, {0xc120e000}, 
-    {0xc1210000}, {0xc1212000}, {0xc1214000}, {0xc1216000}, 
-    {0xc1218000}, {0xc121a000}, {0xc121c000}, {0xc121e000}, 
-    {0xc1220000}, {0xc1222000}, {0xc1224000}, {0xc1226000}, 
-    {0xc1228000}, {0xc122a000}, {0xc122c000}, {0xc122e000}, 
-    {0xc1230000}, {0xc1232000}, {0xc1234000}, {0xc1236000}, 
-    {0xc1238000}, {0xc123a000}, {0xc123c000}, {0xc123e000}, 
-    {0xc1240000}, {0xc1242000}, {0xc1244000}, {0xc1246000}, 
-    {0xc1248000}, {0xc124a000}, {0xc124c000}, {0xc124e000}, 
-    {0xc1250000}, {0xc1252000}, {0xc1254000}, {0xc1256000}, 
-    {0xc1258000}, {0xc125a000}, {0xc125c000}, {0xc125e000}, 
-    {0xc1260000}, {0xc1262000}, {0xc1264000}, {0xc1266000}, 
-    {0xc1268000}, {0xc126a000}, {0xc126c000}, {0xc126e000}, 
-    {0xc1270000}, {0xc1272000}, {0xc1274000}, {0xc1276000}, 
-    {0xc1278000}, {0xc127a000}, {0xc127c000}, {0xc127e000}, 
-    {0xc1280000}, {0xc1282000}, {0xc1284000}, {0xc1286000}, 
-    {0xc1288000}, {0xc128a000}, {0xc128c000}, {0xc128e000}, 
-    {0xc1290000}, {0xc1292000}, {0xc1294000}, {0xc1296000}, 
-    {0xc1298000}, {0xc129a000}, {0xc129c000}, {0xc129e000}, 
-    {0xc12a0000}, {0xc12a2000}, {0xc12a4000}, {0xc12a6000}, 
-    {0xc12a8000}, {0xc12aa000}, {0xc12ac000}, {0xc12ae000}, 
-    {0xc12b0000}, {0xc12b2000}, {0xc12b4000}, {0xc12b6000}, 
-    {0xc12b8000}, {0xc12ba000}, {0xc12bc000}, {0xc12be000}, 
-    {0xc12c0000}, {0xc12c2000}, {0xc12c4000}, {0xc12c6000}, 
-    {0xc12c8000}, {0xc12ca000}, {0xc12cc000}, {0xc12ce000}, 
-    {0xc12d0000}, {0xc12d2000}, {0xc12d4000}, {0xc12d6000}, 
-    {0xc12d8000}, {0xc12da000}, {0xc12dc000}, {0xc12de000}, 
-    {0xc12e0000}, {0xc12e2000}, {0xc12e4000}, {0xc12e6000}, 
-    {0xc12e8000}, {0xc12ea000}, {0xc12ec000}, {0xc12ee000}, 
-    {0xc12f0000}, {0xc12f2000}, {0xc12f4000}, {0xc12f6000}, 
-    {0xc12f8000}, {0xc12fa000}, {0xc12fc000}, {0xc12fe000}, 
-    {0xc1300000}, {0xc1302000}, {0xc1304000}, {0xc1306000}, 
-    {0xc1308000}, {0xc130a000}, {0xc130c000}, {0xc130e000}, 
-    {0xc1310000}, {0xc1312000}, {0xc1314000}, {0xc1316000}, 
-    {0xc1318000}, {0xc131a000}, {0xc131c000}, {0xc131e000}, 
-    {0xc1320000}, {0xc1322000}, {0xc1324000}, {0xc1326000}, 
-    {0xc1328000}, {0xc132a000}, {0xc132c000}, {0xc132e000}, 
-    {0xc1330000}, {0xc1332000}, {0xc1334000}, {0xc1336000}, 
-    {0xc1338000}, {0xc133a000}, {0xc133c000}, {0xc133e000}, 
-    {0xc1340000}, {0xc1342000}, {0xc1344000}, {0xc1346000}, 
-    {0xc1348000}, {0xc134a000}, {0xc134c000}, {0xc134e000}, 
-    {0xc1350000}, {0xc1352000}, {0xc1354000}, {0xc1356000}, 
-    {0xc1358000}, {0xc135a000}, {0xc135c000}, {0xc135e000}, 
-    {0xc1360000}, {0xc1362000}, {0xc1364000}, {0xc1366000}, 
-    {0xc1368000}, {0xc136a000}, {0xc136c000}, {0xc136e000}, 
-    {0xc1370000}, {0xc1372000}, {0xc1374000}, {0xc1376000}, 
-    {0xc1378000}, {0xc137a000}, {0xc137c000}, {0xc137e000}, 
-    {0xc1380000}, {0xc1382000}, {0xc1384000}, {0xc1386000}, 
-    {0xc1388000}, {0xc138a000}, {0xc138c000}, {0xc138e000}, 
-    {0xc1390000}, {0xc1392000}, {0xc1394000}, {0xc1396000}, 
-    {0xc1398000}, {0xc139a000}, {0xc139c000}, {0xc139e000}, 
-    {0xc13a0000}, {0xc13a2000}, {0xc13a4000}, {0xc13a6000}, 
-    {0xc13a8000}, {0xc13aa000}, {0xc13ac000}, {0xc13ae000}, 
-    {0xc13b0000}, {0xc13b2000}, {0xc13b4000}, {0xc13b6000}, 
-    {0xc13b8000}, {0xc13ba000}, {0xc13bc000}, {0xc13be000}, 
-    {0xc13c0000}, {0xc13c2000}, {0xc13c4000}, {0xc13c6000}, 
-    {0xc13c8000}, {0xc13ca000}, {0xc13cc000}, {0xc13ce000}, 
-    {0xc13d0000}, {0xc13d2000}, {0xc13d4000}, {0xc13d6000}, 
-    {0xc13d8000}, {0xc13da000}, {0xc13dc000}, {0xc13de000}, 
-    {0xc13e0000}, {0xc13e2000}, {0xc13e4000}, {0xc13e6000}, 
-    {0xc13e8000}, {0xc13ea000}, {0xc13ec000}, {0xc13ee000}, 
-    {0xc13f0000}, {0xc13f2000}, {0xc13f4000}, {0xc13f6000}, 
-    {0xc13f8000}, {0xc13fa000}, {0xc13fc000}, {0xc13fe000}, 
-    {0xc1400000}, {0xc1402000}, {0xc1404000}, {0xc1406000}, 
-    {0xc1408000}, {0xc140a000}, {0xc140c000}, {0xc140e000}, 
-    {0xc1410000}, {0xc1412000}, {0xc1414000}, {0xc1416000}, 
-    {0xc1418000}, {0xc141a000}, {0xc141c000}, {0xc141e000}, 
-    {0xc1420000}, {0xc1422000}, {0xc1424000}, {0xc1426000}, 
-    {0xc1428000}, {0xc142a000}, {0xc142c000}, {0xc142e000}, 
-    {0xc1430000}, {0xc1432000}, {0xc1434000}, {0xc1436000}, 
-    {0xc1438000}, {0xc143a000}, {0xc143c000}, {0xc143e000}, 
-    {0xc1440000}, {0xc1442000}, {0xc1444000}, {0xc1446000}, 
-    {0xc1448000}, {0xc144a000}, {0xc144c000}, {0xc144e000}, 
-    {0xc1450000}, {0xc1452000}, {0xc1454000}, {0xc1456000}, 
-    {0xc1458000}, {0xc145a000}, {0xc145c000}, {0xc145e000}, 
-    {0xc1460000}, {0xc1462000}, {0xc1464000}, {0xc1466000}, 
-    {0xc1468000}, {0xc146a000}, {0xc146c000}, {0xc146e000}, 
-    {0xc1470000}, {0xc1472000}, {0xc1474000}, {0xc1476000}, 
-    {0xc1478000}, {0xc147a000}, {0xc147c000}, {0xc147e000}, 
-    {0xc1480000}, {0xc1482000}, {0xc1484000}, {0xc1486000}, 
-    {0xc1488000}, {0xc148a000}, {0xc148c000}, {0xc148e000}, 
-    {0xc1490000}, {0xc1492000}, {0xc1494000}, {0xc1496000}, 
-    {0xc1498000}, {0xc149a000}, {0xc149c000}, {0xc149e000}, 
-    {0xc14a0000}, {0xc14a2000}, {0xc14a4000}, {0xc14a6000}, 
-    {0xc14a8000}, {0xc14aa000}, {0xc14ac000}, {0xc14ae000}, 
-    {0xc14b0000}, {0xc14b2000}, {0xc14b4000}, {0xc14b6000}, 
-    {0xc14b8000}, {0xc14ba000}, {0xc14bc000}, {0xc14be000}, 
-    {0xc14c0000}, {0xc14c2000}, {0xc14c4000}, {0xc14c6000}, 
-    {0xc14c8000}, {0xc14ca000}, {0xc14cc000}, {0xc14ce000}, 
-    {0xc14d0000}, {0xc14d2000}, {0xc14d4000}, {0xc14d6000}, 
-    {0xc14d8000}, {0xc14da000}, {0xc14dc000}, {0xc14de000}, 
-    {0xc14e0000}, {0xc14e2000}, {0xc14e4000}, {0xc14e6000}, 
-    {0xc14e8000}, {0xc14ea000}, {0xc14ec000}, {0xc14ee000}, 
-    {0xc14f0000}, {0xc14f2000}, {0xc14f4000}, {0xc14f6000}, 
-    {0xc14f8000}, {0xc14fa000}, {0xc14fc000}, {0xc14fe000}, 
-    {0xc1500000}, {0xc1502000}, {0xc1504000}, {0xc1506000}, 
-    {0xc1508000}, {0xc150a000}, {0xc150c000}, {0xc150e000}, 
-    {0xc1510000}, {0xc1512000}, {0xc1514000}, {0xc1516000}, 
-    {0xc1518000}, {0xc151a000}, {0xc151c000}, {0xc151e000}, 
-    {0xc1520000}, {0xc1522000}, {0xc1524000}, {0xc1526000}, 
-    {0xc1528000}, {0xc152a000}, {0xc152c000}, {0xc152e000}, 
-    {0xc1530000}, {0xc1532000}, {0xc1534000}, {0xc1536000}, 
-    {0xc1538000}, {0xc153a000}, {0xc153c000}, {0xc153e000}, 
-    {0xc1540000}, {0xc1542000}, {0xc1544000}, {0xc1546000}, 
-    {0xc1548000}, {0xc154a000}, {0xc154c000}, {0xc154e000}, 
-    {0xc1550000}, {0xc1552000}, {0xc1554000}, {0xc1556000}, 
-    {0xc1558000}, {0xc155a000}, {0xc155c000}, {0xc155e000}, 
-    {0xc1560000}, {0xc1562000}, {0xc1564000}, {0xc1566000}, 
-    {0xc1568000}, {0xc156a000}, {0xc156c000}, {0xc156e000}, 
-    {0xc1570000}, {0xc1572000}, {0xc1574000}, {0xc1576000}, 
-    {0xc1578000}, {0xc157a000}, {0xc157c000}, {0xc157e000}, 
-    {0xc1580000}, {0xc1582000}, {0xc1584000}, {0xc1586000}, 
-    {0xc1588000}, {0xc158a000}, {0xc158c000}, {0xc158e000}, 
-    {0xc1590000}, {0xc1592000}, {0xc1594000}, {0xc1596000}, 
-    {0xc1598000}, {0xc159a000}, {0xc159c000}, {0xc159e000}, 
-    {0xc15a0000}, {0xc15a2000}, {0xc15a4000}, {0xc15a6000}, 
-    {0xc15a8000}, {0xc15aa000}, {0xc15ac000}, {0xc15ae000}, 
-    {0xc15b0000}, {0xc15b2000}, {0xc15b4000}, {0xc15b6000}, 
-    {0xc15b8000}, {0xc15ba000}, {0xc15bc000}, {0xc15be000}, 
-    {0xc15c0000}, {0xc15c2000}, {0xc15c4000}, {0xc15c6000}, 
-    {0xc15c8000}, {0xc15ca000}, {0xc15cc000}, {0xc15ce000}, 
-    {0xc15d0000}, {0xc15d2000}, {0xc15d4000}, {0xc15d6000}, 
-    {0xc15d8000}, {0xc15da000}, {0xc15dc000}, {0xc15de000}, 
-    {0xc15e0000}, {0xc15e2000}, {0xc15e4000}, {0xc15e6000}, 
-    {0xc15e8000}, {0xc15ea000}, {0xc15ec000}, {0xc15ee000}, 
-    {0xc15f0000}, {0xc15f2000}, {0xc15f4000}, {0xc15f6000}, 
-    {0xc15f8000}, {0xc15fa000}, {0xc15fc000}, {0xc15fe000}, 
-    {0xc1600000}, {0xc1602000}, {0xc1604000}, {0xc1606000}, 
-    {0xc1608000}, {0xc160a000}, {0xc160c000}, {0xc160e000}, 
-    {0xc1610000}, {0xc1612000}, {0xc1614000}, {0xc1616000}, 
-    {0xc1618000}, {0xc161a000}, {0xc161c000}, {0xc161e000}, 
-    {0xc1620000}, {0xc1622000}, {0xc1624000}, {0xc1626000}, 
-    {0xc1628000}, {0xc162a000}, {0xc162c000}, {0xc162e000}, 
-    {0xc1630000}, {0xc1632000}, {0xc1634000}, {0xc1636000}, 
-    {0xc1638000}, {0xc163a000}, {0xc163c000}, {0xc163e000}, 
-    {0xc1640000}, {0xc1642000}, {0xc1644000}, {0xc1646000}, 
-    {0xc1648000}, {0xc164a000}, {0xc164c000}, {0xc164e000}, 
-    {0xc1650000}, {0xc1652000}, {0xc1654000}, {0xc1656000}, 
-    {0xc1658000}, {0xc165a000}, {0xc165c000}, {0xc165e000}, 
-    {0xc1660000}, {0xc1662000}, {0xc1664000}, {0xc1666000}, 
-    {0xc1668000}, {0xc166a000}, {0xc166c000}, {0xc166e000}, 
-    {0xc1670000}, {0xc1672000}, {0xc1674000}, {0xc1676000}, 
-    {0xc1678000}, {0xc167a000}, {0xc167c000}, {0xc167e000}, 
-    {0xc1680000}, {0xc1682000}, {0xc1684000}, {0xc1686000}, 
-    {0xc1688000}, {0xc168a000}, {0xc168c000}, {0xc168e000}, 
-    {0xc1690000}, {0xc1692000}, {0xc1694000}, {0xc1696000}, 
-    {0xc1698000}, {0xc169a000}, {0xc169c000}, {0xc169e000}, 
-    {0xc16a0000}, {0xc16a2000}, {0xc16a4000}, {0xc16a6000}, 
-    {0xc16a8000}, {0xc16aa000}, {0xc16ac000}, {0xc16ae000}, 
-    {0xc16b0000}, {0xc16b2000}, {0xc16b4000}, {0xc16b6000}, 
-    {0xc16b8000}, {0xc16ba000}, {0xc16bc000}, {0xc16be000}, 
-    {0xc16c0000}, {0xc16c2000}, {0xc16c4000}, {0xc16c6000}, 
-    {0xc16c8000}, {0xc16ca000}, {0xc16cc000}, {0xc16ce000}, 
-    {0xc16d0000}, {0xc16d2000}, {0xc16d4000}, {0xc16d6000}, 
-    {0xc16d8000}, {0xc16da000}, {0xc16dc000}, {0xc16de000}, 
-    {0xc16e0000}, {0xc16e2000}, {0xc16e4000}, {0xc16e6000}, 
-    {0xc16e8000}, {0xc16ea000}, {0xc16ec000}, {0xc16ee000}, 
-    {0xc16f0000}, {0xc16f2000}, {0xc16f4000}, {0xc16f6000}, 
-    {0xc16f8000}, {0xc16fa000}, {0xc16fc000}, {0xc16fe000}, 
-    {0xc1700000}, {0xc1702000}, {0xc1704000}, {0xc1706000}, 
-    {0xc1708000}, {0xc170a000}, {0xc170c000}, {0xc170e000}, 
-    {0xc1710000}, {0xc1712000}, {0xc1714000}, {0xc1716000}, 
-    {0xc1718000}, {0xc171a000}, {0xc171c000}, {0xc171e000}, 
-    {0xc1720000}, {0xc1722000}, {0xc1724000}, {0xc1726000}, 
-    {0xc1728000}, {0xc172a000}, {0xc172c000}, {0xc172e000}, 
-    {0xc1730000}, {0xc1732000}, {0xc1734000}, {0xc1736000}, 
-    {0xc1738000}, {0xc173a000}, {0xc173c000}, {0xc173e000}, 
-    {0xc1740000}, {0xc1742000}, {0xc1744000}, {0xc1746000}, 
-    {0xc1748000}, {0xc174a000}, {0xc174c000}, {0xc174e000}, 
-    {0xc1750000}, {0xc1752000}, {0xc1754000}, {0xc1756000}, 
-    {0xc1758000}, {0xc175a000}, {0xc175c000}, {0xc175e000}, 
-    {0xc1760000}, {0xc1762000}, {0xc1764000}, {0xc1766000}, 
-    {0xc1768000}, {0xc176a000}, {0xc176c000}, {0xc176e000}, 
-    {0xc1770000}, {0xc1772000}, {0xc1774000}, {0xc1776000}, 
-    {0xc1778000}, {0xc177a000}, {0xc177c000}, {0xc177e000}, 
-    {0xc1780000}, {0xc1782000}, {0xc1784000}, {0xc1786000}, 
-    {0xc1788000}, {0xc178a000}, {0xc178c000}, {0xc178e000}, 
-    {0xc1790000}, {0xc1792000}, {0xc1794000}, {0xc1796000}, 
-    {0xc1798000}, {0xc179a000}, {0xc179c000}, {0xc179e000}, 
-    {0xc17a0000}, {0xc17a2000}, {0xc17a4000}, {0xc17a6000}, 
-    {0xc17a8000}, {0xc17aa000}, {0xc17ac000}, {0xc17ae000}, 
-    {0xc17b0000}, {0xc17b2000}, {0xc17b4000}, {0xc17b6000}, 
-    {0xc17b8000}, {0xc17ba000}, {0xc17bc000}, {0xc17be000}, 
-    {0xc17c0000}, {0xc17c2000}, {0xc17c4000}, {0xc17c6000}, 
-    {0xc17c8000}, {0xc17ca000}, {0xc17cc000}, {0xc17ce000}, 
-    {0xc17d0000}, {0xc17d2000}, {0xc17d4000}, {0xc17d6000}, 
-    {0xc17d8000}, {0xc17da000}, {0xc17dc000}, {0xc17de000}, 
-    {0xc17e0000}, {0xc17e2000}, {0xc17e4000}, {0xc17e6000}, 
-    {0xc17e8000}, {0xc17ea000}, {0xc17ec000}, {0xc17ee000}, 
-    {0xc17f0000}, {0xc17f2000}, {0xc17f4000}, {0xc17f6000}, 
-    {0xc17f8000}, {0xc17fa000}, {0xc17fc000}, {0xc17fe000}, 
-    {0xc1800000}, {0xc1802000}, {0xc1804000}, {0xc1806000}, 
-    {0xc1808000}, {0xc180a000}, {0xc180c000}, {0xc180e000}, 
-    {0xc1810000}, {0xc1812000}, {0xc1814000}, {0xc1816000}, 
-    {0xc1818000}, {0xc181a000}, {0xc181c000}, {0xc181e000}, 
-    {0xc1820000}, {0xc1822000}, {0xc1824000}, {0xc1826000}, 
-    {0xc1828000}, {0xc182a000}, {0xc182c000}, {0xc182e000}, 
-    {0xc1830000}, {0xc1832000}, {0xc1834000}, {0xc1836000}, 
-    {0xc1838000}, {0xc183a000}, {0xc183c000}, {0xc183e000}, 
-    {0xc1840000}, {0xc1842000}, {0xc1844000}, {0xc1846000}, 
-    {0xc1848000}, {0xc184a000}, {0xc184c000}, {0xc184e000}, 
-    {0xc1850000}, {0xc1852000}, {0xc1854000}, {0xc1856000}, 
-    {0xc1858000}, {0xc185a000}, {0xc185c000}, {0xc185e000}, 
-    {0xc1860000}, {0xc1862000}, {0xc1864000}, {0xc1866000}, 
-    {0xc1868000}, {0xc186a000}, {0xc186c000}, {0xc186e000}, 
-    {0xc1870000}, {0xc1872000}, {0xc1874000}, {0xc1876000}, 
-    {0xc1878000}, {0xc187a000}, {0xc187c000}, {0xc187e000}, 
-    {0xc1880000}, {0xc1882000}, {0xc1884000}, {0xc1886000}, 
-    {0xc1888000}, {0xc188a000}, {0xc188c000}, {0xc188e000}, 
-    {0xc1890000}, {0xc1892000}, {0xc1894000}, {0xc1896000}, 
-    {0xc1898000}, {0xc189a000}, {0xc189c000}, {0xc189e000}, 
-    {0xc18a0000}, {0xc18a2000}, {0xc18a4000}, {0xc18a6000}, 
-    {0xc18a8000}, {0xc18aa000}, {0xc18ac000}, {0xc18ae000}, 
-    {0xc18b0000}, {0xc18b2000}, {0xc18b4000}, {0xc18b6000}, 
-    {0xc18b8000}, {0xc18ba000}, {0xc18bc000}, {0xc18be000}, 
-    {0xc18c0000}, {0xc18c2000}, {0xc18c4000}, {0xc18c6000}, 
-    {0xc18c8000}, {0xc18ca000}, {0xc18cc000}, {0xc18ce000}, 
-    {0xc18d0000}, {0xc18d2000}, {0xc18d4000}, {0xc18d6000}, 
-    {0xc18d8000}, {0xc18da000}, {0xc18dc000}, {0xc18de000}, 
-    {0xc18e0000}, {0xc18e2000}, {0xc18e4000}, {0xc18e6000}, 
-    {0xc18e8000}, {0xc18ea000}, {0xc18ec000}, {0xc18ee000}, 
-    {0xc18f0000}, {0xc18f2000}, {0xc18f4000}, {0xc18f6000}, 
-    {0xc18f8000}, {0xc18fa000}, {0xc18fc000}, {0xc18fe000}, 
-    {0xc1900000}, {0xc1902000}, {0xc1904000}, {0xc1906000}, 
-    {0xc1908000}, {0xc190a000}, {0xc190c000}, {0xc190e000}, 
-    {0xc1910000}, {0xc1912000}, {0xc1914000}, {0xc1916000}, 
-    {0xc1918000}, {0xc191a000}, {0xc191c000}, {0xc191e000}, 
-    {0xc1920000}, {0xc1922000}, {0xc1924000}, {0xc1926000}, 
-    {0xc1928000}, {0xc192a000}, {0xc192c000}, {0xc192e000}, 
-    {0xc1930000}, {0xc1932000}, {0xc1934000}, {0xc1936000}, 
-    {0xc1938000}, {0xc193a000}, {0xc193c000}, {0xc193e000}, 
-    {0xc1940000}, {0xc1942000}, {0xc1944000}, {0xc1946000}, 
-    {0xc1948000}, {0xc194a000}, {0xc194c000}, {0xc194e000}, 
-    {0xc1950000}, {0xc1952000}, {0xc1954000}, {0xc1956000}, 
-    {0xc1958000}, {0xc195a000}, {0xc195c000}, {0xc195e000}, 
-    {0xc1960000}, {0xc1962000}, {0xc1964000}, {0xc1966000}, 
-    {0xc1968000}, {0xc196a000}, {0xc196c000}, {0xc196e000}, 
-    {0xc1970000}, {0xc1972000}, {0xc1974000}, {0xc1976000}, 
-    {0xc1978000}, {0xc197a000}, {0xc197c000}, {0xc197e000}, 
-    {0xc1980000}, {0xc1982000}, {0xc1984000}, {0xc1986000}, 
-    {0xc1988000}, {0xc198a000}, {0xc198c000}, {0xc198e000}, 
-    {0xc1990000}, {0xc1992000}, {0xc1994000}, {0xc1996000}, 
-    {0xc1998000}, {0xc199a000}, {0xc199c000}, {0xc199e000}, 
-    {0xc19a0000}, {0xc19a2000}, {0xc19a4000}, {0xc19a6000}, 
-    {0xc19a8000}, {0xc19aa000}, {0xc19ac000}, {0xc19ae000}, 
-    {0xc19b0000}, {0xc19b2000}, {0xc19b4000}, {0xc19b6000}, 
-    {0xc19b8000}, {0xc19ba000}, {0xc19bc000}, {0xc19be000}, 
-    {0xc19c0000}, {0xc19c2000}, {0xc19c4000}, {0xc19c6000}, 
-    {0xc19c8000}, {0xc19ca000}, {0xc19cc000}, {0xc19ce000}, 
-    {0xc19d0000}, {0xc19d2000}, {0xc19d4000}, {0xc19d6000}, 
-    {0xc19d8000}, {0xc19da000}, {0xc19dc000}, {0xc19de000}, 
-    {0xc19e0000}, {0xc19e2000}, {0xc19e4000}, {0xc19e6000}, 
-    {0xc19e8000}, {0xc19ea000}, {0xc19ec000}, {0xc19ee000}, 
-    {0xc19f0000}, {0xc19f2000}, {0xc19f4000}, {0xc19f6000}, 
-    {0xc19f8000}, {0xc19fa000}, {0xc19fc000}, {0xc19fe000}, 
-    {0xc1a00000}, {0xc1a02000}, {0xc1a04000}, {0xc1a06000}, 
-    {0xc1a08000}, {0xc1a0a000}, {0xc1a0c000}, {0xc1a0e000}, 
-    {0xc1a10000}, {0xc1a12000}, {0xc1a14000}, {0xc1a16000}, 
-    {0xc1a18000}, {0xc1a1a000}, {0xc1a1c000}, {0xc1a1e000}, 
-    {0xc1a20000}, {0xc1a22000}, {0xc1a24000}, {0xc1a26000}, 
-    {0xc1a28000}, {0xc1a2a000}, {0xc1a2c000}, {0xc1a2e000}, 
-    {0xc1a30000}, {0xc1a32000}, {0xc1a34000}, {0xc1a36000}, 
-    {0xc1a38000}, {0xc1a3a000}, {0xc1a3c000}, {0xc1a3e000}, 
-    {0xc1a40000}, {0xc1a42000}, {0xc1a44000}, {0xc1a46000}, 
-    {0xc1a48000}, {0xc1a4a000}, {0xc1a4c000}, {0xc1a4e000}, 
-    {0xc1a50000}, {0xc1a52000}, {0xc1a54000}, {0xc1a56000}, 
-    {0xc1a58000}, {0xc1a5a000}, {0xc1a5c000}, {0xc1a5e000}, 
-    {0xc1a60000}, {0xc1a62000}, {0xc1a64000}, {0xc1a66000}, 
-    {0xc1a68000}, {0xc1a6a000}, {0xc1a6c000}, {0xc1a6e000}, 
-    {0xc1a70000}, {0xc1a72000}, {0xc1a74000}, {0xc1a76000}, 
-    {0xc1a78000}, {0xc1a7a000}, {0xc1a7c000}, {0xc1a7e000}, 
-    {0xc1a80000}, {0xc1a82000}, {0xc1a84000}, {0xc1a86000}, 
-    {0xc1a88000}, {0xc1a8a000}, {0xc1a8c000}, {0xc1a8e000}, 
-    {0xc1a90000}, {0xc1a92000}, {0xc1a94000}, {0xc1a96000}, 
-    {0xc1a98000}, {0xc1a9a000}, {0xc1a9c000}, {0xc1a9e000}, 
-    {0xc1aa0000}, {0xc1aa2000}, {0xc1aa4000}, {0xc1aa6000}, 
-    {0xc1aa8000}, {0xc1aaa000}, {0xc1aac000}, {0xc1aae000}, 
-    {0xc1ab0000}, {0xc1ab2000}, {0xc1ab4000}, {0xc1ab6000}, 
-    {0xc1ab8000}, {0xc1aba000}, {0xc1abc000}, {0xc1abe000}, 
-    {0xc1ac0000}, {0xc1ac2000}, {0xc1ac4000}, {0xc1ac6000}, 
-    {0xc1ac8000}, {0xc1aca000}, {0xc1acc000}, {0xc1ace000}, 
-    {0xc1ad0000}, {0xc1ad2000}, {0xc1ad4000}, {0xc1ad6000}, 
-    {0xc1ad8000}, {0xc1ada000}, {0xc1adc000}, {0xc1ade000}, 
-    {0xc1ae0000}, {0xc1ae2000}, {0xc1ae4000}, {0xc1ae6000}, 
-    {0xc1ae8000}, {0xc1aea000}, {0xc1aec000}, {0xc1aee000}, 
-    {0xc1af0000}, {0xc1af2000}, {0xc1af4000}, {0xc1af6000}, 
-    {0xc1af8000}, {0xc1afa000}, {0xc1afc000}, {0xc1afe000}, 
-    {0xc1b00000}, {0xc1b02000}, {0xc1b04000}, {0xc1b06000}, 
-    {0xc1b08000}, {0xc1b0a000}, {0xc1b0c000}, {0xc1b0e000}, 
-    {0xc1b10000}, {0xc1b12000}, {0xc1b14000}, {0xc1b16000}, 
-    {0xc1b18000}, {0xc1b1a000}, {0xc1b1c000}, {0xc1b1e000}, 
-    {0xc1b20000}, {0xc1b22000}, {0xc1b24000}, {0xc1b26000}, 
-    {0xc1b28000}, {0xc1b2a000}, {0xc1b2c000}, {0xc1b2e000}, 
-    {0xc1b30000}, {0xc1b32000}, {0xc1b34000}, {0xc1b36000}, 
-    {0xc1b38000}, {0xc1b3a000}, {0xc1b3c000}, {0xc1b3e000}, 
-    {0xc1b40000}, {0xc1b42000}, {0xc1b44000}, {0xc1b46000}, 
-    {0xc1b48000}, {0xc1b4a000}, {0xc1b4c000}, {0xc1b4e000}, 
-    {0xc1b50000}, {0xc1b52000}, {0xc1b54000}, {0xc1b56000}, 
-    {0xc1b58000}, {0xc1b5a000}, {0xc1b5c000}, {0xc1b5e000}, 
-    {0xc1b60000}, {0xc1b62000}, {0xc1b64000}, {0xc1b66000}, 
-    {0xc1b68000}, {0xc1b6a000}, {0xc1b6c000}, {0xc1b6e000}, 
-    {0xc1b70000}, {0xc1b72000}, {0xc1b74000}, {0xc1b76000}, 
-    {0xc1b78000}, {0xc1b7a000}, {0xc1b7c000}, {0xc1b7e000}, 
-    {0xc1b80000}, {0xc1b82000}, {0xc1b84000}, {0xc1b86000}, 
-    {0xc1b88000}, {0xc1b8a000}, {0xc1b8c000}, {0xc1b8e000}, 
-    {0xc1b90000}, {0xc1b92000}, {0xc1b94000}, {0xc1b96000}, 
-    {0xc1b98000}, {0xc1b9a000}, {0xc1b9c000}, {0xc1b9e000}, 
-    {0xc1ba0000}, {0xc1ba2000}, {0xc1ba4000}, {0xc1ba6000}, 
-    {0xc1ba8000}, {0xc1baa000}, {0xc1bac000}, {0xc1bae000}, 
-    {0xc1bb0000}, {0xc1bb2000}, {0xc1bb4000}, {0xc1bb6000}, 
-    {0xc1bb8000}, {0xc1bba000}, {0xc1bbc000}, {0xc1bbe000}, 
-    {0xc1bc0000}, {0xc1bc2000}, {0xc1bc4000}, {0xc1bc6000}, 
-    {0xc1bc8000}, {0xc1bca000}, {0xc1bcc000}, {0xc1bce000}, 
-    {0xc1bd0000}, {0xc1bd2000}, {0xc1bd4000}, {0xc1bd6000}, 
-    {0xc1bd8000}, {0xc1bda000}, {0xc1bdc000}, {0xc1bde000}, 
-    {0xc1be0000}, {0xc1be2000}, {0xc1be4000}, {0xc1be6000}, 
-    {0xc1be8000}, {0xc1bea000}, {0xc1bec000}, {0xc1bee000}, 
-    {0xc1bf0000}, {0xc1bf2000}, {0xc1bf4000}, {0xc1bf6000}, 
-    {0xc1bf8000}, {0xc1bfa000}, {0xc1bfc000}, {0xc1bfe000}, 
-    {0xc1c00000}, {0xc1c02000}, {0xc1c04000}, {0xc1c06000}, 
-    {0xc1c08000}, {0xc1c0a000}, {0xc1c0c000}, {0xc1c0e000}, 
-    {0xc1c10000}, {0xc1c12000}, {0xc1c14000}, {0xc1c16000}, 
-    {0xc1c18000}, {0xc1c1a000}, {0xc1c1c000}, {0xc1c1e000}, 
-    {0xc1c20000}, {0xc1c22000}, {0xc1c24000}, {0xc1c26000}, 
-    {0xc1c28000}, {0xc1c2a000}, {0xc1c2c000}, {0xc1c2e000}, 
-    {0xc1c30000}, {0xc1c32000}, {0xc1c34000}, {0xc1c36000}, 
-    {0xc1c38000}, {0xc1c3a000}, {0xc1c3c000}, {0xc1c3e000}, 
-    {0xc1c40000}, {0xc1c42000}, {0xc1c44000}, {0xc1c46000}, 
-    {0xc1c48000}, {0xc1c4a000}, {0xc1c4c000}, {0xc1c4e000}, 
-    {0xc1c50000}, {0xc1c52000}, {0xc1c54000}, {0xc1c56000}, 
-    {0xc1c58000}, {0xc1c5a000}, {0xc1c5c000}, {0xc1c5e000}, 
-    {0xc1c60000}, {0xc1c62000}, {0xc1c64000}, {0xc1c66000}, 
-    {0xc1c68000}, {0xc1c6a000}, {0xc1c6c000}, {0xc1c6e000}, 
-    {0xc1c70000}, {0xc1c72000}, {0xc1c74000}, {0xc1c76000}, 
-    {0xc1c78000}, {0xc1c7a000}, {0xc1c7c000}, {0xc1c7e000}, 
-    {0xc1c80000}, {0xc1c82000}, {0xc1c84000}, {0xc1c86000}, 
-    {0xc1c88000}, {0xc1c8a000}, {0xc1c8c000}, {0xc1c8e000}, 
-    {0xc1c90000}, {0xc1c92000}, {0xc1c94000}, {0xc1c96000}, 
-    {0xc1c98000}, {0xc1c9a000}, {0xc1c9c000}, {0xc1c9e000}, 
-    {0xc1ca0000}, {0xc1ca2000}, {0xc1ca4000}, {0xc1ca6000}, 
-    {0xc1ca8000}, {0xc1caa000}, {0xc1cac000}, {0xc1cae000}, 
-    {0xc1cb0000}, {0xc1cb2000}, {0xc1cb4000}, {0xc1cb6000}, 
-    {0xc1cb8000}, {0xc1cba000}, {0xc1cbc000}, {0xc1cbe000}, 
-    {0xc1cc0000}, {0xc1cc2000}, {0xc1cc4000}, {0xc1cc6000}, 
-    {0xc1cc8000}, {0xc1cca000}, {0xc1ccc000}, {0xc1cce000}, 
-    {0xc1cd0000}, {0xc1cd2000}, {0xc1cd4000}, {0xc1cd6000}, 
-    {0xc1cd8000}, {0xc1cda000}, {0xc1cdc000}, {0xc1cde000}, 
-    {0xc1ce0000}, {0xc1ce2000}, {0xc1ce4000}, {0xc1ce6000}, 
-    {0xc1ce8000}, {0xc1cea000}, {0xc1cec000}, {0xc1cee000}, 
-    {0xc1cf0000}, {0xc1cf2000}, {0xc1cf4000}, {0xc1cf6000}, 
-    {0xc1cf8000}, {0xc1cfa000}, {0xc1cfc000}, {0xc1cfe000}, 
-    {0xc1d00000}, {0xc1d02000}, {0xc1d04000}, {0xc1d06000}, 
-    {0xc1d08000}, {0xc1d0a000}, {0xc1d0c000}, {0xc1d0e000}, 
-    {0xc1d10000}, {0xc1d12000}, {0xc1d14000}, {0xc1d16000}, 
-    {0xc1d18000}, {0xc1d1a000}, {0xc1d1c000}, {0xc1d1e000}, 
-    {0xc1d20000}, {0xc1d22000}, {0xc1d24000}, {0xc1d26000}, 
-    {0xc1d28000}, {0xc1d2a000}, {0xc1d2c000}, {0xc1d2e000}, 
-    {0xc1d30000}, {0xc1d32000}, {0xc1d34000}, {0xc1d36000}, 
-    {0xc1d38000}, {0xc1d3a000}, {0xc1d3c000}, {0xc1d3e000}, 
-    {0xc1d40000}, {0xc1d42000}, {0xc1d44000}, {0xc1d46000}, 
-    {0xc1d48000}, {0xc1d4a000}, {0xc1d4c000}, {0xc1d4e000}, 
-    {0xc1d50000}, {0xc1d52000}, {0xc1d54000}, {0xc1d56000}, 
-    {0xc1d58000}, {0xc1d5a000}, {0xc1d5c000}, {0xc1d5e000}, 
-    {0xc1d60000}, {0xc1d62000}, {0xc1d64000}, {0xc1d66000}, 
-    {0xc1d68000}, {0xc1d6a000}, {0xc1d6c000}, {0xc1d6e000}, 
-    {0xc1d70000}, {0xc1d72000}, {0xc1d74000}, {0xc1d76000}, 
-    {0xc1d78000}, {0xc1d7a000}, {0xc1d7c000}, {0xc1d7e000}, 
-    {0xc1d80000}, {0xc1d82000}, {0xc1d84000}, {0xc1d86000}, 
-    {0xc1d88000}, {0xc1d8a000}, {0xc1d8c000}, {0xc1d8e000}, 
-    {0xc1d90000}, {0xc1d92000}, {0xc1d94000}, {0xc1d96000}, 
-    {0xc1d98000}, {0xc1d9a000}, {0xc1d9c000}, {0xc1d9e000}, 
-    {0xc1da0000}, {0xc1da2000}, {0xc1da4000}, {0xc1da6000}, 
-    {0xc1da8000}, {0xc1daa000}, {0xc1dac000}, {0xc1dae000}, 
-    {0xc1db0000}, {0xc1db2000}, {0xc1db4000}, {0xc1db6000}, 
-    {0xc1db8000}, {0xc1dba000}, {0xc1dbc000}, {0xc1dbe000}, 
-    {0xc1dc0000}, {0xc1dc2000}, {0xc1dc4000}, {0xc1dc6000}, 
-    {0xc1dc8000}, {0xc1dca000}, {0xc1dcc000}, {0xc1dce000}, 
-    {0xc1dd0000}, {0xc1dd2000}, {0xc1dd4000}, {0xc1dd6000}, 
-    {0xc1dd8000}, {0xc1dda000}, {0xc1ddc000}, {0xc1dde000}, 
-    {0xc1de0000}, {0xc1de2000}, {0xc1de4000}, {0xc1de6000}, 
-    {0xc1de8000}, {0xc1dea000}, {0xc1dec000}, {0xc1dee000}, 
-    {0xc1df0000}, {0xc1df2000}, {0xc1df4000}, {0xc1df6000}, 
-    {0xc1df8000}, {0xc1dfa000}, {0xc1dfc000}, {0xc1dfe000}, 
-    {0xc1e00000}, {0xc1e02000}, {0xc1e04000}, {0xc1e06000}, 
-    {0xc1e08000}, {0xc1e0a000}, {0xc1e0c000}, {0xc1e0e000}, 
-    {0xc1e10000}, {0xc1e12000}, {0xc1e14000}, {0xc1e16000}, 
-    {0xc1e18000}, {0xc1e1a000}, {0xc1e1c000}, {0xc1e1e000}, 
-    {0xc1e20000}, {0xc1e22000}, {0xc1e24000}, {0xc1e26000}, 
-    {0xc1e28000}, {0xc1e2a000}, {0xc1e2c000}, {0xc1e2e000}, 
-    {0xc1e30000}, {0xc1e32000}, {0xc1e34000}, {0xc1e36000}, 
-    {0xc1e38000}, {0xc1e3a000}, {0xc1e3c000}, {0xc1e3e000}, 
-    {0xc1e40000}, {0xc1e42000}, {0xc1e44000}, {0xc1e46000}, 
-    {0xc1e48000}, {0xc1e4a000}, {0xc1e4c000}, {0xc1e4e000}, 
-    {0xc1e50000}, {0xc1e52000}, {0xc1e54000}, {0xc1e56000}, 
-    {0xc1e58000}, {0xc1e5a000}, {0xc1e5c000}, {0xc1e5e000}, 
-    {0xc1e60000}, {0xc1e62000}, {0xc1e64000}, {0xc1e66000}, 
-    {0xc1e68000}, {0xc1e6a000}, {0xc1e6c000}, {0xc1e6e000}, 
-    {0xc1e70000}, {0xc1e72000}, {0xc1e74000}, {0xc1e76000}, 
-    {0xc1e78000}, {0xc1e7a000}, {0xc1e7c000}, {0xc1e7e000}, 
-    {0xc1e80000}, {0xc1e82000}, {0xc1e84000}, {0xc1e86000}, 
-    {0xc1e88000}, {0xc1e8a000}, {0xc1e8c000}, {0xc1e8e000}, 
-    {0xc1e90000}, {0xc1e92000}, {0xc1e94000}, {0xc1e96000}, 
-    {0xc1e98000}, {0xc1e9a000}, {0xc1e9c000}, {0xc1e9e000}, 
-    {0xc1ea0000}, {0xc1ea2000}, {0xc1ea4000}, {0xc1ea6000}, 
-    {0xc1ea8000}, {0xc1eaa000}, {0xc1eac000}, {0xc1eae000}, 
-    {0xc1eb0000}, {0xc1eb2000}, {0xc1eb4000}, {0xc1eb6000}, 
-    {0xc1eb8000}, {0xc1eba000}, {0xc1ebc000}, {0xc1ebe000}, 
-    {0xc1ec0000}, {0xc1ec2000}, {0xc1ec4000}, {0xc1ec6000}, 
-    {0xc1ec8000}, {0xc1eca000}, {0xc1ecc000}, {0xc1ece000}, 
-    {0xc1ed0000}, {0xc1ed2000}, {0xc1ed4000}, {0xc1ed6000}, 
-    {0xc1ed8000}, {0xc1eda000}, {0xc1edc000}, {0xc1ede000}, 
-    {0xc1ee0000}, {0xc1ee2000}, {0xc1ee4000}, {0xc1ee6000}, 
-    {0xc1ee8000}, {0xc1eea000}, {0xc1eec000}, {0xc1eee000}, 
-    {0xc1ef0000}, {0xc1ef2000}, {0xc1ef4000}, {0xc1ef6000}, 
-    {0xc1ef8000}, {0xc1efa000}, {0xc1efc000}, {0xc1efe000}, 
-    {0xc1f00000}, {0xc1f02000}, {0xc1f04000}, {0xc1f06000}, 
-    {0xc1f08000}, {0xc1f0a000}, {0xc1f0c000}, {0xc1f0e000}, 
-    {0xc1f10000}, {0xc1f12000}, {0xc1f14000}, {0xc1f16000}, 
-    {0xc1f18000}, {0xc1f1a000}, {0xc1f1c000}, {0xc1f1e000}, 
-    {0xc1f20000}, {0xc1f22000}, {0xc1f24000}, {0xc1f26000}, 
-    {0xc1f28000}, {0xc1f2a000}, {0xc1f2c000}, {0xc1f2e000}, 
-    {0xc1f30000}, {0xc1f32000}, {0xc1f34000}, {0xc1f36000}, 
-    {0xc1f38000}, {0xc1f3a000}, {0xc1f3c000}, {0xc1f3e000}, 
-    {0xc1f40000}, {0xc1f42000}, {0xc1f44000}, {0xc1f46000}, 
-    {0xc1f48000}, {0xc1f4a000}, {0xc1f4c000}, {0xc1f4e000}, 
-    {0xc1f50000}, {0xc1f52000}, {0xc1f54000}, {0xc1f56000}, 
-    {0xc1f58000}, {0xc1f5a000}, {0xc1f5c000}, {0xc1f5e000}, 
-    {0xc1f60000}, {0xc1f62000}, {0xc1f64000}, {0xc1f66000}, 
-    {0xc1f68000}, {0xc1f6a000}, {0xc1f6c000}, {0xc1f6e000}, 
-    {0xc1f70000}, {0xc1f72000}, {0xc1f74000}, {0xc1f76000}, 
-    {0xc1f78000}, {0xc1f7a000}, {0xc1f7c000}, {0xc1f7e000}, 
-    {0xc1f80000}, {0xc1f82000}, {0xc1f84000}, {0xc1f86000}, 
-    {0xc1f88000}, {0xc1f8a000}, {0xc1f8c000}, {0xc1f8e000}, 
-    {0xc1f90000}, {0xc1f92000}, {0xc1f94000}, {0xc1f96000}, 
-    {0xc1f98000}, {0xc1f9a000}, {0xc1f9c000}, {0xc1f9e000}, 
-    {0xc1fa0000}, {0xc1fa2000}, {0xc1fa4000}, {0xc1fa6000}, 
-    {0xc1fa8000}, {0xc1faa000}, {0xc1fac000}, {0xc1fae000}, 
-    {0xc1fb0000}, {0xc1fb2000}, {0xc1fb4000}, {0xc1fb6000}, 
-    {0xc1fb8000}, {0xc1fba000}, {0xc1fbc000}, {0xc1fbe000}, 
-    {0xc1fc0000}, {0xc1fc2000}, {0xc1fc4000}, {0xc1fc6000}, 
-    {0xc1fc8000}, {0xc1fca000}, {0xc1fcc000}, {0xc1fce000}, 
-    {0xc1fd0000}, {0xc1fd2000}, {0xc1fd4000}, {0xc1fd6000}, 
-    {0xc1fd8000}, {0xc1fda000}, {0xc1fdc000}, {0xc1fde000}, 
-    {0xc1fe0000}, {0xc1fe2000}, {0xc1fe4000}, {0xc1fe6000}, 
-    {0xc1fe8000}, {0xc1fea000}, {0xc1fec000}, {0xc1fee000}, 
-    {0xc1ff0000}, {0xc1ff2000}, {0xc1ff4000}, {0xc1ff6000}, 
-    {0xc1ff8000}, {0xc1ffa000}, {0xc1ffc000}, {0xc1ffe000}, 
-    {0xc2000000}, {0xc2002000}, {0xc2004000}, {0xc2006000}, 
-    {0xc2008000}, {0xc200a000}, {0xc200c000}, {0xc200e000}, 
-    {0xc2010000}, {0xc2012000}, {0xc2014000}, {0xc2016000}, 
-    {0xc2018000}, {0xc201a000}, {0xc201c000}, {0xc201e000}, 
-    {0xc2020000}, {0xc2022000}, {0xc2024000}, {0xc2026000}, 
-    {0xc2028000}, {0xc202a000}, {0xc202c000}, {0xc202e000}, 
-    {0xc2030000}, {0xc2032000}, {0xc2034000}, {0xc2036000}, 
-    {0xc2038000}, {0xc203a000}, {0xc203c000}, {0xc203e000}, 
-    {0xc2040000}, {0xc2042000}, {0xc2044000}, {0xc2046000}, 
-    {0xc2048000}, {0xc204a000}, {0xc204c000}, {0xc204e000}, 
-    {0xc2050000}, {0xc2052000}, {0xc2054000}, {0xc2056000}, 
-    {0xc2058000}, {0xc205a000}, {0xc205c000}, {0xc205e000}, 
-    {0xc2060000}, {0xc2062000}, {0xc2064000}, {0xc2066000}, 
-    {0xc2068000}, {0xc206a000}, {0xc206c000}, {0xc206e000}, 
-    {0xc2070000}, {0xc2072000}, {0xc2074000}, {0xc2076000}, 
-    {0xc2078000}, {0xc207a000}, {0xc207c000}, {0xc207e000}, 
-    {0xc2080000}, {0xc2082000}, {0xc2084000}, {0xc2086000}, 
-    {0xc2088000}, {0xc208a000}, {0xc208c000}, {0xc208e000}, 
-    {0xc2090000}, {0xc2092000}, {0xc2094000}, {0xc2096000}, 
-    {0xc2098000}, {0xc209a000}, {0xc209c000}, {0xc209e000}, 
-    {0xc20a0000}, {0xc20a2000}, {0xc20a4000}, {0xc20a6000}, 
-    {0xc20a8000}, {0xc20aa000}, {0xc20ac000}, {0xc20ae000}, 
-    {0xc20b0000}, {0xc20b2000}, {0xc20b4000}, {0xc20b6000}, 
-    {0xc20b8000}, {0xc20ba000}, {0xc20bc000}, {0xc20be000}, 
-    {0xc20c0000}, {0xc20c2000}, {0xc20c4000}, {0xc20c6000}, 
-    {0xc20c8000}, {0xc20ca000}, {0xc20cc000}, {0xc20ce000}, 
-    {0xc20d0000}, {0xc20d2000}, {0xc20d4000}, {0xc20d6000}, 
-    {0xc20d8000}, {0xc20da000}, {0xc20dc000}, {0xc20de000}, 
-    {0xc20e0000}, {0xc20e2000}, {0xc20e4000}, {0xc20e6000}, 
-    {0xc20e8000}, {0xc20ea000}, {0xc20ec000}, {0xc20ee000}, 
-    {0xc20f0000}, {0xc20f2000}, {0xc20f4000}, {0xc20f6000}, 
-    {0xc20f8000}, {0xc20fa000}, {0xc20fc000}, {0xc20fe000}, 
-    {0xc2100000}, {0xc2102000}, {0xc2104000}, {0xc2106000}, 
-    {0xc2108000}, {0xc210a000}, {0xc210c000}, {0xc210e000}, 
-    {0xc2110000}, {0xc2112000}, {0xc2114000}, {0xc2116000}, 
-    {0xc2118000}, {0xc211a000}, {0xc211c000}, {0xc211e000}, 
-    {0xc2120000}, {0xc2122000}, {0xc2124000}, {0xc2126000}, 
-    {0xc2128000}, {0xc212a000}, {0xc212c000}, {0xc212e000}, 
-    {0xc2130000}, {0xc2132000}, {0xc2134000}, {0xc2136000}, 
-    {0xc2138000}, {0xc213a000}, {0xc213c000}, {0xc213e000}, 
-    {0xc2140000}, {0xc2142000}, {0xc2144000}, {0xc2146000}, 
-    {0xc2148000}, {0xc214a000}, {0xc214c000}, {0xc214e000}, 
-    {0xc2150000}, {0xc2152000}, {0xc2154000}, {0xc2156000}, 
-    {0xc2158000}, {0xc215a000}, {0xc215c000}, {0xc215e000}, 
-    {0xc2160000}, {0xc2162000}, {0xc2164000}, {0xc2166000}, 
-    {0xc2168000}, {0xc216a000}, {0xc216c000}, {0xc216e000}, 
-    {0xc2170000}, {0xc2172000}, {0xc2174000}, {0xc2176000}, 
-    {0xc2178000}, {0xc217a000}, {0xc217c000}, {0xc217e000}, 
-    {0xc2180000}, {0xc2182000}, {0xc2184000}, {0xc2186000}, 
-    {0xc2188000}, {0xc218a000}, {0xc218c000}, {0xc218e000}, 
-    {0xc2190000}, {0xc2192000}, {0xc2194000}, {0xc2196000}, 
-    {0xc2198000}, {0xc219a000}, {0xc219c000}, {0xc219e000}, 
-    {0xc21a0000}, {0xc21a2000}, {0xc21a4000}, {0xc21a6000}, 
-    {0xc21a8000}, {0xc21aa000}, {0xc21ac000}, {0xc21ae000}, 
-    {0xc21b0000}, {0xc21b2000}, {0xc21b4000}, {0xc21b6000}, 
-    {0xc21b8000}, {0xc21ba000}, {0xc21bc000}, {0xc21be000}, 
-    {0xc21c0000}, {0xc21c2000}, {0xc21c4000}, {0xc21c6000}, 
-    {0xc21c8000}, {0xc21ca000}, {0xc21cc000}, {0xc21ce000}, 
-    {0xc21d0000}, {0xc21d2000}, {0xc21d4000}, {0xc21d6000}, 
-    {0xc21d8000}, {0xc21da000}, {0xc21dc000}, {0xc21de000}, 
-    {0xc21e0000}, {0xc21e2000}, {0xc21e4000}, {0xc21e6000}, 
-    {0xc21e8000}, {0xc21ea000}, {0xc21ec000}, {0xc21ee000}, 
-    {0xc21f0000}, {0xc21f2000}, {0xc21f4000}, {0xc21f6000}, 
-    {0xc21f8000}, {0xc21fa000}, {0xc21fc000}, {0xc21fe000}, 
-    {0xc2200000}, {0xc2202000}, {0xc2204000}, {0xc2206000}, 
-    {0xc2208000}, {0xc220a000}, {0xc220c000}, {0xc220e000}, 
-    {0xc2210000}, {0xc2212000}, {0xc2214000}, {0xc2216000}, 
-    {0xc2218000}, {0xc221a000}, {0xc221c000}, {0xc221e000}, 
-    {0xc2220000}, {0xc2222000}, {0xc2224000}, {0xc2226000}, 
-    {0xc2228000}, {0xc222a000}, {0xc222c000}, {0xc222e000}, 
-    {0xc2230000}, {0xc2232000}, {0xc2234000}, {0xc2236000}, 
-    {0xc2238000}, {0xc223a000}, {0xc223c000}, {0xc223e000}, 
-    {0xc2240000}, {0xc2242000}, {0xc2244000}, {0xc2246000}, 
-    {0xc2248000}, {0xc224a000}, {0xc224c000}, {0xc224e000}, 
-    {0xc2250000}, {0xc2252000}, {0xc2254000}, {0xc2256000}, 
-    {0xc2258000}, {0xc225a000}, {0xc225c000}, {0xc225e000}, 
-    {0xc2260000}, {0xc2262000}, {0xc2264000}, {0xc2266000}, 
-    {0xc2268000}, {0xc226a000}, {0xc226c000}, {0xc226e000}, 
-    {0xc2270000}, {0xc2272000}, {0xc2274000}, {0xc2276000}, 
-    {0xc2278000}, {0xc227a000}, {0xc227c000}, {0xc227e000}, 
-    {0xc2280000}, {0xc2282000}, {0xc2284000}, {0xc2286000}, 
-    {0xc2288000}, {0xc228a000}, {0xc228c000}, {0xc228e000}, 
-    {0xc2290000}, {0xc2292000}, {0xc2294000}, {0xc2296000}, 
-    {0xc2298000}, {0xc229a000}, {0xc229c000}, {0xc229e000}, 
-    {0xc22a0000}, {0xc22a2000}, {0xc22a4000}, {0xc22a6000}, 
-    {0xc22a8000}, {0xc22aa000}, {0xc22ac000}, {0xc22ae000}, 
-    {0xc22b0000}, {0xc22b2000}, {0xc22b4000}, {0xc22b6000}, 
-    {0xc22b8000}, {0xc22ba000}, {0xc22bc000}, {0xc22be000}, 
-    {0xc22c0000}, {0xc22c2000}, {0xc22c4000}, {0xc22c6000}, 
-    {0xc22c8000}, {0xc22ca000}, {0xc22cc000}, {0xc22ce000}, 
-    {0xc22d0000}, {0xc22d2000}, {0xc22d4000}, {0xc22d6000}, 
-    {0xc22d8000}, {0xc22da000}, {0xc22dc000}, {0xc22de000}, 
-    {0xc22e0000}, {0xc22e2000}, {0xc22e4000}, {0xc22e6000}, 
-    {0xc22e8000}, {0xc22ea000}, {0xc22ec000}, {0xc22ee000}, 
-    {0xc22f0000}, {0xc22f2000}, {0xc22f4000}, {0xc22f6000}, 
-    {0xc22f8000}, {0xc22fa000}, {0xc22fc000}, {0xc22fe000}, 
-    {0xc2300000}, {0xc2302000}, {0xc2304000}, {0xc2306000}, 
-    {0xc2308000}, {0xc230a000}, {0xc230c000}, {0xc230e000}, 
-    {0xc2310000}, {0xc2312000}, {0xc2314000}, {0xc2316000}, 
-    {0xc2318000}, {0xc231a000}, {0xc231c000}, {0xc231e000}, 
-    {0xc2320000}, {0xc2322000}, {0xc2324000}, {0xc2326000}, 
-    {0xc2328000}, {0xc232a000}, {0xc232c000}, {0xc232e000}, 
-    {0xc2330000}, {0xc2332000}, {0xc2334000}, {0xc2336000}, 
-    {0xc2338000}, {0xc233a000}, {0xc233c000}, {0xc233e000}, 
-    {0xc2340000}, {0xc2342000}, {0xc2344000}, {0xc2346000}, 
-    {0xc2348000}, {0xc234a000}, {0xc234c000}, {0xc234e000}, 
-    {0xc2350000}, {0xc2352000}, {0xc2354000}, {0xc2356000}, 
-    {0xc2358000}, {0xc235a000}, {0xc235c000}, {0xc235e000}, 
-    {0xc2360000}, {0xc2362000}, {0xc2364000}, {0xc2366000}, 
-    {0xc2368000}, {0xc236a000}, {0xc236c000}, {0xc236e000}, 
-    {0xc2370000}, {0xc2372000}, {0xc2374000}, {0xc2376000}, 
-    {0xc2378000}, {0xc237a000}, {0xc237c000}, {0xc237e000}, 
-    {0xc2380000}, {0xc2382000}, {0xc2384000}, {0xc2386000}, 
-    {0xc2388000}, {0xc238a000}, {0xc238c000}, {0xc238e000}, 
-    {0xc2390000}, {0xc2392000}, {0xc2394000}, {0xc2396000}, 
-    {0xc2398000}, {0xc239a000}, {0xc239c000}, {0xc239e000}, 
-    {0xc23a0000}, {0xc23a2000}, {0xc23a4000}, {0xc23a6000}, 
-    {0xc23a8000}, {0xc23aa000}, {0xc23ac000}, {0xc23ae000}, 
-    {0xc23b0000}, {0xc23b2000}, {0xc23b4000}, {0xc23b6000}, 
-    {0xc23b8000}, {0xc23ba000}, {0xc23bc000}, {0xc23be000}, 
-    {0xc23c0000}, {0xc23c2000}, {0xc23c4000}, {0xc23c6000}, 
-    {0xc23c8000}, {0xc23ca000}, {0xc23cc000}, {0xc23ce000}, 
-    {0xc23d0000}, {0xc23d2000}, {0xc23d4000}, {0xc23d6000}, 
-    {0xc23d8000}, {0xc23da000}, {0xc23dc000}, {0xc23de000}, 
-    {0xc23e0000}, {0xc23e2000}, {0xc23e4000}, {0xc23e6000}, 
-    {0xc23e8000}, {0xc23ea000}, {0xc23ec000}, {0xc23ee000}, 
-    {0xc23f0000}, {0xc23f2000}, {0xc23f4000}, {0xc23f6000}, 
-    {0xc23f8000}, {0xc23fa000}, {0xc23fc000}, {0xc23fe000}, 
-    {0xc2400000}, {0xc2402000}, {0xc2404000}, {0xc2406000}, 
-    {0xc2408000}, {0xc240a000}, {0xc240c000}, {0xc240e000}, 
-    {0xc2410000}, {0xc2412000}, {0xc2414000}, {0xc2416000}, 
-    {0xc2418000}, {0xc241a000}, {0xc241c000}, {0xc241e000}, 
-    {0xc2420000}, {0xc2422000}, {0xc2424000}, {0xc2426000}, 
-    {0xc2428000}, {0xc242a000}, {0xc242c000}, {0xc242e000}, 
-    {0xc2430000}, {0xc2432000}, {0xc2434000}, {0xc2436000}, 
-    {0xc2438000}, {0xc243a000}, {0xc243c000}, {0xc243e000}, 
-    {0xc2440000}, {0xc2442000}, {0xc2444000}, {0xc2446000}, 
-    {0xc2448000}, {0xc244a000}, {0xc244c000}, {0xc244e000}, 
-    {0xc2450000}, {0xc2452000}, {0xc2454000}, {0xc2456000}, 
-    {0xc2458000}, {0xc245a000}, {0xc245c000}, {0xc245e000}, 
-    {0xc2460000}, {0xc2462000}, {0xc2464000}, {0xc2466000}, 
-    {0xc2468000}, {0xc246a000}, {0xc246c000}, {0xc246e000}, 
-    {0xc2470000}, {0xc2472000}, {0xc2474000}, {0xc2476000}, 
-    {0xc2478000}, {0xc247a000}, {0xc247c000}, {0xc247e000}, 
-    {0xc2480000}, {0xc2482000}, {0xc2484000}, {0xc2486000}, 
-    {0xc2488000}, {0xc248a000}, {0xc248c000}, {0xc248e000}, 
-    {0xc2490000}, {0xc2492000}, {0xc2494000}, {0xc2496000}, 
-    {0xc2498000}, {0xc249a000}, {0xc249c000}, {0xc249e000}, 
-    {0xc24a0000}, {0xc24a2000}, {0xc24a4000}, {0xc24a6000}, 
-    {0xc24a8000}, {0xc24aa000}, {0xc24ac000}, {0xc24ae000}, 
-    {0xc24b0000}, {0xc24b2000}, {0xc24b4000}, {0xc24b6000}, 
-    {0xc24b8000}, {0xc24ba000}, {0xc24bc000}, {0xc24be000}, 
-    {0xc24c0000}, {0xc24c2000}, {0xc24c4000}, {0xc24c6000}, 
-    {0xc24c8000}, {0xc24ca000}, {0xc24cc000}, {0xc24ce000}, 
-    {0xc24d0000}, {0xc24d2000}, {0xc24d4000}, {0xc24d6000}, 
-    {0xc24d8000}, {0xc24da000}, {0xc24dc000}, {0xc24de000}, 
-    {0xc24e0000}, {0xc24e2000}, {0xc24e4000}, {0xc24e6000}, 
-    {0xc24e8000}, {0xc24ea000}, {0xc24ec000}, {0xc24ee000}, 
-    {0xc24f0000}, {0xc24f2000}, {0xc24f4000}, {0xc24f6000}, 
-    {0xc24f8000}, {0xc24fa000}, {0xc24fc000}, {0xc24fe000}, 
-    {0xc2500000}, {0xc2502000}, {0xc2504000}, {0xc2506000}, 
-    {0xc2508000}, {0xc250a000}, {0xc250c000}, {0xc250e000}, 
-    {0xc2510000}, {0xc2512000}, {0xc2514000}, {0xc2516000}, 
-    {0xc2518000}, {0xc251a000}, {0xc251c000}, {0xc251e000}, 
-    {0xc2520000}, {0xc2522000}, {0xc2524000}, {0xc2526000}, 
-    {0xc2528000}, {0xc252a000}, {0xc252c000}, {0xc252e000}, 
-    {0xc2530000}, {0xc2532000}, {0xc2534000}, {0xc2536000}, 
-    {0xc2538000}, {0xc253a000}, {0xc253c000}, {0xc253e000}, 
-    {0xc2540000}, {0xc2542000}, {0xc2544000}, {0xc2546000}, 
-    {0xc2548000}, {0xc254a000}, {0xc254c000}, {0xc254e000}, 
-    {0xc2550000}, {0xc2552000}, {0xc2554000}, {0xc2556000}, 
-    {0xc2558000}, {0xc255a000}, {0xc255c000}, {0xc255e000}, 
-    {0xc2560000}, {0xc2562000}, {0xc2564000}, {0xc2566000}, 
-    {0xc2568000}, {0xc256a000}, {0xc256c000}, {0xc256e000}, 
-    {0xc2570000}, {0xc2572000}, {0xc2574000}, {0xc2576000}, 
-    {0xc2578000}, {0xc257a000}, {0xc257c000}, {0xc257e000}, 
-    {0xc2580000}, {0xc2582000}, {0xc2584000}, {0xc2586000}, 
-    {0xc2588000}, {0xc258a000}, {0xc258c000}, {0xc258e000}, 
-    {0xc2590000}, {0xc2592000}, {0xc2594000}, {0xc2596000}, 
-    {0xc2598000}, {0xc259a000}, {0xc259c000}, {0xc259e000}, 
-    {0xc25a0000}, {0xc25a2000}, {0xc25a4000}, {0xc25a6000}, 
-    {0xc25a8000}, {0xc25aa000}, {0xc25ac000}, {0xc25ae000}, 
-    {0xc25b0000}, {0xc25b2000}, {0xc25b4000}, {0xc25b6000}, 
-    {0xc25b8000}, {0xc25ba000}, {0xc25bc000}, {0xc25be000}, 
-    {0xc25c0000}, {0xc25c2000}, {0xc25c4000}, {0xc25c6000}, 
-    {0xc25c8000}, {0xc25ca000}, {0xc25cc000}, {0xc25ce000}, 
-    {0xc25d0000}, {0xc25d2000}, {0xc25d4000}, {0xc25d6000}, 
-    {0xc25d8000}, {0xc25da000}, {0xc25dc000}, {0xc25de000}, 
-    {0xc25e0000}, {0xc25e2000}, {0xc25e4000}, {0xc25e6000}, 
-    {0xc25e8000}, {0xc25ea000}, {0xc25ec000}, {0xc25ee000}, 
-    {0xc25f0000}, {0xc25f2000}, {0xc25f4000}, {0xc25f6000}, 
-    {0xc25f8000}, {0xc25fa000}, {0xc25fc000}, {0xc25fe000}, 
-    {0xc2600000}, {0xc2602000}, {0xc2604000}, {0xc2606000}, 
-    {0xc2608000}, {0xc260a000}, {0xc260c000}, {0xc260e000}, 
-    {0xc2610000}, {0xc2612000}, {0xc2614000}, {0xc2616000}, 
-    {0xc2618000}, {0xc261a000}, {0xc261c000}, {0xc261e000}, 
-    {0xc2620000}, {0xc2622000}, {0xc2624000}, {0xc2626000}, 
-    {0xc2628000}, {0xc262a000}, {0xc262c000}, {0xc262e000}, 
-    {0xc2630000}, {0xc2632000}, {0xc2634000}, {0xc2636000}, 
-    {0xc2638000}, {0xc263a000}, {0xc263c000}, {0xc263e000}, 
-    {0xc2640000}, {0xc2642000}, {0xc2644000}, {0xc2646000}, 
-    {0xc2648000}, {0xc264a000}, {0xc264c000}, {0xc264e000}, 
-    {0xc2650000}, {0xc2652000}, {0xc2654000}, {0xc2656000}, 
-    {0xc2658000}, {0xc265a000}, {0xc265c000}, {0xc265e000}, 
-    {0xc2660000}, {0xc2662000}, {0xc2664000}, {0xc2666000}, 
-    {0xc2668000}, {0xc266a000}, {0xc266c000}, {0xc266e000}, 
-    {0xc2670000}, {0xc2672000}, {0xc2674000}, {0xc2676000}, 
-    {0xc2678000}, {0xc267a000}, {0xc267c000}, {0xc267e000}, 
-    {0xc2680000}, {0xc2682000}, {0xc2684000}, {0xc2686000}, 
-    {0xc2688000}, {0xc268a000}, {0xc268c000}, {0xc268e000}, 
-    {0xc2690000}, {0xc2692000}, {0xc2694000}, {0xc2696000}, 
-    {0xc2698000}, {0xc269a000}, {0xc269c000}, {0xc269e000}, 
-    {0xc26a0000}, {0xc26a2000}, {0xc26a4000}, {0xc26a6000}, 
-    {0xc26a8000}, {0xc26aa000}, {0xc26ac000}, {0xc26ae000}, 
-    {0xc26b0000}, {0xc26b2000}, {0xc26b4000}, {0xc26b6000}, 
-    {0xc26b8000}, {0xc26ba000}, {0xc26bc000}, {0xc26be000}, 
-    {0xc26c0000}, {0xc26c2000}, {0xc26c4000}, {0xc26c6000}, 
-    {0xc26c8000}, {0xc26ca000}, {0xc26cc000}, {0xc26ce000}, 
-    {0xc26d0000}, {0xc26d2000}, {0xc26d4000}, {0xc26d6000}, 
-    {0xc26d8000}, {0xc26da000}, {0xc26dc000}, {0xc26de000}, 
-    {0xc26e0000}, {0xc26e2000}, {0xc26e4000}, {0xc26e6000}, 
-    {0xc26e8000}, {0xc26ea000}, {0xc26ec000}, {0xc26ee000}, 
-    {0xc26f0000}, {0xc26f2000}, {0xc26f4000}, {0xc26f6000}, 
-    {0xc26f8000}, {0xc26fa000}, {0xc26fc000}, {0xc26fe000}, 
-    {0xc2700000}, {0xc2702000}, {0xc2704000}, {0xc2706000}, 
-    {0xc2708000}, {0xc270a000}, {0xc270c000}, {0xc270e000}, 
-    {0xc2710000}, {0xc2712000}, {0xc2714000}, {0xc2716000}, 
-    {0xc2718000}, {0xc271a000}, {0xc271c000}, {0xc271e000}, 
-    {0xc2720000}, {0xc2722000}, {0xc2724000}, {0xc2726000}, 
-    {0xc2728000}, {0xc272a000}, {0xc272c000}, {0xc272e000}, 
-    {0xc2730000}, {0xc2732000}, {0xc2734000}, {0xc2736000}, 
-    {0xc2738000}, {0xc273a000}, {0xc273c000}, {0xc273e000}, 
-    {0xc2740000}, {0xc2742000}, {0xc2744000}, {0xc2746000}, 
-    {0xc2748000}, {0xc274a000}, {0xc274c000}, {0xc274e000}, 
-    {0xc2750000}, {0xc2752000}, {0xc2754000}, {0xc2756000}, 
-    {0xc2758000}, {0xc275a000}, {0xc275c000}, {0xc275e000}, 
-    {0xc2760000}, {0xc2762000}, {0xc2764000}, {0xc2766000}, 
-    {0xc2768000}, {0xc276a000}, {0xc276c000}, {0xc276e000}, 
-    {0xc2770000}, {0xc2772000}, {0xc2774000}, {0xc2776000}, 
-    {0xc2778000}, {0xc277a000}, {0xc277c000}, {0xc277e000}, 
-    {0xc2780000}, {0xc2782000}, {0xc2784000}, {0xc2786000}, 
-    {0xc2788000}, {0xc278a000}, {0xc278c000}, {0xc278e000}, 
-    {0xc2790000}, {0xc2792000}, {0xc2794000}, {0xc2796000}, 
-    {0xc2798000}, {0xc279a000}, {0xc279c000}, {0xc279e000}, 
-    {0xc27a0000}, {0xc27a2000}, {0xc27a4000}, {0xc27a6000}, 
-    {0xc27a8000}, {0xc27aa000}, {0xc27ac000}, {0xc27ae000}, 
-    {0xc27b0000}, {0xc27b2000}, {0xc27b4000}, {0xc27b6000}, 
-    {0xc27b8000}, {0xc27ba000}, {0xc27bc000}, {0xc27be000}, 
-    {0xc27c0000}, {0xc27c2000}, {0xc27c4000}, {0xc27c6000}, 
-    {0xc27c8000}, {0xc27ca000}, {0xc27cc000}, {0xc27ce000}, 
-    {0xc27d0000}, {0xc27d2000}, {0xc27d4000}, {0xc27d6000}, 
-    {0xc27d8000}, {0xc27da000}, {0xc27dc000}, {0xc27de000}, 
-    {0xc27e0000}, {0xc27e2000}, {0xc27e4000}, {0xc27e6000}, 
-    {0xc27e8000}, {0xc27ea000}, {0xc27ec000}, {0xc27ee000}, 
-    {0xc27f0000}, {0xc27f2000}, {0xc27f4000}, {0xc27f6000}, 
-    {0xc27f8000}, {0xc27fa000}, {0xc27fc000}, {0xc27fe000}, 
-    {0xc2800000}, {0xc2802000}, {0xc2804000}, {0xc2806000}, 
-    {0xc2808000}, {0xc280a000}, {0xc280c000}, {0xc280e000}, 
-    {0xc2810000}, {0xc2812000}, {0xc2814000}, {0xc2816000}, 
-    {0xc2818000}, {0xc281a000}, {0xc281c000}, {0xc281e000}, 
-    {0xc2820000}, {0xc2822000}, {0xc2824000}, {0xc2826000}, 
-    {0xc2828000}, {0xc282a000}, {0xc282c000}, {0xc282e000}, 
-    {0xc2830000}, {0xc2832000}, {0xc2834000}, {0xc2836000}, 
-    {0xc2838000}, {0xc283a000}, {0xc283c000}, {0xc283e000}, 
-    {0xc2840000}, {0xc2842000}, {0xc2844000}, {0xc2846000}, 
-    {0xc2848000}, {0xc284a000}, {0xc284c000}, {0xc284e000}, 
-    {0xc2850000}, {0xc2852000}, {0xc2854000}, {0xc2856000}, 
-    {0xc2858000}, {0xc285a000}, {0xc285c000}, {0xc285e000}, 
-    {0xc2860000}, {0xc2862000}, {0xc2864000}, {0xc2866000}, 
-    {0xc2868000}, {0xc286a000}, {0xc286c000}, {0xc286e000}, 
-    {0xc2870000}, {0xc2872000}, {0xc2874000}, {0xc2876000}, 
-    {0xc2878000}, {0xc287a000}, {0xc287c000}, {0xc287e000}, 
-    {0xc2880000}, {0xc2882000}, {0xc2884000}, {0xc2886000}, 
-    {0xc2888000}, {0xc288a000}, {0xc288c000}, {0xc288e000}, 
-    {0xc2890000}, {0xc2892000}, {0xc2894000}, {0xc2896000}, 
-    {0xc2898000}, {0xc289a000}, {0xc289c000}, {0xc289e000}, 
-    {0xc28a0000}, {0xc28a2000}, {0xc28a4000}, {0xc28a6000}, 
-    {0xc28a8000}, {0xc28aa000}, {0xc28ac000}, {0xc28ae000}, 
-    {0xc28b0000}, {0xc28b2000}, {0xc28b4000}, {0xc28b6000}, 
-    {0xc28b8000}, {0xc28ba000}, {0xc28bc000}, {0xc28be000}, 
-    {0xc28c0000}, {0xc28c2000}, {0xc28c4000}, {0xc28c6000}, 
-    {0xc28c8000}, {0xc28ca000}, {0xc28cc000}, {0xc28ce000}, 
-    {0xc28d0000}, {0xc28d2000}, {0xc28d4000}, {0xc28d6000}, 
-    {0xc28d8000}, {0xc28da000}, {0xc28dc000}, {0xc28de000}, 
-    {0xc28e0000}, {0xc28e2000}, {0xc28e4000}, {0xc28e6000}, 
-    {0xc28e8000}, {0xc28ea000}, {0xc28ec000}, {0xc28ee000}, 
-    {0xc28f0000}, {0xc28f2000}, {0xc28f4000}, {0xc28f6000}, 
-    {0xc28f8000}, {0xc28fa000}, {0xc28fc000}, {0xc28fe000}, 
-    {0xc2900000}, {0xc2902000}, {0xc2904000}, {0xc2906000}, 
-    {0xc2908000}, {0xc290a000}, {0xc290c000}, {0xc290e000}, 
-    {0xc2910000}, {0xc2912000}, {0xc2914000}, {0xc2916000}, 
-    {0xc2918000}, {0xc291a000}, {0xc291c000}, {0xc291e000}, 
-    {0xc2920000}, {0xc2922000}, {0xc2924000}, {0xc2926000}, 
-    {0xc2928000}, {0xc292a000}, {0xc292c000}, {0xc292e000}, 
-    {0xc2930000}, {0xc2932000}, {0xc2934000}, {0xc2936000}, 
-    {0xc2938000}, {0xc293a000}, {0xc293c000}, {0xc293e000}, 
-    {0xc2940000}, {0xc2942000}, {0xc2944000}, {0xc2946000}, 
-    {0xc2948000}, {0xc294a000}, {0xc294c000}, {0xc294e000}, 
-    {0xc2950000}, {0xc2952000}, {0xc2954000}, {0xc2956000}, 
-    {0xc2958000}, {0xc295a000}, {0xc295c000}, {0xc295e000}, 
-    {0xc2960000}, {0xc2962000}, {0xc2964000}, {0xc2966000}, 
-    {0xc2968000}, {0xc296a000}, {0xc296c000}, {0xc296e000}, 
-    {0xc2970000}, {0xc2972000}, {0xc2974000}, {0xc2976000}, 
-    {0xc2978000}, {0xc297a000}, {0xc297c000}, {0xc297e000}, 
-    {0xc2980000}, {0xc2982000}, {0xc2984000}, {0xc2986000}, 
-    {0xc2988000}, {0xc298a000}, {0xc298c000}, {0xc298e000}, 
-    {0xc2990000}, {0xc2992000}, {0xc2994000}, {0xc2996000}, 
-    {0xc2998000}, {0xc299a000}, {0xc299c000}, {0xc299e000}, 
-    {0xc29a0000}, {0xc29a2000}, {0xc29a4000}, {0xc29a6000}, 
-    {0xc29a8000}, {0xc29aa000}, {0xc29ac000}, {0xc29ae000}, 
-    {0xc29b0000}, {0xc29b2000}, {0xc29b4000}, {0xc29b6000}, 
-    {0xc29b8000}, {0xc29ba000}, {0xc29bc000}, {0xc29be000}, 
-    {0xc29c0000}, {0xc29c2000}, {0xc29c4000}, {0xc29c6000}, 
-    {0xc29c8000}, {0xc29ca000}, {0xc29cc000}, {0xc29ce000}, 
-    {0xc29d0000}, {0xc29d2000}, {0xc29d4000}, {0xc29d6000}, 
-    {0xc29d8000}, {0xc29da000}, {0xc29dc000}, {0xc29de000}, 
-    {0xc29e0000}, {0xc29e2000}, {0xc29e4000}, {0xc29e6000}, 
-    {0xc29e8000}, {0xc29ea000}, {0xc29ec000}, {0xc29ee000}, 
-    {0xc29f0000}, {0xc29f2000}, {0xc29f4000}, {0xc29f6000}, 
-    {0xc29f8000}, {0xc29fa000}, {0xc29fc000}, {0xc29fe000}, 
-    {0xc2a00000}, {0xc2a02000}, {0xc2a04000}, {0xc2a06000}, 
-    {0xc2a08000}, {0xc2a0a000}, {0xc2a0c000}, {0xc2a0e000}, 
-    {0xc2a10000}, {0xc2a12000}, {0xc2a14000}, {0xc2a16000}, 
-    {0xc2a18000}, {0xc2a1a000}, {0xc2a1c000}, {0xc2a1e000}, 
-    {0xc2a20000}, {0xc2a22000}, {0xc2a24000}, {0xc2a26000}, 
-    {0xc2a28000}, {0xc2a2a000}, {0xc2a2c000}, {0xc2a2e000}, 
-    {0xc2a30000}, {0xc2a32000}, {0xc2a34000}, {0xc2a36000}, 
-    {0xc2a38000}, {0xc2a3a000}, {0xc2a3c000}, {0xc2a3e000}, 
-    {0xc2a40000}, {0xc2a42000}, {0xc2a44000}, {0xc2a46000}, 
-    {0xc2a48000}, {0xc2a4a000}, {0xc2a4c000}, {0xc2a4e000}, 
-    {0xc2a50000}, {0xc2a52000}, {0xc2a54000}, {0xc2a56000}, 
-    {0xc2a58000}, {0xc2a5a000}, {0xc2a5c000}, {0xc2a5e000}, 
-    {0xc2a60000}, {0xc2a62000}, {0xc2a64000}, {0xc2a66000}, 
-    {0xc2a68000}, {0xc2a6a000}, {0xc2a6c000}, {0xc2a6e000}, 
-    {0xc2a70000}, {0xc2a72000}, {0xc2a74000}, {0xc2a76000}, 
-    {0xc2a78000}, {0xc2a7a000}, {0xc2a7c000}, {0xc2a7e000}, 
-    {0xc2a80000}, {0xc2a82000}, {0xc2a84000}, {0xc2a86000}, 
-    {0xc2a88000}, {0xc2a8a000}, {0xc2a8c000}, {0xc2a8e000}, 
-    {0xc2a90000}, {0xc2a92000}, {0xc2a94000}, {0xc2a96000}, 
-    {0xc2a98000}, {0xc2a9a000}, {0xc2a9c000}, {0xc2a9e000}, 
-    {0xc2aa0000}, {0xc2aa2000}, {0xc2aa4000}, {0xc2aa6000}, 
-    {0xc2aa8000}, {0xc2aaa000}, {0xc2aac000}, {0xc2aae000}, 
-    {0xc2ab0000}, {0xc2ab2000}, {0xc2ab4000}, {0xc2ab6000}, 
-    {0xc2ab8000}, {0xc2aba000}, {0xc2abc000}, {0xc2abe000}, 
-    {0xc2ac0000}, {0xc2ac2000}, {0xc2ac4000}, {0xc2ac6000}, 
-    {0xc2ac8000}, {0xc2aca000}, {0xc2acc000}, {0xc2ace000}, 
-    {0xc2ad0000}, {0xc2ad2000}, {0xc2ad4000}, {0xc2ad6000}, 
-    {0xc2ad8000}, {0xc2ada000}, {0xc2adc000}, {0xc2ade000}, 
-    {0xc2ae0000}, {0xc2ae2000}, {0xc2ae4000}, {0xc2ae6000}, 
-    {0xc2ae8000}, {0xc2aea000}, {0xc2aec000}, {0xc2aee000}, 
-    {0xc2af0000}, {0xc2af2000}, {0xc2af4000}, {0xc2af6000}, 
-    {0xc2af8000}, {0xc2afa000}, {0xc2afc000}, {0xc2afe000}, 
-    {0xc2b00000}, {0xc2b02000}, {0xc2b04000}, {0xc2b06000}, 
-    {0xc2b08000}, {0xc2b0a000}, {0xc2b0c000}, {0xc2b0e000}, 
-    {0xc2b10000}, {0xc2b12000}, {0xc2b14000}, {0xc2b16000}, 
-    {0xc2b18000}, {0xc2b1a000}, {0xc2b1c000}, {0xc2b1e000}, 
-    {0xc2b20000}, {0xc2b22000}, {0xc2b24000}, {0xc2b26000}, 
-    {0xc2b28000}, {0xc2b2a000}, {0xc2b2c000}, {0xc2b2e000}, 
-    {0xc2b30000}, {0xc2b32000}, {0xc2b34000}, {0xc2b36000}, 
-    {0xc2b38000}, {0xc2b3a000}, {0xc2b3c000}, {0xc2b3e000}, 
-    {0xc2b40000}, {0xc2b42000}, {0xc2b44000}, {0xc2b46000}, 
-    {0xc2b48000}, {0xc2b4a000}, {0xc2b4c000}, {0xc2b4e000}, 
-    {0xc2b50000}, {0xc2b52000}, {0xc2b54000}, {0xc2b56000}, 
-    {0xc2b58000}, {0xc2b5a000}, {0xc2b5c000}, {0xc2b5e000}, 
-    {0xc2b60000}, {0xc2b62000}, {0xc2b64000}, {0xc2b66000}, 
-    {0xc2b68000}, {0xc2b6a000}, {0xc2b6c000}, {0xc2b6e000}, 
-    {0xc2b70000}, {0xc2b72000}, {0xc2b74000}, {0xc2b76000}, 
-    {0xc2b78000}, {0xc2b7a000}, {0xc2b7c000}, {0xc2b7e000}, 
-    {0xc2b80000}, {0xc2b82000}, {0xc2b84000}, {0xc2b86000}, 
-    {0xc2b88000}, {0xc2b8a000}, {0xc2b8c000}, {0xc2b8e000}, 
-    {0xc2b90000}, {0xc2b92000}, {0xc2b94000}, {0xc2b96000}, 
-    {0xc2b98000}, {0xc2b9a000}, {0xc2b9c000}, {0xc2b9e000}, 
-    {0xc2ba0000}, {0xc2ba2000}, {0xc2ba4000}, {0xc2ba6000}, 
-    {0xc2ba8000}, {0xc2baa000}, {0xc2bac000}, {0xc2bae000}, 
-    {0xc2bb0000}, {0xc2bb2000}, {0xc2bb4000}, {0xc2bb6000}, 
-    {0xc2bb8000}, {0xc2bba000}, {0xc2bbc000}, {0xc2bbe000}, 
-    {0xc2bc0000}, {0xc2bc2000}, {0xc2bc4000}, {0xc2bc6000}, 
-    {0xc2bc8000}, {0xc2bca000}, {0xc2bcc000}, {0xc2bce000}, 
-    {0xc2bd0000}, {0xc2bd2000}, {0xc2bd4000}, {0xc2bd6000}, 
-    {0xc2bd8000}, {0xc2bda000}, {0xc2bdc000}, {0xc2bde000}, 
-    {0xc2be0000}, {0xc2be2000}, {0xc2be4000}, {0xc2be6000}, 
-    {0xc2be8000}, {0xc2bea000}, {0xc2bec000}, {0xc2bee000}, 
-    {0xc2bf0000}, {0xc2bf2000}, {0xc2bf4000}, {0xc2bf6000}, 
-    {0xc2bf8000}, {0xc2bfa000}, {0xc2bfc000}, {0xc2bfe000}, 
-    {0xc2c00000}, {0xc2c02000}, {0xc2c04000}, {0xc2c06000}, 
-    {0xc2c08000}, {0xc2c0a000}, {0xc2c0c000}, {0xc2c0e000}, 
-    {0xc2c10000}, {0xc2c12000}, {0xc2c14000}, {0xc2c16000}, 
-    {0xc2c18000}, {0xc2c1a000}, {0xc2c1c000}, {0xc2c1e000}, 
-    {0xc2c20000}, {0xc2c22000}, {0xc2c24000}, {0xc2c26000}, 
-    {0xc2c28000}, {0xc2c2a000}, {0xc2c2c000}, {0xc2c2e000}, 
-    {0xc2c30000}, {0xc2c32000}, {0xc2c34000}, {0xc2c36000}, 
-    {0xc2c38000}, {0xc2c3a000}, {0xc2c3c000}, {0xc2c3e000}, 
-    {0xc2c40000}, {0xc2c42000}, {0xc2c44000}, {0xc2c46000}, 
-    {0xc2c48000}, {0xc2c4a000}, {0xc2c4c000}, {0xc2c4e000}, 
-    {0xc2c50000}, {0xc2c52000}, {0xc2c54000}, {0xc2c56000}, 
-    {0xc2c58000}, {0xc2c5a000}, {0xc2c5c000}, {0xc2c5e000}, 
-    {0xc2c60000}, {0xc2c62000}, {0xc2c64000}, {0xc2c66000}, 
-    {0xc2c68000}, {0xc2c6a000}, {0xc2c6c000}, {0xc2c6e000}, 
-    {0xc2c70000}, {0xc2c72000}, {0xc2c74000}, {0xc2c76000}, 
-    {0xc2c78000}, {0xc2c7a000}, {0xc2c7c000}, {0xc2c7e000}, 
-    {0xc2c80000}, {0xc2c82000}, {0xc2c84000}, {0xc2c86000}, 
-    {0xc2c88000}, {0xc2c8a000}, {0xc2c8c000}, {0xc2c8e000}, 
-    {0xc2c90000}, {0xc2c92000}, {0xc2c94000}, {0xc2c96000}, 
-    {0xc2c98000}, {0xc2c9a000}, {0xc2c9c000}, {0xc2c9e000}, 
-    {0xc2ca0000}, {0xc2ca2000}, {0xc2ca4000}, {0xc2ca6000}, 
-    {0xc2ca8000}, {0xc2caa000}, {0xc2cac000}, {0xc2cae000}, 
-    {0xc2cb0000}, {0xc2cb2000}, {0xc2cb4000}, {0xc2cb6000}, 
-    {0xc2cb8000}, {0xc2cba000}, {0xc2cbc000}, {0xc2cbe000}, 
-    {0xc2cc0000}, {0xc2cc2000}, {0xc2cc4000}, {0xc2cc6000}, 
-    {0xc2cc8000}, {0xc2cca000}, {0xc2ccc000}, {0xc2cce000}, 
-    {0xc2cd0000}, {0xc2cd2000}, {0xc2cd4000}, {0xc2cd6000}, 
-    {0xc2cd8000}, {0xc2cda000}, {0xc2cdc000}, {0xc2cde000}, 
-    {0xc2ce0000}, {0xc2ce2000}, {0xc2ce4000}, {0xc2ce6000}, 
-    {0xc2ce8000}, {0xc2cea000}, {0xc2cec000}, {0xc2cee000}, 
-    {0xc2cf0000}, {0xc2cf2000}, {0xc2cf4000}, {0xc2cf6000}, 
-    {0xc2cf8000}, {0xc2cfa000}, {0xc2cfc000}, {0xc2cfe000}, 
-    {0xc2d00000}, {0xc2d02000}, {0xc2d04000}, {0xc2d06000}, 
-    {0xc2d08000}, {0xc2d0a000}, {0xc2d0c000}, {0xc2d0e000}, 
-    {0xc2d10000}, {0xc2d12000}, {0xc2d14000}, {0xc2d16000}, 
-    {0xc2d18000}, {0xc2d1a000}, {0xc2d1c000}, {0xc2d1e000}, 
-    {0xc2d20000}, {0xc2d22000}, {0xc2d24000}, {0xc2d26000}, 
-    {0xc2d28000}, {0xc2d2a000}, {0xc2d2c000}, {0xc2d2e000}, 
-    {0xc2d30000}, {0xc2d32000}, {0xc2d34000}, {0xc2d36000}, 
-    {0xc2d38000}, {0xc2d3a000}, {0xc2d3c000}, {0xc2d3e000}, 
-    {0xc2d40000}, {0xc2d42000}, {0xc2d44000}, {0xc2d46000}, 
-    {0xc2d48000}, {0xc2d4a000}, {0xc2d4c000}, {0xc2d4e000}, 
-    {0xc2d50000}, {0xc2d52000}, {0xc2d54000}, {0xc2d56000}, 
-    {0xc2d58000}, {0xc2d5a000}, {0xc2d5c000}, {0xc2d5e000}, 
-    {0xc2d60000}, {0xc2d62000}, {0xc2d64000}, {0xc2d66000}, 
-    {0xc2d68000}, {0xc2d6a000}, {0xc2d6c000}, {0xc2d6e000}, 
-    {0xc2d70000}, {0xc2d72000}, {0xc2d74000}, {0xc2d76000}, 
-    {0xc2d78000}, {0xc2d7a000}, {0xc2d7c000}, {0xc2d7e000}, 
-    {0xc2d80000}, {0xc2d82000}, {0xc2d84000}, {0xc2d86000}, 
-    {0xc2d88000}, {0xc2d8a000}, {0xc2d8c000}, {0xc2d8e000}, 
-    {0xc2d90000}, {0xc2d92000}, {0xc2d94000}, {0xc2d96000}, 
-    {0xc2d98000}, {0xc2d9a000}, {0xc2d9c000}, {0xc2d9e000}, 
-    {0xc2da0000}, {0xc2da2000}, {0xc2da4000}, {0xc2da6000}, 
-    {0xc2da8000}, {0xc2daa000}, {0xc2dac000}, {0xc2dae000}, 
-    {0xc2db0000}, {0xc2db2000}, {0xc2db4000}, {0xc2db6000}, 
-    {0xc2db8000}, {0xc2dba000}, {0xc2dbc000}, {0xc2dbe000}, 
-    {0xc2dc0000}, {0xc2dc2000}, {0xc2dc4000}, {0xc2dc6000}, 
-    {0xc2dc8000}, {0xc2dca000}, {0xc2dcc000}, {0xc2dce000}, 
-    {0xc2dd0000}, {0xc2dd2000}, {0xc2dd4000}, {0xc2dd6000}, 
-    {0xc2dd8000}, {0xc2dda000}, {0xc2ddc000}, {0xc2dde000}, 
-    {0xc2de0000}, {0xc2de2000}, {0xc2de4000}, {0xc2de6000}, 
-    {0xc2de8000}, {0xc2dea000}, {0xc2dec000}, {0xc2dee000}, 
-    {0xc2df0000}, {0xc2df2000}, {0xc2df4000}, {0xc2df6000}, 
-    {0xc2df8000}, {0xc2dfa000}, {0xc2dfc000}, {0xc2dfe000}, 
-    {0xc2e00000}, {0xc2e02000}, {0xc2e04000}, {0xc2e06000}, 
-    {0xc2e08000}, {0xc2e0a000}, {0xc2e0c000}, {0xc2e0e000}, 
-    {0xc2e10000}, {0xc2e12000}, {0xc2e14000}, {0xc2e16000}, 
-    {0xc2e18000}, {0xc2e1a000}, {0xc2e1c000}, {0xc2e1e000}, 
-    {0xc2e20000}, {0xc2e22000}, {0xc2e24000}, {0xc2e26000}, 
-    {0xc2e28000}, {0xc2e2a000}, {0xc2e2c000}, {0xc2e2e000}, 
-    {0xc2e30000}, {0xc2e32000}, {0xc2e34000}, {0xc2e36000}, 
-    {0xc2e38000}, {0xc2e3a000}, {0xc2e3c000}, {0xc2e3e000}, 
-    {0xc2e40000}, {0xc2e42000}, {0xc2e44000}, {0xc2e46000}, 
-    {0xc2e48000}, {0xc2e4a000}, {0xc2e4c000}, {0xc2e4e000}, 
-    {0xc2e50000}, {0xc2e52000}, {0xc2e54000}, {0xc2e56000}, 
-    {0xc2e58000}, {0xc2e5a000}, {0xc2e5c000}, {0xc2e5e000}, 
-    {0xc2e60000}, {0xc2e62000}, {0xc2e64000}, {0xc2e66000}, 
-    {0xc2e68000}, {0xc2e6a000}, {0xc2e6c000}, {0xc2e6e000}, 
-    {0xc2e70000}, {0xc2e72000}, {0xc2e74000}, {0xc2e76000}, 
-    {0xc2e78000}, {0xc2e7a000}, {0xc2e7c000}, {0xc2e7e000}, 
-    {0xc2e80000}, {0xc2e82000}, {0xc2e84000}, {0xc2e86000}, 
-    {0xc2e88000}, {0xc2e8a000}, {0xc2e8c000}, {0xc2e8e000}, 
-    {0xc2e90000}, {0xc2e92000}, {0xc2e94000}, {0xc2e96000}, 
-    {0xc2e98000}, {0xc2e9a000}, {0xc2e9c000}, {0xc2e9e000}, 
-    {0xc2ea0000}, {0xc2ea2000}, {0xc2ea4000}, {0xc2ea6000}, 
-    {0xc2ea8000}, {0xc2eaa000}, {0xc2eac000}, {0xc2eae000}, 
-    {0xc2eb0000}, {0xc2eb2000}, {0xc2eb4000}, {0xc2eb6000}, 
-    {0xc2eb8000}, {0xc2eba000}, {0xc2ebc000}, {0xc2ebe000}, 
-    {0xc2ec0000}, {0xc2ec2000}, {0xc2ec4000}, {0xc2ec6000}, 
-    {0xc2ec8000}, {0xc2eca000}, {0xc2ecc000}, {0xc2ece000}, 
-    {0xc2ed0000}, {0xc2ed2000}, {0xc2ed4000}, {0xc2ed6000}, 
-    {0xc2ed8000}, {0xc2eda000}, {0xc2edc000}, {0xc2ede000}, 
-    {0xc2ee0000}, {0xc2ee2000}, {0xc2ee4000}, {0xc2ee6000}, 
-    {0xc2ee8000}, {0xc2eea000}, {0xc2eec000}, {0xc2eee000}, 
-    {0xc2ef0000}, {0xc2ef2000}, {0xc2ef4000}, {0xc2ef6000}, 
-    {0xc2ef8000}, {0xc2efa000}, {0xc2efc000}, {0xc2efe000}, 
-    {0xc2f00000}, {0xc2f02000}, {0xc2f04000}, {0xc2f06000}, 
-    {0xc2f08000}, {0xc2f0a000}, {0xc2f0c000}, {0xc2f0e000}, 
-    {0xc2f10000}, {0xc2f12000}, {0xc2f14000}, {0xc2f16000}, 
-    {0xc2f18000}, {0xc2f1a000}, {0xc2f1c000}, {0xc2f1e000}, 
-    {0xc2f20000}, {0xc2f22000}, {0xc2f24000}, {0xc2f26000}, 
-    {0xc2f28000}, {0xc2f2a000}, {0xc2f2c000}, {0xc2f2e000}, 
-    {0xc2f30000}, {0xc2f32000}, {0xc2f34000}, {0xc2f36000}, 
-    {0xc2f38000}, {0xc2f3a000}, {0xc2f3c000}, {0xc2f3e000}, 
-    {0xc2f40000}, {0xc2f42000}, {0xc2f44000}, {0xc2f46000}, 
-    {0xc2f48000}, {0xc2f4a000}, {0xc2f4c000}, {0xc2f4e000}, 
-    {0xc2f50000}, {0xc2f52000}, {0xc2f54000}, {0xc2f56000}, 
-    {0xc2f58000}, {0xc2f5a000}, {0xc2f5c000}, {0xc2f5e000}, 
-    {0xc2f60000}, {0xc2f62000}, {0xc2f64000}, {0xc2f66000}, 
-    {0xc2f68000}, {0xc2f6a000}, {0xc2f6c000}, {0xc2f6e000}, 
-    {0xc2f70000}, {0xc2f72000}, {0xc2f74000}, {0xc2f76000}, 
-    {0xc2f78000}, {0xc2f7a000}, {0xc2f7c000}, {0xc2f7e000}, 
-    {0xc2f80000}, {0xc2f82000}, {0xc2f84000}, {0xc2f86000}, 
-    {0xc2f88000}, {0xc2f8a000}, {0xc2f8c000}, {0xc2f8e000}, 
-    {0xc2f90000}, {0xc2f92000}, {0xc2f94000}, {0xc2f96000}, 
-    {0xc2f98000}, {0xc2f9a000}, {0xc2f9c000}, {0xc2f9e000}, 
-    {0xc2fa0000}, {0xc2fa2000}, {0xc2fa4000}, {0xc2fa6000}, 
-    {0xc2fa8000}, {0xc2faa000}, {0xc2fac000}, {0xc2fae000}, 
-    {0xc2fb0000}, {0xc2fb2000}, {0xc2fb4000}, {0xc2fb6000}, 
-    {0xc2fb8000}, {0xc2fba000}, {0xc2fbc000}, {0xc2fbe000}, 
-    {0xc2fc0000}, {0xc2fc2000}, {0xc2fc4000}, {0xc2fc6000}, 
-    {0xc2fc8000}, {0xc2fca000}, {0xc2fcc000}, {0xc2fce000}, 
-    {0xc2fd0000}, {0xc2fd2000}, {0xc2fd4000}, {0xc2fd6000}, 
-    {0xc2fd8000}, {0xc2fda000}, {0xc2fdc000}, {0xc2fde000}, 
-    {0xc2fe0000}, {0xc2fe2000}, {0xc2fe4000}, {0xc2fe6000}, 
-    {0xc2fe8000}, {0xc2fea000}, {0xc2fec000}, {0xc2fee000}, 
-    {0xc2ff0000}, {0xc2ff2000}, {0xc2ff4000}, {0xc2ff6000}, 
-    {0xc2ff8000}, {0xc2ffa000}, {0xc2ffc000}, {0xc2ffe000}, 
-    {0xc3000000}, {0xc3002000}, {0xc3004000}, {0xc3006000}, 
-    {0xc3008000}, {0xc300a000}, {0xc300c000}, {0xc300e000}, 
-    {0xc3010000}, {0xc3012000}, {0xc3014000}, {0xc3016000}, 
-    {0xc3018000}, {0xc301a000}, {0xc301c000}, {0xc301e000}, 
-    {0xc3020000}, {0xc3022000}, {0xc3024000}, {0xc3026000}, 
-    {0xc3028000}, {0xc302a000}, {0xc302c000}, {0xc302e000}, 
-    {0xc3030000}, {0xc3032000}, {0xc3034000}, {0xc3036000}, 
-    {0xc3038000}, {0xc303a000}, {0xc303c000}, {0xc303e000}, 
-    {0xc3040000}, {0xc3042000}, {0xc3044000}, {0xc3046000}, 
-    {0xc3048000}, {0xc304a000}, {0xc304c000}, {0xc304e000}, 
-    {0xc3050000}, {0xc3052000}, {0xc3054000}, {0xc3056000}, 
-    {0xc3058000}, {0xc305a000}, {0xc305c000}, {0xc305e000}, 
-    {0xc3060000}, {0xc3062000}, {0xc3064000}, {0xc3066000}, 
-    {0xc3068000}, {0xc306a000}, {0xc306c000}, {0xc306e000}, 
-    {0xc3070000}, {0xc3072000}, {0xc3074000}, {0xc3076000}, 
-    {0xc3078000}, {0xc307a000}, {0xc307c000}, {0xc307e000}, 
-    {0xc3080000}, {0xc3082000}, {0xc3084000}, {0xc3086000}, 
-    {0xc3088000}, {0xc308a000}, {0xc308c000}, {0xc308e000}, 
-    {0xc3090000}, {0xc3092000}, {0xc3094000}, {0xc3096000}, 
-    {0xc3098000}, {0xc309a000}, {0xc309c000}, {0xc309e000}, 
-    {0xc30a0000}, {0xc30a2000}, {0xc30a4000}, {0xc30a6000}, 
-    {0xc30a8000}, {0xc30aa000}, {0xc30ac000}, {0xc30ae000}, 
-    {0xc30b0000}, {0xc30b2000}, {0xc30b4000}, {0xc30b6000}, 
-    {0xc30b8000}, {0xc30ba000}, {0xc30bc000}, {0xc30be000}, 
-    {0xc30c0000}, {0xc30c2000}, {0xc30c4000}, {0xc30c6000}, 
-    {0xc30c8000}, {0xc30ca000}, {0xc30cc000}, {0xc30ce000}, 
-    {0xc30d0000}, {0xc30d2000}, {0xc30d4000}, {0xc30d6000}, 
-    {0xc30d8000}, {0xc30da000}, {0xc30dc000}, {0xc30de000}, 
-    {0xc30e0000}, {0xc30e2000}, {0xc30e4000}, {0xc30e6000}, 
-    {0xc30e8000}, {0xc30ea000}, {0xc30ec000}, {0xc30ee000}, 
-    {0xc30f0000}, {0xc30f2000}, {0xc30f4000}, {0xc30f6000}, 
-    {0xc30f8000}, {0xc30fa000}, {0xc30fc000}, {0xc30fe000}, 
-    {0xc3100000}, {0xc3102000}, {0xc3104000}, {0xc3106000}, 
-    {0xc3108000}, {0xc310a000}, {0xc310c000}, {0xc310e000}, 
-    {0xc3110000}, {0xc3112000}, {0xc3114000}, {0xc3116000}, 
-    {0xc3118000}, {0xc311a000}, {0xc311c000}, {0xc311e000}, 
-    {0xc3120000}, {0xc3122000}, {0xc3124000}, {0xc3126000}, 
-    {0xc3128000}, {0xc312a000}, {0xc312c000}, {0xc312e000}, 
-    {0xc3130000}, {0xc3132000}, {0xc3134000}, {0xc3136000}, 
-    {0xc3138000}, {0xc313a000}, {0xc313c000}, {0xc313e000}, 
-    {0xc3140000}, {0xc3142000}, {0xc3144000}, {0xc3146000}, 
-    {0xc3148000}, {0xc314a000}, {0xc314c000}, {0xc314e000}, 
-    {0xc3150000}, {0xc3152000}, {0xc3154000}, {0xc3156000}, 
-    {0xc3158000}, {0xc315a000}, {0xc315c000}, {0xc315e000}, 
-    {0xc3160000}, {0xc3162000}, {0xc3164000}, {0xc3166000}, 
-    {0xc3168000}, {0xc316a000}, {0xc316c000}, {0xc316e000}, 
-    {0xc3170000}, {0xc3172000}, {0xc3174000}, {0xc3176000}, 
-    {0xc3178000}, {0xc317a000}, {0xc317c000}, {0xc317e000}, 
-    {0xc3180000}, {0xc3182000}, {0xc3184000}, {0xc3186000}, 
-    {0xc3188000}, {0xc318a000}, {0xc318c000}, {0xc318e000}, 
-    {0xc3190000}, {0xc3192000}, {0xc3194000}, {0xc3196000}, 
-    {0xc3198000}, {0xc319a000}, {0xc319c000}, {0xc319e000}, 
-    {0xc31a0000}, {0xc31a2000}, {0xc31a4000}, {0xc31a6000}, 
-    {0xc31a8000}, {0xc31aa000}, {0xc31ac000}, {0xc31ae000}, 
-    {0xc31b0000}, {0xc31b2000}, {0xc31b4000}, {0xc31b6000}, 
-    {0xc31b8000}, {0xc31ba000}, {0xc31bc000}, {0xc31be000}, 
-    {0xc31c0000}, {0xc31c2000}, {0xc31c4000}, {0xc31c6000}, 
-    {0xc31c8000}, {0xc31ca000}, {0xc31cc000}, {0xc31ce000}, 
-    {0xc31d0000}, {0xc31d2000}, {0xc31d4000}, {0xc31d6000}, 
-    {0xc31d8000}, {0xc31da000}, {0xc31dc000}, {0xc31de000}, 
-    {0xc31e0000}, {0xc31e2000}, {0xc31e4000}, {0xc31e6000}, 
-    {0xc31e8000}, {0xc31ea000}, {0xc31ec000}, {0xc31ee000}, 
-    {0xc31f0000}, {0xc31f2000}, {0xc31f4000}, {0xc31f6000}, 
-    {0xc31f8000}, {0xc31fa000}, {0xc31fc000}, {0xc31fe000}, 
-    {0xc3200000}, {0xc3202000}, {0xc3204000}, {0xc3206000}, 
-    {0xc3208000}, {0xc320a000}, {0xc320c000}, {0xc320e000}, 
-    {0xc3210000}, {0xc3212000}, {0xc3214000}, {0xc3216000}, 
-    {0xc3218000}, {0xc321a000}, {0xc321c000}, {0xc321e000}, 
-    {0xc3220000}, {0xc3222000}, {0xc3224000}, {0xc3226000}, 
-    {0xc3228000}, {0xc322a000}, {0xc322c000}, {0xc322e000}, 
-    {0xc3230000}, {0xc3232000}, {0xc3234000}, {0xc3236000}, 
-    {0xc3238000}, {0xc323a000}, {0xc323c000}, {0xc323e000}, 
-    {0xc3240000}, {0xc3242000}, {0xc3244000}, {0xc3246000}, 
-    {0xc3248000}, {0xc324a000}, {0xc324c000}, {0xc324e000}, 
-    {0xc3250000}, {0xc3252000}, {0xc3254000}, {0xc3256000}, 
-    {0xc3258000}, {0xc325a000}, {0xc325c000}, {0xc325e000}, 
-    {0xc3260000}, {0xc3262000}, {0xc3264000}, {0xc3266000}, 
-    {0xc3268000}, {0xc326a000}, {0xc326c000}, {0xc326e000}, 
-    {0xc3270000}, {0xc3272000}, {0xc3274000}, {0xc3276000}, 
-    {0xc3278000}, {0xc327a000}, {0xc327c000}, {0xc327e000}, 
-    {0xc3280000}, {0xc3282000}, {0xc3284000}, {0xc3286000}, 
-    {0xc3288000}, {0xc328a000}, {0xc328c000}, {0xc328e000}, 
-    {0xc3290000}, {0xc3292000}, {0xc3294000}, {0xc3296000}, 
-    {0xc3298000}, {0xc329a000}, {0xc329c000}, {0xc329e000}, 
-    {0xc32a0000}, {0xc32a2000}, {0xc32a4000}, {0xc32a6000}, 
-    {0xc32a8000}, {0xc32aa000}, {0xc32ac000}, {0xc32ae000}, 
-    {0xc32b0000}, {0xc32b2000}, {0xc32b4000}, {0xc32b6000}, 
-    {0xc32b8000}, {0xc32ba000}, {0xc32bc000}, {0xc32be000}, 
-    {0xc32c0000}, {0xc32c2000}, {0xc32c4000}, {0xc32c6000}, 
-    {0xc32c8000}, {0xc32ca000}, {0xc32cc000}, {0xc32ce000}, 
-    {0xc32d0000}, {0xc32d2000}, {0xc32d4000}, {0xc32d6000}, 
-    {0xc32d8000}, {0xc32da000}, {0xc32dc000}, {0xc32de000}, 
-    {0xc32e0000}, {0xc32e2000}, {0xc32e4000}, {0xc32e6000}, 
-    {0xc32e8000}, {0xc32ea000}, {0xc32ec000}, {0xc32ee000}, 
-    {0xc32f0000}, {0xc32f2000}, {0xc32f4000}, {0xc32f6000}, 
-    {0xc32f8000}, {0xc32fa000}, {0xc32fc000}, {0xc32fe000}, 
-    {0xc3300000}, {0xc3302000}, {0xc3304000}, {0xc3306000}, 
-    {0xc3308000}, {0xc330a000}, {0xc330c000}, {0xc330e000}, 
-    {0xc3310000}, {0xc3312000}, {0xc3314000}, {0xc3316000}, 
-    {0xc3318000}, {0xc331a000}, {0xc331c000}, {0xc331e000}, 
-    {0xc3320000}, {0xc3322000}, {0xc3324000}, {0xc3326000}, 
-    {0xc3328000}, {0xc332a000}, {0xc332c000}, {0xc332e000}, 
-    {0xc3330000}, {0xc3332000}, {0xc3334000}, {0xc3336000}, 
-    {0xc3338000}, {0xc333a000}, {0xc333c000}, {0xc333e000}, 
-    {0xc3340000}, {0xc3342000}, {0xc3344000}, {0xc3346000}, 
-    {0xc3348000}, {0xc334a000}, {0xc334c000}, {0xc334e000}, 
-    {0xc3350000}, {0xc3352000}, {0xc3354000}, {0xc3356000}, 
-    {0xc3358000}, {0xc335a000}, {0xc335c000}, {0xc335e000}, 
-    {0xc3360000}, {0xc3362000}, {0xc3364000}, {0xc3366000}, 
-    {0xc3368000}, {0xc336a000}, {0xc336c000}, {0xc336e000}, 
-    {0xc3370000}, {0xc3372000}, {0xc3374000}, {0xc3376000}, 
-    {0xc3378000}, {0xc337a000}, {0xc337c000}, {0xc337e000}, 
-    {0xc3380000}, {0xc3382000}, {0xc3384000}, {0xc3386000}, 
-    {0xc3388000}, {0xc338a000}, {0xc338c000}, {0xc338e000}, 
-    {0xc3390000}, {0xc3392000}, {0xc3394000}, {0xc3396000}, 
-    {0xc3398000}, {0xc339a000}, {0xc339c000}, {0xc339e000}, 
-    {0xc33a0000}, {0xc33a2000}, {0xc33a4000}, {0xc33a6000}, 
-    {0xc33a8000}, {0xc33aa000}, {0xc33ac000}, {0xc33ae000}, 
-    {0xc33b0000}, {0xc33b2000}, {0xc33b4000}, {0xc33b6000}, 
-    {0xc33b8000}, {0xc33ba000}, {0xc33bc000}, {0xc33be000}, 
-    {0xc33c0000}, {0xc33c2000}, {0xc33c4000}, {0xc33c6000}, 
-    {0xc33c8000}, {0xc33ca000}, {0xc33cc000}, {0xc33ce000}, 
-    {0xc33d0000}, {0xc33d2000}, {0xc33d4000}, {0xc33d6000}, 
-    {0xc33d8000}, {0xc33da000}, {0xc33dc000}, {0xc33de000}, 
-    {0xc33e0000}, {0xc33e2000}, {0xc33e4000}, {0xc33e6000}, 
-    {0xc33e8000}, {0xc33ea000}, {0xc33ec000}, {0xc33ee000}, 
-    {0xc33f0000}, {0xc33f2000}, {0xc33f4000}, {0xc33f6000}, 
-    {0xc33f8000}, {0xc33fa000}, {0xc33fc000}, {0xc33fe000}, 
-    {0xc3400000}, {0xc3402000}, {0xc3404000}, {0xc3406000}, 
-    {0xc3408000}, {0xc340a000}, {0xc340c000}, {0xc340e000}, 
-    {0xc3410000}, {0xc3412000}, {0xc3414000}, {0xc3416000}, 
-    {0xc3418000}, {0xc341a000}, {0xc341c000}, {0xc341e000}, 
-    {0xc3420000}, {0xc3422000}, {0xc3424000}, {0xc3426000}, 
-    {0xc3428000}, {0xc342a000}, {0xc342c000}, {0xc342e000}, 
-    {0xc3430000}, {0xc3432000}, {0xc3434000}, {0xc3436000}, 
-    {0xc3438000}, {0xc343a000}, {0xc343c000}, {0xc343e000}, 
-    {0xc3440000}, {0xc3442000}, {0xc3444000}, {0xc3446000}, 
-    {0xc3448000}, {0xc344a000}, {0xc344c000}, {0xc344e000}, 
-    {0xc3450000}, {0xc3452000}, {0xc3454000}, {0xc3456000}, 
-    {0xc3458000}, {0xc345a000}, {0xc345c000}, {0xc345e000}, 
-    {0xc3460000}, {0xc3462000}, {0xc3464000}, {0xc3466000}, 
-    {0xc3468000}, {0xc346a000}, {0xc346c000}, {0xc346e000}, 
-    {0xc3470000}, {0xc3472000}, {0xc3474000}, {0xc3476000}, 
-    {0xc3478000}, {0xc347a000}, {0xc347c000}, {0xc347e000}, 
-    {0xc3480000}, {0xc3482000}, {0xc3484000}, {0xc3486000}, 
-    {0xc3488000}, {0xc348a000}, {0xc348c000}, {0xc348e000}, 
-    {0xc3490000}, {0xc3492000}, {0xc3494000}, {0xc3496000}, 
-    {0xc3498000}, {0xc349a000}, {0xc349c000}, {0xc349e000}, 
-    {0xc34a0000}, {0xc34a2000}, {0xc34a4000}, {0xc34a6000}, 
-    {0xc34a8000}, {0xc34aa000}, {0xc34ac000}, {0xc34ae000}, 
-    {0xc34b0000}, {0xc34b2000}, {0xc34b4000}, {0xc34b6000}, 
-    {0xc34b8000}, {0xc34ba000}, {0xc34bc000}, {0xc34be000}, 
-    {0xc34c0000}, {0xc34c2000}, {0xc34c4000}, {0xc34c6000}, 
-    {0xc34c8000}, {0xc34ca000}, {0xc34cc000}, {0xc34ce000}, 
-    {0xc34d0000}, {0xc34d2000}, {0xc34d4000}, {0xc34d6000}, 
-    {0xc34d8000}, {0xc34da000}, {0xc34dc000}, {0xc34de000}, 
-    {0xc34e0000}, {0xc34e2000}, {0xc34e4000}, {0xc34e6000}, 
-    {0xc34e8000}, {0xc34ea000}, {0xc34ec000}, {0xc34ee000}, 
-    {0xc34f0000}, {0xc34f2000}, {0xc34f4000}, {0xc34f6000}, 
-    {0xc34f8000}, {0xc34fa000}, {0xc34fc000}, {0xc34fe000}, 
-    {0xc3500000}, {0xc3502000}, {0xc3504000}, {0xc3506000}, 
-    {0xc3508000}, {0xc350a000}, {0xc350c000}, {0xc350e000}, 
-    {0xc3510000}, {0xc3512000}, {0xc3514000}, {0xc3516000}, 
-    {0xc3518000}, {0xc351a000}, {0xc351c000}, {0xc351e000}, 
-    {0xc3520000}, {0xc3522000}, {0xc3524000}, {0xc3526000}, 
-    {0xc3528000}, {0xc352a000}, {0xc352c000}, {0xc352e000}, 
-    {0xc3530000}, {0xc3532000}, {0xc3534000}, {0xc3536000}, 
-    {0xc3538000}, {0xc353a000}, {0xc353c000}, {0xc353e000}, 
-    {0xc3540000}, {0xc3542000}, {0xc3544000}, {0xc3546000}, 
-    {0xc3548000}, {0xc354a000}, {0xc354c000}, {0xc354e000}, 
-    {0xc3550000}, {0xc3552000}, {0xc3554000}, {0xc3556000}, 
-    {0xc3558000}, {0xc355a000}, {0xc355c000}, {0xc355e000}, 
-    {0xc3560000}, {0xc3562000}, {0xc3564000}, {0xc3566000}, 
-    {0xc3568000}, {0xc356a000}, {0xc356c000}, {0xc356e000}, 
-    {0xc3570000}, {0xc3572000}, {0xc3574000}, {0xc3576000}, 
-    {0xc3578000}, {0xc357a000}, {0xc357c000}, {0xc357e000}, 
-    {0xc3580000}, {0xc3582000}, {0xc3584000}, {0xc3586000}, 
-    {0xc3588000}, {0xc358a000}, {0xc358c000}, {0xc358e000}, 
-    {0xc3590000}, {0xc3592000}, {0xc3594000}, {0xc3596000}, 
-    {0xc3598000}, {0xc359a000}, {0xc359c000}, {0xc359e000}, 
-    {0xc35a0000}, {0xc35a2000}, {0xc35a4000}, {0xc35a6000}, 
-    {0xc35a8000}, {0xc35aa000}, {0xc35ac000}, {0xc35ae000}, 
-    {0xc35b0000}, {0xc35b2000}, {0xc35b4000}, {0xc35b6000}, 
-    {0xc35b8000}, {0xc35ba000}, {0xc35bc000}, {0xc35be000}, 
-    {0xc35c0000}, {0xc35c2000}, {0xc35c4000}, {0xc35c6000}, 
-    {0xc35c8000}, {0xc35ca000}, {0xc35cc000}, {0xc35ce000}, 
-    {0xc35d0000}, {0xc35d2000}, {0xc35d4000}, {0xc35d6000}, 
-    {0xc35d8000}, {0xc35da000}, {0xc35dc000}, {0xc35de000}, 
-    {0xc35e0000}, {0xc35e2000}, {0xc35e4000}, {0xc35e6000}, 
-    {0xc35e8000}, {0xc35ea000}, {0xc35ec000}, {0xc35ee000}, 
-    {0xc35f0000}, {0xc35f2000}, {0xc35f4000}, {0xc35f6000}, 
-    {0xc35f8000}, {0xc35fa000}, {0xc35fc000}, {0xc35fe000}, 
-    {0xc3600000}, {0xc3602000}, {0xc3604000}, {0xc3606000}, 
-    {0xc3608000}, {0xc360a000}, {0xc360c000}, {0xc360e000}, 
-    {0xc3610000}, {0xc3612000}, {0xc3614000}, {0xc3616000}, 
-    {0xc3618000}, {0xc361a000}, {0xc361c000}, {0xc361e000}, 
-    {0xc3620000}, {0xc3622000}, {0xc3624000}, {0xc3626000}, 
-    {0xc3628000}, {0xc362a000}, {0xc362c000}, {0xc362e000}, 
-    {0xc3630000}, {0xc3632000}, {0xc3634000}, {0xc3636000}, 
-    {0xc3638000}, {0xc363a000}, {0xc363c000}, {0xc363e000}, 
-    {0xc3640000}, {0xc3642000}, {0xc3644000}, {0xc3646000}, 
-    {0xc3648000}, {0xc364a000}, {0xc364c000}, {0xc364e000}, 
-    {0xc3650000}, {0xc3652000}, {0xc3654000}, {0xc3656000}, 
-    {0xc3658000}, {0xc365a000}, {0xc365c000}, {0xc365e000}, 
-    {0xc3660000}, {0xc3662000}, {0xc3664000}, {0xc3666000}, 
-    {0xc3668000}, {0xc366a000}, {0xc366c000}, {0xc366e000}, 
-    {0xc3670000}, {0xc3672000}, {0xc3674000}, {0xc3676000}, 
-    {0xc3678000}, {0xc367a000}, {0xc367c000}, {0xc367e000}, 
-    {0xc3680000}, {0xc3682000}, {0xc3684000}, {0xc3686000}, 
-    {0xc3688000}, {0xc368a000}, {0xc368c000}, {0xc368e000}, 
-    {0xc3690000}, {0xc3692000}, {0xc3694000}, {0xc3696000}, 
-    {0xc3698000}, {0xc369a000}, {0xc369c000}, {0xc369e000}, 
-    {0xc36a0000}, {0xc36a2000}, {0xc36a4000}, {0xc36a6000}, 
-    {0xc36a8000}, {0xc36aa000}, {0xc36ac000}, {0xc36ae000}, 
-    {0xc36b0000}, {0xc36b2000}, {0xc36b4000}, {0xc36b6000}, 
-    {0xc36b8000}, {0xc36ba000}, {0xc36bc000}, {0xc36be000}, 
-    {0xc36c0000}, {0xc36c2000}, {0xc36c4000}, {0xc36c6000}, 
-    {0xc36c8000}, {0xc36ca000}, {0xc36cc000}, {0xc36ce000}, 
-    {0xc36d0000}, {0xc36d2000}, {0xc36d4000}, {0xc36d6000}, 
-    {0xc36d8000}, {0xc36da000}, {0xc36dc000}, {0xc36de000}, 
-    {0xc36e0000}, {0xc36e2000}, {0xc36e4000}, {0xc36e6000}, 
-    {0xc36e8000}, {0xc36ea000}, {0xc36ec000}, {0xc36ee000}, 
-    {0xc36f0000}, {0xc36f2000}, {0xc36f4000}, {0xc36f6000}, 
-    {0xc36f8000}, {0xc36fa000}, {0xc36fc000}, {0xc36fe000}, 
-    {0xc3700000}, {0xc3702000}, {0xc3704000}, {0xc3706000}, 
-    {0xc3708000}, {0xc370a000}, {0xc370c000}, {0xc370e000}, 
-    {0xc3710000}, {0xc3712000}, {0xc3714000}, {0xc3716000}, 
-    {0xc3718000}, {0xc371a000}, {0xc371c000}, {0xc371e000}, 
-    {0xc3720000}, {0xc3722000}, {0xc3724000}, {0xc3726000}, 
-    {0xc3728000}, {0xc372a000}, {0xc372c000}, {0xc372e000}, 
-    {0xc3730000}, {0xc3732000}, {0xc3734000}, {0xc3736000}, 
-    {0xc3738000}, {0xc373a000}, {0xc373c000}, {0xc373e000}, 
-    {0xc3740000}, {0xc3742000}, {0xc3744000}, {0xc3746000}, 
-    {0xc3748000}, {0xc374a000}, {0xc374c000}, {0xc374e000}, 
-    {0xc3750000}, {0xc3752000}, {0xc3754000}, {0xc3756000}, 
-    {0xc3758000}, {0xc375a000}, {0xc375c000}, {0xc375e000}, 
-    {0xc3760000}, {0xc3762000}, {0xc3764000}, {0xc3766000}, 
-    {0xc3768000}, {0xc376a000}, {0xc376c000}, {0xc376e000}, 
-    {0xc3770000}, {0xc3772000}, {0xc3774000}, {0xc3776000}, 
-    {0xc3778000}, {0xc377a000}, {0xc377c000}, {0xc377e000}, 
-    {0xc3780000}, {0xc3782000}, {0xc3784000}, {0xc3786000}, 
-    {0xc3788000}, {0xc378a000}, {0xc378c000}, {0xc378e000}, 
-    {0xc3790000}, {0xc3792000}, {0xc3794000}, {0xc3796000}, 
-    {0xc3798000}, {0xc379a000}, {0xc379c000}, {0xc379e000}, 
-    {0xc37a0000}, {0xc37a2000}, {0xc37a4000}, {0xc37a6000}, 
-    {0xc37a8000}, {0xc37aa000}, {0xc37ac000}, {0xc37ae000}, 
-    {0xc37b0000}, {0xc37b2000}, {0xc37b4000}, {0xc37b6000}, 
-    {0xc37b8000}, {0xc37ba000}, {0xc37bc000}, {0xc37be000}, 
-    {0xc37c0000}, {0xc37c2000}, {0xc37c4000}, {0xc37c6000}, 
-    {0xc37c8000}, {0xc37ca000}, {0xc37cc000}, {0xc37ce000}, 
-    {0xc37d0000}, {0xc37d2000}, {0xc37d4000}, {0xc37d6000}, 
-    {0xc37d8000}, {0xc37da000}, {0xc37dc000}, {0xc37de000}, 
-    {0xc37e0000}, {0xc37e2000}, {0xc37e4000}, {0xc37e6000}, 
-    {0xc37e8000}, {0xc37ea000}, {0xc37ec000}, {0xc37ee000}, 
-    {0xc37f0000}, {0xc37f2000}, {0xc37f4000}, {0xc37f6000}, 
-    {0xc37f8000}, {0xc37fa000}, {0xc37fc000}, {0xc37fe000}, 
-    {0xc3800000}, {0xc3802000}, {0xc3804000}, {0xc3806000}, 
-    {0xc3808000}, {0xc380a000}, {0xc380c000}, {0xc380e000}, 
-    {0xc3810000}, {0xc3812000}, {0xc3814000}, {0xc3816000}, 
-    {0xc3818000}, {0xc381a000}, {0xc381c000}, {0xc381e000}, 
-    {0xc3820000}, {0xc3822000}, {0xc3824000}, {0xc3826000}, 
-    {0xc3828000}, {0xc382a000}, {0xc382c000}, {0xc382e000}, 
-    {0xc3830000}, {0xc3832000}, {0xc3834000}, {0xc3836000}, 
-    {0xc3838000}, {0xc383a000}, {0xc383c000}, {0xc383e000}, 
-    {0xc3840000}, {0xc3842000}, {0xc3844000}, {0xc3846000}, 
-    {0xc3848000}, {0xc384a000}, {0xc384c000}, {0xc384e000}, 
-    {0xc3850000}, {0xc3852000}, {0xc3854000}, {0xc3856000}, 
-    {0xc3858000}, {0xc385a000}, {0xc385c000}, {0xc385e000}, 
-    {0xc3860000}, {0xc3862000}, {0xc3864000}, {0xc3866000}, 
-    {0xc3868000}, {0xc386a000}, {0xc386c000}, {0xc386e000}, 
-    {0xc3870000}, {0xc3872000}, {0xc3874000}, {0xc3876000}, 
-    {0xc3878000}, {0xc387a000}, {0xc387c000}, {0xc387e000}, 
-    {0xc3880000}, {0xc3882000}, {0xc3884000}, {0xc3886000}, 
-    {0xc3888000}, {0xc388a000}, {0xc388c000}, {0xc388e000}, 
-    {0xc3890000}, {0xc3892000}, {0xc3894000}, {0xc3896000}, 
-    {0xc3898000}, {0xc389a000}, {0xc389c000}, {0xc389e000}, 
-    {0xc38a0000}, {0xc38a2000}, {0xc38a4000}, {0xc38a6000}, 
-    {0xc38a8000}, {0xc38aa000}, {0xc38ac000}, {0xc38ae000}, 
-    {0xc38b0000}, {0xc38b2000}, {0xc38b4000}, {0xc38b6000}, 
-    {0xc38b8000}, {0xc38ba000}, {0xc38bc000}, {0xc38be000}, 
-    {0xc38c0000}, {0xc38c2000}, {0xc38c4000}, {0xc38c6000}, 
-    {0xc38c8000}, {0xc38ca000}, {0xc38cc000}, {0xc38ce000}, 
-    {0xc38d0000}, {0xc38d2000}, {0xc38d4000}, {0xc38d6000}, 
-    {0xc38d8000}, {0xc38da000}, {0xc38dc000}, {0xc38de000}, 
-    {0xc38e0000}, {0xc38e2000}, {0xc38e4000}, {0xc38e6000}, 
-    {0xc38e8000}, {0xc38ea000}, {0xc38ec000}, {0xc38ee000}, 
-    {0xc38f0000}, {0xc38f2000}, {0xc38f4000}, {0xc38f6000}, 
-    {0xc38f8000}, {0xc38fa000}, {0xc38fc000}, {0xc38fe000}, 
-    {0xc3900000}, {0xc3902000}, {0xc3904000}, {0xc3906000}, 
-    {0xc3908000}, {0xc390a000}, {0xc390c000}, {0xc390e000}, 
-    {0xc3910000}, {0xc3912000}, {0xc3914000}, {0xc3916000}, 
-    {0xc3918000}, {0xc391a000}, {0xc391c000}, {0xc391e000}, 
-    {0xc3920000}, {0xc3922000}, {0xc3924000}, {0xc3926000}, 
-    {0xc3928000}, {0xc392a000}, {0xc392c000}, {0xc392e000}, 
-    {0xc3930000}, {0xc3932000}, {0xc3934000}, {0xc3936000}, 
-    {0xc3938000}, {0xc393a000}, {0xc393c000}, {0xc393e000}, 
-    {0xc3940000}, {0xc3942000}, {0xc3944000}, {0xc3946000}, 
-    {0xc3948000}, {0xc394a000}, {0xc394c000}, {0xc394e000}, 
-    {0xc3950000}, {0xc3952000}, {0xc3954000}, {0xc3956000}, 
-    {0xc3958000}, {0xc395a000}, {0xc395c000}, {0xc395e000}, 
-    {0xc3960000}, {0xc3962000}, {0xc3964000}, {0xc3966000}, 
-    {0xc3968000}, {0xc396a000}, {0xc396c000}, {0xc396e000}, 
-    {0xc3970000}, {0xc3972000}, {0xc3974000}, {0xc3976000}, 
-    {0xc3978000}, {0xc397a000}, {0xc397c000}, {0xc397e000}, 
-    {0xc3980000}, {0xc3982000}, {0xc3984000}, {0xc3986000}, 
-    {0xc3988000}, {0xc398a000}, {0xc398c000}, {0xc398e000}, 
-    {0xc3990000}, {0xc3992000}, {0xc3994000}, {0xc3996000}, 
-    {0xc3998000}, {0xc399a000}, {0xc399c000}, {0xc399e000}, 
-    {0xc39a0000}, {0xc39a2000}, {0xc39a4000}, {0xc39a6000}, 
-    {0xc39a8000}, {0xc39aa000}, {0xc39ac000}, {0xc39ae000}, 
-    {0xc39b0000}, {0xc39b2000}, {0xc39b4000}, {0xc39b6000}, 
-    {0xc39b8000}, {0xc39ba000}, {0xc39bc000}, {0xc39be000}, 
-    {0xc39c0000}, {0xc39c2000}, {0xc39c4000}, {0xc39c6000}, 
-    {0xc39c8000}, {0xc39ca000}, {0xc39cc000}, {0xc39ce000}, 
-    {0xc39d0000}, {0xc39d2000}, {0xc39d4000}, {0xc39d6000}, 
-    {0xc39d8000}, {0xc39da000}, {0xc39dc000}, {0xc39de000}, 
-    {0xc39e0000}, {0xc39e2000}, {0xc39e4000}, {0xc39e6000}, 
-    {0xc39e8000}, {0xc39ea000}, {0xc39ec000}, {0xc39ee000}, 
-    {0xc39f0000}, {0xc39f2000}, {0xc39f4000}, {0xc39f6000}, 
-    {0xc39f8000}, {0xc39fa000}, {0xc39fc000}, {0xc39fe000}, 
-    {0xc3a00000}, {0xc3a02000}, {0xc3a04000}, {0xc3a06000}, 
-    {0xc3a08000}, {0xc3a0a000}, {0xc3a0c000}, {0xc3a0e000}, 
-    {0xc3a10000}, {0xc3a12000}, {0xc3a14000}, {0xc3a16000}, 
-    {0xc3a18000}, {0xc3a1a000}, {0xc3a1c000}, {0xc3a1e000}, 
-    {0xc3a20000}, {0xc3a22000}, {0xc3a24000}, {0xc3a26000}, 
-    {0xc3a28000}, {0xc3a2a000}, {0xc3a2c000}, {0xc3a2e000}, 
-    {0xc3a30000}, {0xc3a32000}, {0xc3a34000}, {0xc3a36000}, 
-    {0xc3a38000}, {0xc3a3a000}, {0xc3a3c000}, {0xc3a3e000}, 
-    {0xc3a40000}, {0xc3a42000}, {0xc3a44000}, {0xc3a46000}, 
-    {0xc3a48000}, {0xc3a4a000}, {0xc3a4c000}, {0xc3a4e000}, 
-    {0xc3a50000}, {0xc3a52000}, {0xc3a54000}, {0xc3a56000}, 
-    {0xc3a58000}, {0xc3a5a000}, {0xc3a5c000}, {0xc3a5e000}, 
-    {0xc3a60000}, {0xc3a62000}, {0xc3a64000}, {0xc3a66000}, 
-    {0xc3a68000}, {0xc3a6a000}, {0xc3a6c000}, {0xc3a6e000}, 
-    {0xc3a70000}, {0xc3a72000}, {0xc3a74000}, {0xc3a76000}, 
-    {0xc3a78000}, {0xc3a7a000}, {0xc3a7c000}, {0xc3a7e000}, 
-    {0xc3a80000}, {0xc3a82000}, {0xc3a84000}, {0xc3a86000}, 
-    {0xc3a88000}, {0xc3a8a000}, {0xc3a8c000}, {0xc3a8e000}, 
-    {0xc3a90000}, {0xc3a92000}, {0xc3a94000}, {0xc3a96000}, 
-    {0xc3a98000}, {0xc3a9a000}, {0xc3a9c000}, {0xc3a9e000}, 
-    {0xc3aa0000}, {0xc3aa2000}, {0xc3aa4000}, {0xc3aa6000}, 
-    {0xc3aa8000}, {0xc3aaa000}, {0xc3aac000}, {0xc3aae000}, 
-    {0xc3ab0000}, {0xc3ab2000}, {0xc3ab4000}, {0xc3ab6000}, 
-    {0xc3ab8000}, {0xc3aba000}, {0xc3abc000}, {0xc3abe000}, 
-    {0xc3ac0000}, {0xc3ac2000}, {0xc3ac4000}, {0xc3ac6000}, 
-    {0xc3ac8000}, {0xc3aca000}, {0xc3acc000}, {0xc3ace000}, 
-    {0xc3ad0000}, {0xc3ad2000}, {0xc3ad4000}, {0xc3ad6000}, 
-    {0xc3ad8000}, {0xc3ada000}, {0xc3adc000}, {0xc3ade000}, 
-    {0xc3ae0000}, {0xc3ae2000}, {0xc3ae4000}, {0xc3ae6000}, 
-    {0xc3ae8000}, {0xc3aea000}, {0xc3aec000}, {0xc3aee000}, 
-    {0xc3af0000}, {0xc3af2000}, {0xc3af4000}, {0xc3af6000}, 
-    {0xc3af8000}, {0xc3afa000}, {0xc3afc000}, {0xc3afe000}, 
-    {0xc3b00000}, {0xc3b02000}, {0xc3b04000}, {0xc3b06000}, 
-    {0xc3b08000}, {0xc3b0a000}, {0xc3b0c000}, {0xc3b0e000}, 
-    {0xc3b10000}, {0xc3b12000}, {0xc3b14000}, {0xc3b16000}, 
-    {0xc3b18000}, {0xc3b1a000}, {0xc3b1c000}, {0xc3b1e000}, 
-    {0xc3b20000}, {0xc3b22000}, {0xc3b24000}, {0xc3b26000}, 
-    {0xc3b28000}, {0xc3b2a000}, {0xc3b2c000}, {0xc3b2e000}, 
-    {0xc3b30000}, {0xc3b32000}, {0xc3b34000}, {0xc3b36000}, 
-    {0xc3b38000}, {0xc3b3a000}, {0xc3b3c000}, {0xc3b3e000}, 
-    {0xc3b40000}, {0xc3b42000}, {0xc3b44000}, {0xc3b46000}, 
-    {0xc3b48000}, {0xc3b4a000}, {0xc3b4c000}, {0xc3b4e000}, 
-    {0xc3b50000}, {0xc3b52000}, {0xc3b54000}, {0xc3b56000}, 
-    {0xc3b58000}, {0xc3b5a000}, {0xc3b5c000}, {0xc3b5e000}, 
-    {0xc3b60000}, {0xc3b62000}, {0xc3b64000}, {0xc3b66000}, 
-    {0xc3b68000}, {0xc3b6a000}, {0xc3b6c000}, {0xc3b6e000}, 
-    {0xc3b70000}, {0xc3b72000}, {0xc3b74000}, {0xc3b76000}, 
-    {0xc3b78000}, {0xc3b7a000}, {0xc3b7c000}, {0xc3b7e000}, 
-    {0xc3b80000}, {0xc3b82000}, {0xc3b84000}, {0xc3b86000}, 
-    {0xc3b88000}, {0xc3b8a000}, {0xc3b8c000}, {0xc3b8e000}, 
-    {0xc3b90000}, {0xc3b92000}, {0xc3b94000}, {0xc3b96000}, 
-    {0xc3b98000}, {0xc3b9a000}, {0xc3b9c000}, {0xc3b9e000}, 
-    {0xc3ba0000}, {0xc3ba2000}, {0xc3ba4000}, {0xc3ba6000}, 
-    {0xc3ba8000}, {0xc3baa000}, {0xc3bac000}, {0xc3bae000}, 
-    {0xc3bb0000}, {0xc3bb2000}, {0xc3bb4000}, {0xc3bb6000}, 
-    {0xc3bb8000}, {0xc3bba000}, {0xc3bbc000}, {0xc3bbe000}, 
-    {0xc3bc0000}, {0xc3bc2000}, {0xc3bc4000}, {0xc3bc6000}, 
-    {0xc3bc8000}, {0xc3bca000}, {0xc3bcc000}, {0xc3bce000}, 
-    {0xc3bd0000}, {0xc3bd2000}, {0xc3bd4000}, {0xc3bd6000}, 
-    {0xc3bd8000}, {0xc3bda000}, {0xc3bdc000}, {0xc3bde000}, 
-    {0xc3be0000}, {0xc3be2000}, {0xc3be4000}, {0xc3be6000}, 
-    {0xc3be8000}, {0xc3bea000}, {0xc3bec000}, {0xc3bee000}, 
-    {0xc3bf0000}, {0xc3bf2000}, {0xc3bf4000}, {0xc3bf6000}, 
-    {0xc3bf8000}, {0xc3bfa000}, {0xc3bfc000}, {0xc3bfe000}, 
-    {0xc3c00000}, {0xc3c02000}, {0xc3c04000}, {0xc3c06000}, 
-    {0xc3c08000}, {0xc3c0a000}, {0xc3c0c000}, {0xc3c0e000}, 
-    {0xc3c10000}, {0xc3c12000}, {0xc3c14000}, {0xc3c16000}, 
-    {0xc3c18000}, {0xc3c1a000}, {0xc3c1c000}, {0xc3c1e000}, 
-    {0xc3c20000}, {0xc3c22000}, {0xc3c24000}, {0xc3c26000}, 
-    {0xc3c28000}, {0xc3c2a000}, {0xc3c2c000}, {0xc3c2e000}, 
-    {0xc3c30000}, {0xc3c32000}, {0xc3c34000}, {0xc3c36000}, 
-    {0xc3c38000}, {0xc3c3a000}, {0xc3c3c000}, {0xc3c3e000}, 
-    {0xc3c40000}, {0xc3c42000}, {0xc3c44000}, {0xc3c46000}, 
-    {0xc3c48000}, {0xc3c4a000}, {0xc3c4c000}, {0xc3c4e000}, 
-    {0xc3c50000}, {0xc3c52000}, {0xc3c54000}, {0xc3c56000}, 
-    {0xc3c58000}, {0xc3c5a000}, {0xc3c5c000}, {0xc3c5e000}, 
-    {0xc3c60000}, {0xc3c62000}, {0xc3c64000}, {0xc3c66000}, 
-    {0xc3c68000}, {0xc3c6a000}, {0xc3c6c000}, {0xc3c6e000}, 
-    {0xc3c70000}, {0xc3c72000}, {0xc3c74000}, {0xc3c76000}, 
-    {0xc3c78000}, {0xc3c7a000}, {0xc3c7c000}, {0xc3c7e000}, 
-    {0xc3c80000}, {0xc3c82000}, {0xc3c84000}, {0xc3c86000}, 
-    {0xc3c88000}, {0xc3c8a000}, {0xc3c8c000}, {0xc3c8e000}, 
-    {0xc3c90000}, {0xc3c92000}, {0xc3c94000}, {0xc3c96000}, 
-    {0xc3c98000}, {0xc3c9a000}, {0xc3c9c000}, {0xc3c9e000}, 
-    {0xc3ca0000}, {0xc3ca2000}, {0xc3ca4000}, {0xc3ca6000}, 
-    {0xc3ca8000}, {0xc3caa000}, {0xc3cac000}, {0xc3cae000}, 
-    {0xc3cb0000}, {0xc3cb2000}, {0xc3cb4000}, {0xc3cb6000}, 
-    {0xc3cb8000}, {0xc3cba000}, {0xc3cbc000}, {0xc3cbe000}, 
-    {0xc3cc0000}, {0xc3cc2000}, {0xc3cc4000}, {0xc3cc6000}, 
-    {0xc3cc8000}, {0xc3cca000}, {0xc3ccc000}, {0xc3cce000}, 
-    {0xc3cd0000}, {0xc3cd2000}, {0xc3cd4000}, {0xc3cd6000}, 
-    {0xc3cd8000}, {0xc3cda000}, {0xc3cdc000}, {0xc3cde000}, 
-    {0xc3ce0000}, {0xc3ce2000}, {0xc3ce4000}, {0xc3ce6000}, 
-    {0xc3ce8000}, {0xc3cea000}, {0xc3cec000}, {0xc3cee000}, 
-    {0xc3cf0000}, {0xc3cf2000}, {0xc3cf4000}, {0xc3cf6000}, 
-    {0xc3cf8000}, {0xc3cfa000}, {0xc3cfc000}, {0xc3cfe000}, 
-    {0xc3d00000}, {0xc3d02000}, {0xc3d04000}, {0xc3d06000}, 
-    {0xc3d08000}, {0xc3d0a000}, {0xc3d0c000}, {0xc3d0e000}, 
-    {0xc3d10000}, {0xc3d12000}, {0xc3d14000}, {0xc3d16000}, 
-    {0xc3d18000}, {0xc3d1a000}, {0xc3d1c000}, {0xc3d1e000}, 
-    {0xc3d20000}, {0xc3d22000}, {0xc3d24000}, {0xc3d26000}, 
-    {0xc3d28000}, {0xc3d2a000}, {0xc3d2c000}, {0xc3d2e000}, 
-    {0xc3d30000}, {0xc3d32000}, {0xc3d34000}, {0xc3d36000}, 
-    {0xc3d38000}, {0xc3d3a000}, {0xc3d3c000}, {0xc3d3e000}, 
-    {0xc3d40000}, {0xc3d42000}, {0xc3d44000}, {0xc3d46000}, 
-    {0xc3d48000}, {0xc3d4a000}, {0xc3d4c000}, {0xc3d4e000}, 
-    {0xc3d50000}, {0xc3d52000}, {0xc3d54000}, {0xc3d56000}, 
-    {0xc3d58000}, {0xc3d5a000}, {0xc3d5c000}, {0xc3d5e000}, 
-    {0xc3d60000}, {0xc3d62000}, {0xc3d64000}, {0xc3d66000}, 
-    {0xc3d68000}, {0xc3d6a000}, {0xc3d6c000}, {0xc3d6e000}, 
-    {0xc3d70000}, {0xc3d72000}, {0xc3d74000}, {0xc3d76000}, 
-    {0xc3d78000}, {0xc3d7a000}, {0xc3d7c000}, {0xc3d7e000}, 
-    {0xc3d80000}, {0xc3d82000}, {0xc3d84000}, {0xc3d86000}, 
-    {0xc3d88000}, {0xc3d8a000}, {0xc3d8c000}, {0xc3d8e000}, 
-    {0xc3d90000}, {0xc3d92000}, {0xc3d94000}, {0xc3d96000}, 
-    {0xc3d98000}, {0xc3d9a000}, {0xc3d9c000}, {0xc3d9e000}, 
-    {0xc3da0000}, {0xc3da2000}, {0xc3da4000}, {0xc3da6000}, 
-    {0xc3da8000}, {0xc3daa000}, {0xc3dac000}, {0xc3dae000}, 
-    {0xc3db0000}, {0xc3db2000}, {0xc3db4000}, {0xc3db6000}, 
-    {0xc3db8000}, {0xc3dba000}, {0xc3dbc000}, {0xc3dbe000}, 
-    {0xc3dc0000}, {0xc3dc2000}, {0xc3dc4000}, {0xc3dc6000}, 
-    {0xc3dc8000}, {0xc3dca000}, {0xc3dcc000}, {0xc3dce000}, 
-    {0xc3dd0000}, {0xc3dd2000}, {0xc3dd4000}, {0xc3dd6000}, 
-    {0xc3dd8000}, {0xc3dda000}, {0xc3ddc000}, {0xc3dde000}, 
-    {0xc3de0000}, {0xc3de2000}, {0xc3de4000}, {0xc3de6000}, 
-    {0xc3de8000}, {0xc3dea000}, {0xc3dec000}, {0xc3dee000}, 
-    {0xc3df0000}, {0xc3df2000}, {0xc3df4000}, {0xc3df6000}, 
-    {0xc3df8000}, {0xc3dfa000}, {0xc3dfc000}, {0xc3dfe000}, 
-    {0xc3e00000}, {0xc3e02000}, {0xc3e04000}, {0xc3e06000}, 
-    {0xc3e08000}, {0xc3e0a000}, {0xc3e0c000}, {0xc3e0e000}, 
-    {0xc3e10000}, {0xc3e12000}, {0xc3e14000}, {0xc3e16000}, 
-    {0xc3e18000}, {0xc3e1a000}, {0xc3e1c000}, {0xc3e1e000}, 
-    {0xc3e20000}, {0xc3e22000}, {0xc3e24000}, {0xc3e26000}, 
-    {0xc3e28000}, {0xc3e2a000}, {0xc3e2c000}, {0xc3e2e000}, 
-    {0xc3e30000}, {0xc3e32000}, {0xc3e34000}, {0xc3e36000}, 
-    {0xc3e38000}, {0xc3e3a000}, {0xc3e3c000}, {0xc3e3e000}, 
-    {0xc3e40000}, {0xc3e42000}, {0xc3e44000}, {0xc3e46000}, 
-    {0xc3e48000}, {0xc3e4a000}, {0xc3e4c000}, {0xc3e4e000}, 
-    {0xc3e50000}, {0xc3e52000}, {0xc3e54000}, {0xc3e56000}, 
-    {0xc3e58000}, {0xc3e5a000}, {0xc3e5c000}, {0xc3e5e000}, 
-    {0xc3e60000}, {0xc3e62000}, {0xc3e64000}, {0xc3e66000}, 
-    {0xc3e68000}, {0xc3e6a000}, {0xc3e6c000}, {0xc3e6e000}, 
-    {0xc3e70000}, {0xc3e72000}, {0xc3e74000}, {0xc3e76000}, 
-    {0xc3e78000}, {0xc3e7a000}, {0xc3e7c000}, {0xc3e7e000}, 
-    {0xc3e80000}, {0xc3e82000}, {0xc3e84000}, {0xc3e86000}, 
-    {0xc3e88000}, {0xc3e8a000}, {0xc3e8c000}, {0xc3e8e000}, 
-    {0xc3e90000}, {0xc3e92000}, {0xc3e94000}, {0xc3e96000}, 
-    {0xc3e98000}, {0xc3e9a000}, {0xc3e9c000}, {0xc3e9e000}, 
-    {0xc3ea0000}, {0xc3ea2000}, {0xc3ea4000}, {0xc3ea6000}, 
-    {0xc3ea8000}, {0xc3eaa000}, {0xc3eac000}, {0xc3eae000}, 
-    {0xc3eb0000}, {0xc3eb2000}, {0xc3eb4000}, {0xc3eb6000}, 
-    {0xc3eb8000}, {0xc3eba000}, {0xc3ebc000}, {0xc3ebe000}, 
-    {0xc3ec0000}, {0xc3ec2000}, {0xc3ec4000}, {0xc3ec6000}, 
-    {0xc3ec8000}, {0xc3eca000}, {0xc3ecc000}, {0xc3ece000}, 
-    {0xc3ed0000}, {0xc3ed2000}, {0xc3ed4000}, {0xc3ed6000}, 
-    {0xc3ed8000}, {0xc3eda000}, {0xc3edc000}, {0xc3ede000}, 
-    {0xc3ee0000}, {0xc3ee2000}, {0xc3ee4000}, {0xc3ee6000}, 
-    {0xc3ee8000}, {0xc3eea000}, {0xc3eec000}, {0xc3eee000}, 
-    {0xc3ef0000}, {0xc3ef2000}, {0xc3ef4000}, {0xc3ef6000}, 
-    {0xc3ef8000}, {0xc3efa000}, {0xc3efc000}, {0xc3efe000}, 
-    {0xc3f00000}, {0xc3f02000}, {0xc3f04000}, {0xc3f06000}, 
-    {0xc3f08000}, {0xc3f0a000}, {0xc3f0c000}, {0xc3f0e000}, 
-    {0xc3f10000}, {0xc3f12000}, {0xc3f14000}, {0xc3f16000}, 
-    {0xc3f18000}, {0xc3f1a000}, {0xc3f1c000}, {0xc3f1e000}, 
-    {0xc3f20000}, {0xc3f22000}, {0xc3f24000}, {0xc3f26000}, 
-    {0xc3f28000}, {0xc3f2a000}, {0xc3f2c000}, {0xc3f2e000}, 
-    {0xc3f30000}, {0xc3f32000}, {0xc3f34000}, {0xc3f36000}, 
-    {0xc3f38000}, {0xc3f3a000}, {0xc3f3c000}, {0xc3f3e000}, 
-    {0xc3f40000}, {0xc3f42000}, {0xc3f44000}, {0xc3f46000}, 
-    {0xc3f48000}, {0xc3f4a000}, {0xc3f4c000}, {0xc3f4e000}, 
-    {0xc3f50000}, {0xc3f52000}, {0xc3f54000}, {0xc3f56000}, 
-    {0xc3f58000}, {0xc3f5a000}, {0xc3f5c000}, {0xc3f5e000}, 
-    {0xc3f60000}, {0xc3f62000}, {0xc3f64000}, {0xc3f66000}, 
-    {0xc3f68000}, {0xc3f6a000}, {0xc3f6c000}, {0xc3f6e000}, 
-    {0xc3f70000}, {0xc3f72000}, {0xc3f74000}, {0xc3f76000}, 
-    {0xc3f78000}, {0xc3f7a000}, {0xc3f7c000}, {0xc3f7e000}, 
-    {0xc3f80000}, {0xc3f82000}, {0xc3f84000}, {0xc3f86000}, 
-    {0xc3f88000}, {0xc3f8a000}, {0xc3f8c000}, {0xc3f8e000}, 
-    {0xc3f90000}, {0xc3f92000}, {0xc3f94000}, {0xc3f96000}, 
-    {0xc3f98000}, {0xc3f9a000}, {0xc3f9c000}, {0xc3f9e000}, 
-    {0xc3fa0000}, {0xc3fa2000}, {0xc3fa4000}, {0xc3fa6000}, 
-    {0xc3fa8000}, {0xc3faa000}, {0xc3fac000}, {0xc3fae000}, 
-    {0xc3fb0000}, {0xc3fb2000}, {0xc3fb4000}, {0xc3fb6000}, 
-    {0xc3fb8000}, {0xc3fba000}, {0xc3fbc000}, {0xc3fbe000}, 
-    {0xc3fc0000}, {0xc3fc2000}, {0xc3fc4000}, {0xc3fc6000}, 
-    {0xc3fc8000}, {0xc3fca000}, {0xc3fcc000}, {0xc3fce000}, 
-    {0xc3fd0000}, {0xc3fd2000}, {0xc3fd4000}, {0xc3fd6000}, 
-    {0xc3fd8000}, {0xc3fda000}, {0xc3fdc000}, {0xc3fde000}, 
-    {0xc3fe0000}, {0xc3fe2000}, {0xc3fe4000}, {0xc3fe6000}, 
-    {0xc3fe8000}, {0xc3fea000}, {0xc3fec000}, {0xc3fee000}, 
-    {0xc3ff0000}, {0xc3ff2000}, {0xc3ff4000}, {0xc3ff6000}, 
-    {0xc3ff8000}, {0xc3ffa000}, {0xc3ffc000}, {0xc3ffe000}, 
-    {0xc4000000}, {0xc4002000}, {0xc4004000}, {0xc4006000}, 
-    {0xc4008000}, {0xc400a000}, {0xc400c000}, {0xc400e000}, 
-    {0xc4010000}, {0xc4012000}, {0xc4014000}, {0xc4016000}, 
-    {0xc4018000}, {0xc401a000}, {0xc401c000}, {0xc401e000}, 
-    {0xc4020000}, {0xc4022000}, {0xc4024000}, {0xc4026000}, 
-    {0xc4028000}, {0xc402a000}, {0xc402c000}, {0xc402e000}, 
-    {0xc4030000}, {0xc4032000}, {0xc4034000}, {0xc4036000}, 
-    {0xc4038000}, {0xc403a000}, {0xc403c000}, {0xc403e000}, 
-    {0xc4040000}, {0xc4042000}, {0xc4044000}, {0xc4046000}, 
-    {0xc4048000}, {0xc404a000}, {0xc404c000}, {0xc404e000}, 
-    {0xc4050000}, {0xc4052000}, {0xc4054000}, {0xc4056000}, 
-    {0xc4058000}, {0xc405a000}, {0xc405c000}, {0xc405e000}, 
-    {0xc4060000}, {0xc4062000}, {0xc4064000}, {0xc4066000}, 
-    {0xc4068000}, {0xc406a000}, {0xc406c000}, {0xc406e000}, 
-    {0xc4070000}, {0xc4072000}, {0xc4074000}, {0xc4076000}, 
-    {0xc4078000}, {0xc407a000}, {0xc407c000}, {0xc407e000}, 
-    {0xc4080000}, {0xc4082000}, {0xc4084000}, {0xc4086000}, 
-    {0xc4088000}, {0xc408a000}, {0xc408c000}, {0xc408e000}, 
-    {0xc4090000}, {0xc4092000}, {0xc4094000}, {0xc4096000}, 
-    {0xc4098000}, {0xc409a000}, {0xc409c000}, {0xc409e000}, 
-    {0xc40a0000}, {0xc40a2000}, {0xc40a4000}, {0xc40a6000}, 
-    {0xc40a8000}, {0xc40aa000}, {0xc40ac000}, {0xc40ae000}, 
-    {0xc40b0000}, {0xc40b2000}, {0xc40b4000}, {0xc40b6000}, 
-    {0xc40b8000}, {0xc40ba000}, {0xc40bc000}, {0xc40be000}, 
-    {0xc40c0000}, {0xc40c2000}, {0xc40c4000}, {0xc40c6000}, 
-    {0xc40c8000}, {0xc40ca000}, {0xc40cc000}, {0xc40ce000}, 
-    {0xc40d0000}, {0xc40d2000}, {0xc40d4000}, {0xc40d6000}, 
-    {0xc40d8000}, {0xc40da000}, {0xc40dc000}, {0xc40de000}, 
-    {0xc40e0000}, {0xc40e2000}, {0xc40e4000}, {0xc40e6000}, 
-    {0xc40e8000}, {0xc40ea000}, {0xc40ec000}, {0xc40ee000}, 
-    {0xc40f0000}, {0xc40f2000}, {0xc40f4000}, {0xc40f6000}, 
-    {0xc40f8000}, {0xc40fa000}, {0xc40fc000}, {0xc40fe000}, 
-    {0xc4100000}, {0xc4102000}, {0xc4104000}, {0xc4106000}, 
-    {0xc4108000}, {0xc410a000}, {0xc410c000}, {0xc410e000}, 
-    {0xc4110000}, {0xc4112000}, {0xc4114000}, {0xc4116000}, 
-    {0xc4118000}, {0xc411a000}, {0xc411c000}, {0xc411e000}, 
-    {0xc4120000}, {0xc4122000}, {0xc4124000}, {0xc4126000}, 
-    {0xc4128000}, {0xc412a000}, {0xc412c000}, {0xc412e000}, 
-    {0xc4130000}, {0xc4132000}, {0xc4134000}, {0xc4136000}, 
-    {0xc4138000}, {0xc413a000}, {0xc413c000}, {0xc413e000}, 
-    {0xc4140000}, {0xc4142000}, {0xc4144000}, {0xc4146000}, 
-    {0xc4148000}, {0xc414a000}, {0xc414c000}, {0xc414e000}, 
-    {0xc4150000}, {0xc4152000}, {0xc4154000}, {0xc4156000}, 
-    {0xc4158000}, {0xc415a000}, {0xc415c000}, {0xc415e000}, 
-    {0xc4160000}, {0xc4162000}, {0xc4164000}, {0xc4166000}, 
-    {0xc4168000}, {0xc416a000}, {0xc416c000}, {0xc416e000}, 
-    {0xc4170000}, {0xc4172000}, {0xc4174000}, {0xc4176000}, 
-    {0xc4178000}, {0xc417a000}, {0xc417c000}, {0xc417e000}, 
-    {0xc4180000}, {0xc4182000}, {0xc4184000}, {0xc4186000}, 
-    {0xc4188000}, {0xc418a000}, {0xc418c000}, {0xc418e000}, 
-    {0xc4190000}, {0xc4192000}, {0xc4194000}, {0xc4196000}, 
-    {0xc4198000}, {0xc419a000}, {0xc419c000}, {0xc419e000}, 
-    {0xc41a0000}, {0xc41a2000}, {0xc41a4000}, {0xc41a6000}, 
-    {0xc41a8000}, {0xc41aa000}, {0xc41ac000}, {0xc41ae000}, 
-    {0xc41b0000}, {0xc41b2000}, {0xc41b4000}, {0xc41b6000}, 
-    {0xc41b8000}, {0xc41ba000}, {0xc41bc000}, {0xc41be000}, 
-    {0xc41c0000}, {0xc41c2000}, {0xc41c4000}, {0xc41c6000}, 
-    {0xc41c8000}, {0xc41ca000}, {0xc41cc000}, {0xc41ce000}, 
-    {0xc41d0000}, {0xc41d2000}, {0xc41d4000}, {0xc41d6000}, 
-    {0xc41d8000}, {0xc41da000}, {0xc41dc000}, {0xc41de000}, 
-    {0xc41e0000}, {0xc41e2000}, {0xc41e4000}, {0xc41e6000}, 
-    {0xc41e8000}, {0xc41ea000}, {0xc41ec000}, {0xc41ee000}, 
-    {0xc41f0000}, {0xc41f2000}, {0xc41f4000}, {0xc41f6000}, 
-    {0xc41f8000}, {0xc41fa000}, {0xc41fc000}, {0xc41fe000}, 
-    {0xc4200000}, {0xc4202000}, {0xc4204000}, {0xc4206000}, 
-    {0xc4208000}, {0xc420a000}, {0xc420c000}, {0xc420e000}, 
-    {0xc4210000}, {0xc4212000}, {0xc4214000}, {0xc4216000}, 
-    {0xc4218000}, {0xc421a000}, {0xc421c000}, {0xc421e000}, 
-    {0xc4220000}, {0xc4222000}, {0xc4224000}, {0xc4226000}, 
-    {0xc4228000}, {0xc422a000}, {0xc422c000}, {0xc422e000}, 
-    {0xc4230000}, {0xc4232000}, {0xc4234000}, {0xc4236000}, 
-    {0xc4238000}, {0xc423a000}, {0xc423c000}, {0xc423e000}, 
-    {0xc4240000}, {0xc4242000}, {0xc4244000}, {0xc4246000}, 
-    {0xc4248000}, {0xc424a000}, {0xc424c000}, {0xc424e000}, 
-    {0xc4250000}, {0xc4252000}, {0xc4254000}, {0xc4256000}, 
-    {0xc4258000}, {0xc425a000}, {0xc425c000}, {0xc425e000}, 
-    {0xc4260000}, {0xc4262000}, {0xc4264000}, {0xc4266000}, 
-    {0xc4268000}, {0xc426a000}, {0xc426c000}, {0xc426e000}, 
-    {0xc4270000}, {0xc4272000}, {0xc4274000}, {0xc4276000}, 
-    {0xc4278000}, {0xc427a000}, {0xc427c000}, {0xc427e000}, 
-    {0xc4280000}, {0xc4282000}, {0xc4284000}, {0xc4286000}, 
-    {0xc4288000}, {0xc428a000}, {0xc428c000}, {0xc428e000}, 
-    {0xc4290000}, {0xc4292000}, {0xc4294000}, {0xc4296000}, 
-    {0xc4298000}, {0xc429a000}, {0xc429c000}, {0xc429e000}, 
-    {0xc42a0000}, {0xc42a2000}, {0xc42a4000}, {0xc42a6000}, 
-    {0xc42a8000}, {0xc42aa000}, {0xc42ac000}, {0xc42ae000}, 
-    {0xc42b0000}, {0xc42b2000}, {0xc42b4000}, {0xc42b6000}, 
-    {0xc42b8000}, {0xc42ba000}, {0xc42bc000}, {0xc42be000}, 
-    {0xc42c0000}, {0xc42c2000}, {0xc42c4000}, {0xc42c6000}, 
-    {0xc42c8000}, {0xc42ca000}, {0xc42cc000}, {0xc42ce000}, 
-    {0xc42d0000}, {0xc42d2000}, {0xc42d4000}, {0xc42d6000}, 
-    {0xc42d8000}, {0xc42da000}, {0xc42dc000}, {0xc42de000}, 
-    {0xc42e0000}, {0xc42e2000}, {0xc42e4000}, {0xc42e6000}, 
-    {0xc42e8000}, {0xc42ea000}, {0xc42ec000}, {0xc42ee000}, 
-    {0xc42f0000}, {0xc42f2000}, {0xc42f4000}, {0xc42f6000}, 
-    {0xc42f8000}, {0xc42fa000}, {0xc42fc000}, {0xc42fe000}, 
-    {0xc4300000}, {0xc4302000}, {0xc4304000}, {0xc4306000}, 
-    {0xc4308000}, {0xc430a000}, {0xc430c000}, {0xc430e000}, 
-    {0xc4310000}, {0xc4312000}, {0xc4314000}, {0xc4316000}, 
-    {0xc4318000}, {0xc431a000}, {0xc431c000}, {0xc431e000}, 
-    {0xc4320000}, {0xc4322000}, {0xc4324000}, {0xc4326000}, 
-    {0xc4328000}, {0xc432a000}, {0xc432c000}, {0xc432e000}, 
-    {0xc4330000}, {0xc4332000}, {0xc4334000}, {0xc4336000}, 
-    {0xc4338000}, {0xc433a000}, {0xc433c000}, {0xc433e000}, 
-    {0xc4340000}, {0xc4342000}, {0xc4344000}, {0xc4346000}, 
-    {0xc4348000}, {0xc434a000}, {0xc434c000}, {0xc434e000}, 
-    {0xc4350000}, {0xc4352000}, {0xc4354000}, {0xc4356000}, 
-    {0xc4358000}, {0xc435a000}, {0xc435c000}, {0xc435e000}, 
-    {0xc4360000}, {0xc4362000}, {0xc4364000}, {0xc4366000}, 
-    {0xc4368000}, {0xc436a000}, {0xc436c000}, {0xc436e000}, 
-    {0xc4370000}, {0xc4372000}, {0xc4374000}, {0xc4376000}, 
-    {0xc4378000}, {0xc437a000}, {0xc437c000}, {0xc437e000}, 
-    {0xc4380000}, {0xc4382000}, {0xc4384000}, {0xc4386000}, 
-    {0xc4388000}, {0xc438a000}, {0xc438c000}, {0xc438e000}, 
-    {0xc4390000}, {0xc4392000}, {0xc4394000}, {0xc4396000}, 
-    {0xc4398000}, {0xc439a000}, {0xc439c000}, {0xc439e000}, 
-    {0xc43a0000}, {0xc43a2000}, {0xc43a4000}, {0xc43a6000}, 
-    {0xc43a8000}, {0xc43aa000}, {0xc43ac000}, {0xc43ae000}, 
-    {0xc43b0000}, {0xc43b2000}, {0xc43b4000}, {0xc43b6000}, 
-    {0xc43b8000}, {0xc43ba000}, {0xc43bc000}, {0xc43be000}, 
-    {0xc43c0000}, {0xc43c2000}, {0xc43c4000}, {0xc43c6000}, 
-    {0xc43c8000}, {0xc43ca000}, {0xc43cc000}, {0xc43ce000}, 
-    {0xc43d0000}, {0xc43d2000}, {0xc43d4000}, {0xc43d6000}, 
-    {0xc43d8000}, {0xc43da000}, {0xc43dc000}, {0xc43de000}, 
-    {0xc43e0000}, {0xc43e2000}, {0xc43e4000}, {0xc43e6000}, 
-    {0xc43e8000}, {0xc43ea000}, {0xc43ec000}, {0xc43ee000}, 
-    {0xc43f0000}, {0xc43f2000}, {0xc43f4000}, {0xc43f6000}, 
-    {0xc43f8000}, {0xc43fa000}, {0xc43fc000}, {0xc43fe000}, 
-    {0xc4400000}, {0xc4402000}, {0xc4404000}, {0xc4406000}, 
-    {0xc4408000}, {0xc440a000}, {0xc440c000}, {0xc440e000}, 
-    {0xc4410000}, {0xc4412000}, {0xc4414000}, {0xc4416000}, 
-    {0xc4418000}, {0xc441a000}, {0xc441c000}, {0xc441e000}, 
-    {0xc4420000}, {0xc4422000}, {0xc4424000}, {0xc4426000}, 
-    {0xc4428000}, {0xc442a000}, {0xc442c000}, {0xc442e000}, 
-    {0xc4430000}, {0xc4432000}, {0xc4434000}, {0xc4436000}, 
-    {0xc4438000}, {0xc443a000}, {0xc443c000}, {0xc443e000}, 
-    {0xc4440000}, {0xc4442000}, {0xc4444000}, {0xc4446000}, 
-    {0xc4448000}, {0xc444a000}, {0xc444c000}, {0xc444e000}, 
-    {0xc4450000}, {0xc4452000}, {0xc4454000}, {0xc4456000}, 
-    {0xc4458000}, {0xc445a000}, {0xc445c000}, {0xc445e000}, 
-    {0xc4460000}, {0xc4462000}, {0xc4464000}, {0xc4466000}, 
-    {0xc4468000}, {0xc446a000}, {0xc446c000}, {0xc446e000}, 
-    {0xc4470000}, {0xc4472000}, {0xc4474000}, {0xc4476000}, 
-    {0xc4478000}, {0xc447a000}, {0xc447c000}, {0xc447e000}, 
-    {0xc4480000}, {0xc4482000}, {0xc4484000}, {0xc4486000}, 
-    {0xc4488000}, {0xc448a000}, {0xc448c000}, {0xc448e000}, 
-    {0xc4490000}, {0xc4492000}, {0xc4494000}, {0xc4496000}, 
-    {0xc4498000}, {0xc449a000}, {0xc449c000}, {0xc449e000}, 
-    {0xc44a0000}, {0xc44a2000}, {0xc44a4000}, {0xc44a6000}, 
-    {0xc44a8000}, {0xc44aa000}, {0xc44ac000}, {0xc44ae000}, 
-    {0xc44b0000}, {0xc44b2000}, {0xc44b4000}, {0xc44b6000}, 
-    {0xc44b8000}, {0xc44ba000}, {0xc44bc000}, {0xc44be000}, 
-    {0xc44c0000}, {0xc44c2000}, {0xc44c4000}, {0xc44c6000}, 
-    {0xc44c8000}, {0xc44ca000}, {0xc44cc000}, {0xc44ce000}, 
-    {0xc44d0000}, {0xc44d2000}, {0xc44d4000}, {0xc44d6000}, 
-    {0xc44d8000}, {0xc44da000}, {0xc44dc000}, {0xc44de000}, 
-    {0xc44e0000}, {0xc44e2000}, {0xc44e4000}, {0xc44e6000}, 
-    {0xc44e8000}, {0xc44ea000}, {0xc44ec000}, {0xc44ee000}, 
-    {0xc44f0000}, {0xc44f2000}, {0xc44f4000}, {0xc44f6000}, 
-    {0xc44f8000}, {0xc44fa000}, {0xc44fc000}, {0xc44fe000}, 
-    {0xc4500000}, {0xc4502000}, {0xc4504000}, {0xc4506000}, 
-    {0xc4508000}, {0xc450a000}, {0xc450c000}, {0xc450e000}, 
-    {0xc4510000}, {0xc4512000}, {0xc4514000}, {0xc4516000}, 
-    {0xc4518000}, {0xc451a000}, {0xc451c000}, {0xc451e000}, 
-    {0xc4520000}, {0xc4522000}, {0xc4524000}, {0xc4526000}, 
-    {0xc4528000}, {0xc452a000}, {0xc452c000}, {0xc452e000}, 
-    {0xc4530000}, {0xc4532000}, {0xc4534000}, {0xc4536000}, 
-    {0xc4538000}, {0xc453a000}, {0xc453c000}, {0xc453e000}, 
-    {0xc4540000}, {0xc4542000}, {0xc4544000}, {0xc4546000}, 
-    {0xc4548000}, {0xc454a000}, {0xc454c000}, {0xc454e000}, 
-    {0xc4550000}, {0xc4552000}, {0xc4554000}, {0xc4556000}, 
-    {0xc4558000}, {0xc455a000}, {0xc455c000}, {0xc455e000}, 
-    {0xc4560000}, {0xc4562000}, {0xc4564000}, {0xc4566000}, 
-    {0xc4568000}, {0xc456a000}, {0xc456c000}, {0xc456e000}, 
-    {0xc4570000}, {0xc4572000}, {0xc4574000}, {0xc4576000}, 
-    {0xc4578000}, {0xc457a000}, {0xc457c000}, {0xc457e000}, 
-    {0xc4580000}, {0xc4582000}, {0xc4584000}, {0xc4586000}, 
-    {0xc4588000}, {0xc458a000}, {0xc458c000}, {0xc458e000}, 
-    {0xc4590000}, {0xc4592000}, {0xc4594000}, {0xc4596000}, 
-    {0xc4598000}, {0xc459a000}, {0xc459c000}, {0xc459e000}, 
-    {0xc45a0000}, {0xc45a2000}, {0xc45a4000}, {0xc45a6000}, 
-    {0xc45a8000}, {0xc45aa000}, {0xc45ac000}, {0xc45ae000}, 
-    {0xc45b0000}, {0xc45b2000}, {0xc45b4000}, {0xc45b6000}, 
-    {0xc45b8000}, {0xc45ba000}, {0xc45bc000}, {0xc45be000}, 
-    {0xc45c0000}, {0xc45c2000}, {0xc45c4000}, {0xc45c6000}, 
-    {0xc45c8000}, {0xc45ca000}, {0xc45cc000}, {0xc45ce000}, 
-    {0xc45d0000}, {0xc45d2000}, {0xc45d4000}, {0xc45d6000}, 
-    {0xc45d8000}, {0xc45da000}, {0xc45dc000}, {0xc45de000}, 
-    {0xc45e0000}, {0xc45e2000}, {0xc45e4000}, {0xc45e6000}, 
-    {0xc45e8000}, {0xc45ea000}, {0xc45ec000}, {0xc45ee000}, 
-    {0xc45f0000}, {0xc45f2000}, {0xc45f4000}, {0xc45f6000}, 
-    {0xc45f8000}, {0xc45fa000}, {0xc45fc000}, {0xc45fe000}, 
-    {0xc4600000}, {0xc4602000}, {0xc4604000}, {0xc4606000}, 
-    {0xc4608000}, {0xc460a000}, {0xc460c000}, {0xc460e000}, 
-    {0xc4610000}, {0xc4612000}, {0xc4614000}, {0xc4616000}, 
-    {0xc4618000}, {0xc461a000}, {0xc461c000}, {0xc461e000}, 
-    {0xc4620000}, {0xc4622000}, {0xc4624000}, {0xc4626000}, 
-    {0xc4628000}, {0xc462a000}, {0xc462c000}, {0xc462e000}, 
-    {0xc4630000}, {0xc4632000}, {0xc4634000}, {0xc4636000}, 
-    {0xc4638000}, {0xc463a000}, {0xc463c000}, {0xc463e000}, 
-    {0xc4640000}, {0xc4642000}, {0xc4644000}, {0xc4646000}, 
-    {0xc4648000}, {0xc464a000}, {0xc464c000}, {0xc464e000}, 
-    {0xc4650000}, {0xc4652000}, {0xc4654000}, {0xc4656000}, 
-    {0xc4658000}, {0xc465a000}, {0xc465c000}, {0xc465e000}, 
-    {0xc4660000}, {0xc4662000}, {0xc4664000}, {0xc4666000}, 
-    {0xc4668000}, {0xc466a000}, {0xc466c000}, {0xc466e000}, 
-    {0xc4670000}, {0xc4672000}, {0xc4674000}, {0xc4676000}, 
-    {0xc4678000}, {0xc467a000}, {0xc467c000}, {0xc467e000}, 
-    {0xc4680000}, {0xc4682000}, {0xc4684000}, {0xc4686000}, 
-    {0xc4688000}, {0xc468a000}, {0xc468c000}, {0xc468e000}, 
-    {0xc4690000}, {0xc4692000}, {0xc4694000}, {0xc4696000}, 
-    {0xc4698000}, {0xc469a000}, {0xc469c000}, {0xc469e000}, 
-    {0xc46a0000}, {0xc46a2000}, {0xc46a4000}, {0xc46a6000}, 
-    {0xc46a8000}, {0xc46aa000}, {0xc46ac000}, {0xc46ae000}, 
-    {0xc46b0000}, {0xc46b2000}, {0xc46b4000}, {0xc46b6000}, 
-    {0xc46b8000}, {0xc46ba000}, {0xc46bc000}, {0xc46be000}, 
-    {0xc46c0000}, {0xc46c2000}, {0xc46c4000}, {0xc46c6000}, 
-    {0xc46c8000}, {0xc46ca000}, {0xc46cc000}, {0xc46ce000}, 
-    {0xc46d0000}, {0xc46d2000}, {0xc46d4000}, {0xc46d6000}, 
-    {0xc46d8000}, {0xc46da000}, {0xc46dc000}, {0xc46de000}, 
-    {0xc46e0000}, {0xc46e2000}, {0xc46e4000}, {0xc46e6000}, 
-    {0xc46e8000}, {0xc46ea000}, {0xc46ec000}, {0xc46ee000}, 
-    {0xc46f0000}, {0xc46f2000}, {0xc46f4000}, {0xc46f6000}, 
-    {0xc46f8000}, {0xc46fa000}, {0xc46fc000}, {0xc46fe000}, 
-    {0xc4700000}, {0xc4702000}, {0xc4704000}, {0xc4706000}, 
-    {0xc4708000}, {0xc470a000}, {0xc470c000}, {0xc470e000}, 
-    {0xc4710000}, {0xc4712000}, {0xc4714000}, {0xc4716000}, 
-    {0xc4718000}, {0xc471a000}, {0xc471c000}, {0xc471e000}, 
-    {0xc4720000}, {0xc4722000}, {0xc4724000}, {0xc4726000}, 
-    {0xc4728000}, {0xc472a000}, {0xc472c000}, {0xc472e000}, 
-    {0xc4730000}, {0xc4732000}, {0xc4734000}, {0xc4736000}, 
-    {0xc4738000}, {0xc473a000}, {0xc473c000}, {0xc473e000}, 
-    {0xc4740000}, {0xc4742000}, {0xc4744000}, {0xc4746000}, 
-    {0xc4748000}, {0xc474a000}, {0xc474c000}, {0xc474e000}, 
-    {0xc4750000}, {0xc4752000}, {0xc4754000}, {0xc4756000}, 
-    {0xc4758000}, {0xc475a000}, {0xc475c000}, {0xc475e000}, 
-    {0xc4760000}, {0xc4762000}, {0xc4764000}, {0xc4766000}, 
-    {0xc4768000}, {0xc476a000}, {0xc476c000}, {0xc476e000}, 
-    {0xc4770000}, {0xc4772000}, {0xc4774000}, {0xc4776000}, 
-    {0xc4778000}, {0xc477a000}, {0xc477c000}, {0xc477e000}, 
-    {0xc4780000}, {0xc4782000}, {0xc4784000}, {0xc4786000}, 
-    {0xc4788000}, {0xc478a000}, {0xc478c000}, {0xc478e000}, 
-    {0xc4790000}, {0xc4792000}, {0xc4794000}, {0xc4796000}, 
-    {0xc4798000}, {0xc479a000}, {0xc479c000}, {0xc479e000}, 
-    {0xc47a0000}, {0xc47a2000}, {0xc47a4000}, {0xc47a6000}, 
-    {0xc47a8000}, {0xc47aa000}, {0xc47ac000}, {0xc47ae000}, 
-    {0xc47b0000}, {0xc47b2000}, {0xc47b4000}, {0xc47b6000}, 
-    {0xc47b8000}, {0xc47ba000}, {0xc47bc000}, {0xc47be000}, 
-    {0xc47c0000}, {0xc47c2000}, {0xc47c4000}, {0xc47c6000}, 
-    {0xc47c8000}, {0xc47ca000}, {0xc47cc000}, {0xc47ce000}, 
-    {0xc47d0000}, {0xc47d2000}, {0xc47d4000}, {0xc47d6000}, 
-    {0xc47d8000}, {0xc47da000}, {0xc47dc000}, {0xc47de000}, 
-    {0xc47e0000}, {0xc47e2000}, {0xc47e4000}, {0xc47e6000}, 
-    {0xc47e8000}, {0xc47ea000}, {0xc47ec000}, {0xc47ee000}, 
-    {0xc47f0000}, {0xc47f2000}, {0xc47f4000}, {0xc47f6000}, 
-    {0xc47f8000}, {0xc47fa000}, {0xc47fc000}, {0xc47fe000}, 
-    {0xc4800000}, {0xc4802000}, {0xc4804000}, {0xc4806000}, 
-    {0xc4808000}, {0xc480a000}, {0xc480c000}, {0xc480e000}, 
-    {0xc4810000}, {0xc4812000}, {0xc4814000}, {0xc4816000}, 
-    {0xc4818000}, {0xc481a000}, {0xc481c000}, {0xc481e000}, 
-    {0xc4820000}, {0xc4822000}, {0xc4824000}, {0xc4826000}, 
-    {0xc4828000}, {0xc482a000}, {0xc482c000}, {0xc482e000}, 
-    {0xc4830000}, {0xc4832000}, {0xc4834000}, {0xc4836000}, 
-    {0xc4838000}, {0xc483a000}, {0xc483c000}, {0xc483e000}, 
-    {0xc4840000}, {0xc4842000}, {0xc4844000}, {0xc4846000}, 
-    {0xc4848000}, {0xc484a000}, {0xc484c000}, {0xc484e000}, 
-    {0xc4850000}, {0xc4852000}, {0xc4854000}, {0xc4856000}, 
-    {0xc4858000}, {0xc485a000}, {0xc485c000}, {0xc485e000}, 
-    {0xc4860000}, {0xc4862000}, {0xc4864000}, {0xc4866000}, 
-    {0xc4868000}, {0xc486a000}, {0xc486c000}, {0xc486e000}, 
-    {0xc4870000}, {0xc4872000}, {0xc4874000}, {0xc4876000}, 
-    {0xc4878000}, {0xc487a000}, {0xc487c000}, {0xc487e000}, 
-    {0xc4880000}, {0xc4882000}, {0xc4884000}, {0xc4886000}, 
-    {0xc4888000}, {0xc488a000}, {0xc488c000}, {0xc488e000}, 
-    {0xc4890000}, {0xc4892000}, {0xc4894000}, {0xc4896000}, 
-    {0xc4898000}, {0xc489a000}, {0xc489c000}, {0xc489e000}, 
-    {0xc48a0000}, {0xc48a2000}, {0xc48a4000}, {0xc48a6000}, 
-    {0xc48a8000}, {0xc48aa000}, {0xc48ac000}, {0xc48ae000}, 
-    {0xc48b0000}, {0xc48b2000}, {0xc48b4000}, {0xc48b6000}, 
-    {0xc48b8000}, {0xc48ba000}, {0xc48bc000}, {0xc48be000}, 
-    {0xc48c0000}, {0xc48c2000}, {0xc48c4000}, {0xc48c6000}, 
-    {0xc48c8000}, {0xc48ca000}, {0xc48cc000}, {0xc48ce000}, 
-    {0xc48d0000}, {0xc48d2000}, {0xc48d4000}, {0xc48d6000}, 
-    {0xc48d8000}, {0xc48da000}, {0xc48dc000}, {0xc48de000}, 
-    {0xc48e0000}, {0xc48e2000}, {0xc48e4000}, {0xc48e6000}, 
-    {0xc48e8000}, {0xc48ea000}, {0xc48ec000}, {0xc48ee000}, 
-    {0xc48f0000}, {0xc48f2000}, {0xc48f4000}, {0xc48f6000}, 
-    {0xc48f8000}, {0xc48fa000}, {0xc48fc000}, {0xc48fe000}, 
-    {0xc4900000}, {0xc4902000}, {0xc4904000}, {0xc4906000}, 
-    {0xc4908000}, {0xc490a000}, {0xc490c000}, {0xc490e000}, 
-    {0xc4910000}, {0xc4912000}, {0xc4914000}, {0xc4916000}, 
-    {0xc4918000}, {0xc491a000}, {0xc491c000}, {0xc491e000}, 
-    {0xc4920000}, {0xc4922000}, {0xc4924000}, {0xc4926000}, 
-    {0xc4928000}, {0xc492a000}, {0xc492c000}, {0xc492e000}, 
-    {0xc4930000}, {0xc4932000}, {0xc4934000}, {0xc4936000}, 
-    {0xc4938000}, {0xc493a000}, {0xc493c000}, {0xc493e000}, 
-    {0xc4940000}, {0xc4942000}, {0xc4944000}, {0xc4946000}, 
-    {0xc4948000}, {0xc494a000}, {0xc494c000}, {0xc494e000}, 
-    {0xc4950000}, {0xc4952000}, {0xc4954000}, {0xc4956000}, 
-    {0xc4958000}, {0xc495a000}, {0xc495c000}, {0xc495e000}, 
-    {0xc4960000}, {0xc4962000}, {0xc4964000}, {0xc4966000}, 
-    {0xc4968000}, {0xc496a000}, {0xc496c000}, {0xc496e000}, 
-    {0xc4970000}, {0xc4972000}, {0xc4974000}, {0xc4976000}, 
-    {0xc4978000}, {0xc497a000}, {0xc497c000}, {0xc497e000}, 
-    {0xc4980000}, {0xc4982000}, {0xc4984000}, {0xc4986000}, 
-    {0xc4988000}, {0xc498a000}, {0xc498c000}, {0xc498e000}, 
-    {0xc4990000}, {0xc4992000}, {0xc4994000}, {0xc4996000}, 
-    {0xc4998000}, {0xc499a000}, {0xc499c000}, {0xc499e000}, 
-    {0xc49a0000}, {0xc49a2000}, {0xc49a4000}, {0xc49a6000}, 
-    {0xc49a8000}, {0xc49aa000}, {0xc49ac000}, {0xc49ae000}, 
-    {0xc49b0000}, {0xc49b2000}, {0xc49b4000}, {0xc49b6000}, 
-    {0xc49b8000}, {0xc49ba000}, {0xc49bc000}, {0xc49be000}, 
-    {0xc49c0000}, {0xc49c2000}, {0xc49c4000}, {0xc49c6000}, 
-    {0xc49c8000}, {0xc49ca000}, {0xc49cc000}, {0xc49ce000}, 
-    {0xc49d0000}, {0xc49d2000}, {0xc49d4000}, {0xc49d6000}, 
-    {0xc49d8000}, {0xc49da000}, {0xc49dc000}, {0xc49de000}, 
-    {0xc49e0000}, {0xc49e2000}, {0xc49e4000}, {0xc49e6000}, 
-    {0xc49e8000}, {0xc49ea000}, {0xc49ec000}, {0xc49ee000}, 
-    {0xc49f0000}, {0xc49f2000}, {0xc49f4000}, {0xc49f6000}, 
-    {0xc49f8000}, {0xc49fa000}, {0xc49fc000}, {0xc49fe000}, 
-    {0xc4a00000}, {0xc4a02000}, {0xc4a04000}, {0xc4a06000}, 
-    {0xc4a08000}, {0xc4a0a000}, {0xc4a0c000}, {0xc4a0e000}, 
-    {0xc4a10000}, {0xc4a12000}, {0xc4a14000}, {0xc4a16000}, 
-    {0xc4a18000}, {0xc4a1a000}, {0xc4a1c000}, {0xc4a1e000}, 
-    {0xc4a20000}, {0xc4a22000}, {0xc4a24000}, {0xc4a26000}, 
-    {0xc4a28000}, {0xc4a2a000}, {0xc4a2c000}, {0xc4a2e000}, 
-    {0xc4a30000}, {0xc4a32000}, {0xc4a34000}, {0xc4a36000}, 
-    {0xc4a38000}, {0xc4a3a000}, {0xc4a3c000}, {0xc4a3e000}, 
-    {0xc4a40000}, {0xc4a42000}, {0xc4a44000}, {0xc4a46000}, 
-    {0xc4a48000}, {0xc4a4a000}, {0xc4a4c000}, {0xc4a4e000}, 
-    {0xc4a50000}, {0xc4a52000}, {0xc4a54000}, {0xc4a56000}, 
-    {0xc4a58000}, {0xc4a5a000}, {0xc4a5c000}, {0xc4a5e000}, 
-    {0xc4a60000}, {0xc4a62000}, {0xc4a64000}, {0xc4a66000}, 
-    {0xc4a68000}, {0xc4a6a000}, {0xc4a6c000}, {0xc4a6e000}, 
-    {0xc4a70000}, {0xc4a72000}, {0xc4a74000}, {0xc4a76000}, 
-    {0xc4a78000}, {0xc4a7a000}, {0xc4a7c000}, {0xc4a7e000}, 
-    {0xc4a80000}, {0xc4a82000}, {0xc4a84000}, {0xc4a86000}, 
-    {0xc4a88000}, {0xc4a8a000}, {0xc4a8c000}, {0xc4a8e000}, 
-    {0xc4a90000}, {0xc4a92000}, {0xc4a94000}, {0xc4a96000}, 
-    {0xc4a98000}, {0xc4a9a000}, {0xc4a9c000}, {0xc4a9e000}, 
-    {0xc4aa0000}, {0xc4aa2000}, {0xc4aa4000}, {0xc4aa6000}, 
-    {0xc4aa8000}, {0xc4aaa000}, {0xc4aac000}, {0xc4aae000}, 
-    {0xc4ab0000}, {0xc4ab2000}, {0xc4ab4000}, {0xc4ab6000}, 
-    {0xc4ab8000}, {0xc4aba000}, {0xc4abc000}, {0xc4abe000}, 
-    {0xc4ac0000}, {0xc4ac2000}, {0xc4ac4000}, {0xc4ac6000}, 
-    {0xc4ac8000}, {0xc4aca000}, {0xc4acc000}, {0xc4ace000}, 
-    {0xc4ad0000}, {0xc4ad2000}, {0xc4ad4000}, {0xc4ad6000}, 
-    {0xc4ad8000}, {0xc4ada000}, {0xc4adc000}, {0xc4ade000}, 
-    {0xc4ae0000}, {0xc4ae2000}, {0xc4ae4000}, {0xc4ae6000}, 
-    {0xc4ae8000}, {0xc4aea000}, {0xc4aec000}, {0xc4aee000}, 
-    {0xc4af0000}, {0xc4af2000}, {0xc4af4000}, {0xc4af6000}, 
-    {0xc4af8000}, {0xc4afa000}, {0xc4afc000}, {0xc4afe000}, 
-    {0xc4b00000}, {0xc4b02000}, {0xc4b04000}, {0xc4b06000}, 
-    {0xc4b08000}, {0xc4b0a000}, {0xc4b0c000}, {0xc4b0e000}, 
-    {0xc4b10000}, {0xc4b12000}, {0xc4b14000}, {0xc4b16000}, 
-    {0xc4b18000}, {0xc4b1a000}, {0xc4b1c000}, {0xc4b1e000}, 
-    {0xc4b20000}, {0xc4b22000}, {0xc4b24000}, {0xc4b26000}, 
-    {0xc4b28000}, {0xc4b2a000}, {0xc4b2c000}, {0xc4b2e000}, 
-    {0xc4b30000}, {0xc4b32000}, {0xc4b34000}, {0xc4b36000}, 
-    {0xc4b38000}, {0xc4b3a000}, {0xc4b3c000}, {0xc4b3e000}, 
-    {0xc4b40000}, {0xc4b42000}, {0xc4b44000}, {0xc4b46000}, 
-    {0xc4b48000}, {0xc4b4a000}, {0xc4b4c000}, {0xc4b4e000}, 
-    {0xc4b50000}, {0xc4b52000}, {0xc4b54000}, {0xc4b56000}, 
-    {0xc4b58000}, {0xc4b5a000}, {0xc4b5c000}, {0xc4b5e000}, 
-    {0xc4b60000}, {0xc4b62000}, {0xc4b64000}, {0xc4b66000}, 
-    {0xc4b68000}, {0xc4b6a000}, {0xc4b6c000}, {0xc4b6e000}, 
-    {0xc4b70000}, {0xc4b72000}, {0xc4b74000}, {0xc4b76000}, 
-    {0xc4b78000}, {0xc4b7a000}, {0xc4b7c000}, {0xc4b7e000}, 
-    {0xc4b80000}, {0xc4b82000}, {0xc4b84000}, {0xc4b86000}, 
-    {0xc4b88000}, {0xc4b8a000}, {0xc4b8c000}, {0xc4b8e000}, 
-    {0xc4b90000}, {0xc4b92000}, {0xc4b94000}, {0xc4b96000}, 
-    {0xc4b98000}, {0xc4b9a000}, {0xc4b9c000}, {0xc4b9e000}, 
-    {0xc4ba0000}, {0xc4ba2000}, {0xc4ba4000}, {0xc4ba6000}, 
-    {0xc4ba8000}, {0xc4baa000}, {0xc4bac000}, {0xc4bae000}, 
-    {0xc4bb0000}, {0xc4bb2000}, {0xc4bb4000}, {0xc4bb6000}, 
-    {0xc4bb8000}, {0xc4bba000}, {0xc4bbc000}, {0xc4bbe000}, 
-    {0xc4bc0000}, {0xc4bc2000}, {0xc4bc4000}, {0xc4bc6000}, 
-    {0xc4bc8000}, {0xc4bca000}, {0xc4bcc000}, {0xc4bce000}, 
-    {0xc4bd0000}, {0xc4bd2000}, {0xc4bd4000}, {0xc4bd6000}, 
-    {0xc4bd8000}, {0xc4bda000}, {0xc4bdc000}, {0xc4bde000}, 
-    {0xc4be0000}, {0xc4be2000}, {0xc4be4000}, {0xc4be6000}, 
-    {0xc4be8000}, {0xc4bea000}, {0xc4bec000}, {0xc4bee000}, 
-    {0xc4bf0000}, {0xc4bf2000}, {0xc4bf4000}, {0xc4bf6000}, 
-    {0xc4bf8000}, {0xc4bfa000}, {0xc4bfc000}, {0xc4bfe000}, 
-    {0xc4c00000}, {0xc4c02000}, {0xc4c04000}, {0xc4c06000}, 
-    {0xc4c08000}, {0xc4c0a000}, {0xc4c0c000}, {0xc4c0e000}, 
-    {0xc4c10000}, {0xc4c12000}, {0xc4c14000}, {0xc4c16000}, 
-    {0xc4c18000}, {0xc4c1a000}, {0xc4c1c000}, {0xc4c1e000}, 
-    {0xc4c20000}, {0xc4c22000}, {0xc4c24000}, {0xc4c26000}, 
-    {0xc4c28000}, {0xc4c2a000}, {0xc4c2c000}, {0xc4c2e000}, 
-    {0xc4c30000}, {0xc4c32000}, {0xc4c34000}, {0xc4c36000}, 
-    {0xc4c38000}, {0xc4c3a000}, {0xc4c3c000}, {0xc4c3e000}, 
-    {0xc4c40000}, {0xc4c42000}, {0xc4c44000}, {0xc4c46000}, 
-    {0xc4c48000}, {0xc4c4a000}, {0xc4c4c000}, {0xc4c4e000}, 
-    {0xc4c50000}, {0xc4c52000}, {0xc4c54000}, {0xc4c56000}, 
-    {0xc4c58000}, {0xc4c5a000}, {0xc4c5c000}, {0xc4c5e000}, 
-    {0xc4c60000}, {0xc4c62000}, {0xc4c64000}, {0xc4c66000}, 
-    {0xc4c68000}, {0xc4c6a000}, {0xc4c6c000}, {0xc4c6e000}, 
-    {0xc4c70000}, {0xc4c72000}, {0xc4c74000}, {0xc4c76000}, 
-    {0xc4c78000}, {0xc4c7a000}, {0xc4c7c000}, {0xc4c7e000}, 
-    {0xc4c80000}, {0xc4c82000}, {0xc4c84000}, {0xc4c86000}, 
-    {0xc4c88000}, {0xc4c8a000}, {0xc4c8c000}, {0xc4c8e000}, 
-    {0xc4c90000}, {0xc4c92000}, {0xc4c94000}, {0xc4c96000}, 
-    {0xc4c98000}, {0xc4c9a000}, {0xc4c9c000}, {0xc4c9e000}, 
-    {0xc4ca0000}, {0xc4ca2000}, {0xc4ca4000}, {0xc4ca6000}, 
-    {0xc4ca8000}, {0xc4caa000}, {0xc4cac000}, {0xc4cae000}, 
-    {0xc4cb0000}, {0xc4cb2000}, {0xc4cb4000}, {0xc4cb6000}, 
-    {0xc4cb8000}, {0xc4cba000}, {0xc4cbc000}, {0xc4cbe000}, 
-    {0xc4cc0000}, {0xc4cc2000}, {0xc4cc4000}, {0xc4cc6000}, 
-    {0xc4cc8000}, {0xc4cca000}, {0xc4ccc000}, {0xc4cce000}, 
-    {0xc4cd0000}, {0xc4cd2000}, {0xc4cd4000}, {0xc4cd6000}, 
-    {0xc4cd8000}, {0xc4cda000}, {0xc4cdc000}, {0xc4cde000}, 
-    {0xc4ce0000}, {0xc4ce2000}, {0xc4ce4000}, {0xc4ce6000}, 
-    {0xc4ce8000}, {0xc4cea000}, {0xc4cec000}, {0xc4cee000}, 
-    {0xc4cf0000}, {0xc4cf2000}, {0xc4cf4000}, {0xc4cf6000}, 
-    {0xc4cf8000}, {0xc4cfa000}, {0xc4cfc000}, {0xc4cfe000}, 
-    {0xc4d00000}, {0xc4d02000}, {0xc4d04000}, {0xc4d06000}, 
-    {0xc4d08000}, {0xc4d0a000}, {0xc4d0c000}, {0xc4d0e000}, 
-    {0xc4d10000}, {0xc4d12000}, {0xc4d14000}, {0xc4d16000}, 
-    {0xc4d18000}, {0xc4d1a000}, {0xc4d1c000}, {0xc4d1e000}, 
-    {0xc4d20000}, {0xc4d22000}, {0xc4d24000}, {0xc4d26000}, 
-    {0xc4d28000}, {0xc4d2a000}, {0xc4d2c000}, {0xc4d2e000}, 
-    {0xc4d30000}, {0xc4d32000}, {0xc4d34000}, {0xc4d36000}, 
-    {0xc4d38000}, {0xc4d3a000}, {0xc4d3c000}, {0xc4d3e000}, 
-    {0xc4d40000}, {0xc4d42000}, {0xc4d44000}, {0xc4d46000}, 
-    {0xc4d48000}, {0xc4d4a000}, {0xc4d4c000}, {0xc4d4e000}, 
-    {0xc4d50000}, {0xc4d52000}, {0xc4d54000}, {0xc4d56000}, 
-    {0xc4d58000}, {0xc4d5a000}, {0xc4d5c000}, {0xc4d5e000}, 
-    {0xc4d60000}, {0xc4d62000}, {0xc4d64000}, {0xc4d66000}, 
-    {0xc4d68000}, {0xc4d6a000}, {0xc4d6c000}, {0xc4d6e000}, 
-    {0xc4d70000}, {0xc4d72000}, {0xc4d74000}, {0xc4d76000}, 
-    {0xc4d78000}, {0xc4d7a000}, {0xc4d7c000}, {0xc4d7e000}, 
-    {0xc4d80000}, {0xc4d82000}, {0xc4d84000}, {0xc4d86000}, 
-    {0xc4d88000}, {0xc4d8a000}, {0xc4d8c000}, {0xc4d8e000}, 
-    {0xc4d90000}, {0xc4d92000}, {0xc4d94000}, {0xc4d96000}, 
-    {0xc4d98000}, {0xc4d9a000}, {0xc4d9c000}, {0xc4d9e000}, 
-    {0xc4da0000}, {0xc4da2000}, {0xc4da4000}, {0xc4da6000}, 
-    {0xc4da8000}, {0xc4daa000}, {0xc4dac000}, {0xc4dae000}, 
-    {0xc4db0000}, {0xc4db2000}, {0xc4db4000}, {0xc4db6000}, 
-    {0xc4db8000}, {0xc4dba000}, {0xc4dbc000}, {0xc4dbe000}, 
-    {0xc4dc0000}, {0xc4dc2000}, {0xc4dc4000}, {0xc4dc6000}, 
-    {0xc4dc8000}, {0xc4dca000}, {0xc4dcc000}, {0xc4dce000}, 
-    {0xc4dd0000}, {0xc4dd2000}, {0xc4dd4000}, {0xc4dd6000}, 
-    {0xc4dd8000}, {0xc4dda000}, {0xc4ddc000}, {0xc4dde000}, 
-    {0xc4de0000}, {0xc4de2000}, {0xc4de4000}, {0xc4de6000}, 
-    {0xc4de8000}, {0xc4dea000}, {0xc4dec000}, {0xc4dee000}, 
-    {0xc4df0000}, {0xc4df2000}, {0xc4df4000}, {0xc4df6000}, 
-    {0xc4df8000}, {0xc4dfa000}, {0xc4dfc000}, {0xc4dfe000}, 
-    {0xc4e00000}, {0xc4e02000}, {0xc4e04000}, {0xc4e06000}, 
-    {0xc4e08000}, {0xc4e0a000}, {0xc4e0c000}, {0xc4e0e000}, 
-    {0xc4e10000}, {0xc4e12000}, {0xc4e14000}, {0xc4e16000}, 
-    {0xc4e18000}, {0xc4e1a000}, {0xc4e1c000}, {0xc4e1e000}, 
-    {0xc4e20000}, {0xc4e22000}, {0xc4e24000}, {0xc4e26000}, 
-    {0xc4e28000}, {0xc4e2a000}, {0xc4e2c000}, {0xc4e2e000}, 
-    {0xc4e30000}, {0xc4e32000}, {0xc4e34000}, {0xc4e36000}, 
-    {0xc4e38000}, {0xc4e3a000}, {0xc4e3c000}, {0xc4e3e000}, 
-    {0xc4e40000}, {0xc4e42000}, {0xc4e44000}, {0xc4e46000}, 
-    {0xc4e48000}, {0xc4e4a000}, {0xc4e4c000}, {0xc4e4e000}, 
-    {0xc4e50000}, {0xc4e52000}, {0xc4e54000}, {0xc4e56000}, 
-    {0xc4e58000}, {0xc4e5a000}, {0xc4e5c000}, {0xc4e5e000}, 
-    {0xc4e60000}, {0xc4e62000}, {0xc4e64000}, {0xc4e66000}, 
-    {0xc4e68000}, {0xc4e6a000}, {0xc4e6c000}, {0xc4e6e000}, 
-    {0xc4e70000}, {0xc4e72000}, {0xc4e74000}, {0xc4e76000}, 
-    {0xc4e78000}, {0xc4e7a000}, {0xc4e7c000}, {0xc4e7e000}, 
-    {0xc4e80000}, {0xc4e82000}, {0xc4e84000}, {0xc4e86000}, 
-    {0xc4e88000}, {0xc4e8a000}, {0xc4e8c000}, {0xc4e8e000}, 
-    {0xc4e90000}, {0xc4e92000}, {0xc4e94000}, {0xc4e96000}, 
-    {0xc4e98000}, {0xc4e9a000}, {0xc4e9c000}, {0xc4e9e000}, 
-    {0xc4ea0000}, {0xc4ea2000}, {0xc4ea4000}, {0xc4ea6000}, 
-    {0xc4ea8000}, {0xc4eaa000}, {0xc4eac000}, {0xc4eae000}, 
-    {0xc4eb0000}, {0xc4eb2000}, {0xc4eb4000}, {0xc4eb6000}, 
-    {0xc4eb8000}, {0xc4eba000}, {0xc4ebc000}, {0xc4ebe000}, 
-    {0xc4ec0000}, {0xc4ec2000}, {0xc4ec4000}, {0xc4ec6000}, 
-    {0xc4ec8000}, {0xc4eca000}, {0xc4ecc000}, {0xc4ece000}, 
-    {0xc4ed0000}, {0xc4ed2000}, {0xc4ed4000}, {0xc4ed6000}, 
-    {0xc4ed8000}, {0xc4eda000}, {0xc4edc000}, {0xc4ede000}, 
-    {0xc4ee0000}, {0xc4ee2000}, {0xc4ee4000}, {0xc4ee6000}, 
-    {0xc4ee8000}, {0xc4eea000}, {0xc4eec000}, {0xc4eee000}, 
-    {0xc4ef0000}, {0xc4ef2000}, {0xc4ef4000}, {0xc4ef6000}, 
-    {0xc4ef8000}, {0xc4efa000}, {0xc4efc000}, {0xc4efe000}, 
-    {0xc4f00000}, {0xc4f02000}, {0xc4f04000}, {0xc4f06000}, 
-    {0xc4f08000}, {0xc4f0a000}, {0xc4f0c000}, {0xc4f0e000}, 
-    {0xc4f10000}, {0xc4f12000}, {0xc4f14000}, {0xc4f16000}, 
-    {0xc4f18000}, {0xc4f1a000}, {0xc4f1c000}, {0xc4f1e000}, 
-    {0xc4f20000}, {0xc4f22000}, {0xc4f24000}, {0xc4f26000}, 
-    {0xc4f28000}, {0xc4f2a000}, {0xc4f2c000}, {0xc4f2e000}, 
-    {0xc4f30000}, {0xc4f32000}, {0xc4f34000}, {0xc4f36000}, 
-    {0xc4f38000}, {0xc4f3a000}, {0xc4f3c000}, {0xc4f3e000}, 
-    {0xc4f40000}, {0xc4f42000}, {0xc4f44000}, {0xc4f46000}, 
-    {0xc4f48000}, {0xc4f4a000}, {0xc4f4c000}, {0xc4f4e000}, 
-    {0xc4f50000}, {0xc4f52000}, {0xc4f54000}, {0xc4f56000}, 
-    {0xc4f58000}, {0xc4f5a000}, {0xc4f5c000}, {0xc4f5e000}, 
-    {0xc4f60000}, {0xc4f62000}, {0xc4f64000}, {0xc4f66000}, 
-    {0xc4f68000}, {0xc4f6a000}, {0xc4f6c000}, {0xc4f6e000}, 
-    {0xc4f70000}, {0xc4f72000}, {0xc4f74000}, {0xc4f76000}, 
-    {0xc4f78000}, {0xc4f7a000}, {0xc4f7c000}, {0xc4f7e000}, 
-    {0xc4f80000}, {0xc4f82000}, {0xc4f84000}, {0xc4f86000}, 
-    {0xc4f88000}, {0xc4f8a000}, {0xc4f8c000}, {0xc4f8e000}, 
-    {0xc4f90000}, {0xc4f92000}, {0xc4f94000}, {0xc4f96000}, 
-    {0xc4f98000}, {0xc4f9a000}, {0xc4f9c000}, {0xc4f9e000}, 
-    {0xc4fa0000}, {0xc4fa2000}, {0xc4fa4000}, {0xc4fa6000}, 
-    {0xc4fa8000}, {0xc4faa000}, {0xc4fac000}, {0xc4fae000}, 
-    {0xc4fb0000}, {0xc4fb2000}, {0xc4fb4000}, {0xc4fb6000}, 
-    {0xc4fb8000}, {0xc4fba000}, {0xc4fbc000}, {0xc4fbe000}, 
-    {0xc4fc0000}, {0xc4fc2000}, {0xc4fc4000}, {0xc4fc6000}, 
-    {0xc4fc8000}, {0xc4fca000}, {0xc4fcc000}, {0xc4fce000}, 
-    {0xc4fd0000}, {0xc4fd2000}, {0xc4fd4000}, {0xc4fd6000}, 
-    {0xc4fd8000}, {0xc4fda000}, {0xc4fdc000}, {0xc4fde000}, 
-    {0xc4fe0000}, {0xc4fe2000}, {0xc4fe4000}, {0xc4fe6000}, 
-    {0xc4fe8000}, {0xc4fea000}, {0xc4fec000}, {0xc4fee000}, 
-    {0xc4ff0000}, {0xc4ff2000}, {0xc4ff4000}, {0xc4ff6000}, 
-    {0xc4ff8000}, {0xc4ffa000}, {0xc4ffc000}, {0xc4ffe000}, 
-    {0xc5000000}, {0xc5002000}, {0xc5004000}, {0xc5006000}, 
-    {0xc5008000}, {0xc500a000}, {0xc500c000}, {0xc500e000}, 
-    {0xc5010000}, {0xc5012000}, {0xc5014000}, {0xc5016000}, 
-    {0xc5018000}, {0xc501a000}, {0xc501c000}, {0xc501e000}, 
-    {0xc5020000}, {0xc5022000}, {0xc5024000}, {0xc5026000}, 
-    {0xc5028000}, {0xc502a000}, {0xc502c000}, {0xc502e000}, 
-    {0xc5030000}, {0xc5032000}, {0xc5034000}, {0xc5036000}, 
-    {0xc5038000}, {0xc503a000}, {0xc503c000}, {0xc503e000}, 
-    {0xc5040000}, {0xc5042000}, {0xc5044000}, {0xc5046000}, 
-    {0xc5048000}, {0xc504a000}, {0xc504c000}, {0xc504e000}, 
-    {0xc5050000}, {0xc5052000}, {0xc5054000}, {0xc5056000}, 
-    {0xc5058000}, {0xc505a000}, {0xc505c000}, {0xc505e000}, 
-    {0xc5060000}, {0xc5062000}, {0xc5064000}, {0xc5066000}, 
-    {0xc5068000}, {0xc506a000}, {0xc506c000}, {0xc506e000}, 
-    {0xc5070000}, {0xc5072000}, {0xc5074000}, {0xc5076000}, 
-    {0xc5078000}, {0xc507a000}, {0xc507c000}, {0xc507e000}, 
-    {0xc5080000}, {0xc5082000}, {0xc5084000}, {0xc5086000}, 
-    {0xc5088000}, {0xc508a000}, {0xc508c000}, {0xc508e000}, 
-    {0xc5090000}, {0xc5092000}, {0xc5094000}, {0xc5096000}, 
-    {0xc5098000}, {0xc509a000}, {0xc509c000}, {0xc509e000}, 
-    {0xc50a0000}, {0xc50a2000}, {0xc50a4000}, {0xc50a6000}, 
-    {0xc50a8000}, {0xc50aa000}, {0xc50ac000}, {0xc50ae000}, 
-    {0xc50b0000}, {0xc50b2000}, {0xc50b4000}, {0xc50b6000}, 
-    {0xc50b8000}, {0xc50ba000}, {0xc50bc000}, {0xc50be000}, 
-    {0xc50c0000}, {0xc50c2000}, {0xc50c4000}, {0xc50c6000}, 
-    {0xc50c8000}, {0xc50ca000}, {0xc50cc000}, {0xc50ce000}, 
-    {0xc50d0000}, {0xc50d2000}, {0xc50d4000}, {0xc50d6000}, 
-    {0xc50d8000}, {0xc50da000}, {0xc50dc000}, {0xc50de000}, 
-    {0xc50e0000}, {0xc50e2000}, {0xc50e4000}, {0xc50e6000}, 
-    {0xc50e8000}, {0xc50ea000}, {0xc50ec000}, {0xc50ee000}, 
-    {0xc50f0000}, {0xc50f2000}, {0xc50f4000}, {0xc50f6000}, 
-    {0xc50f8000}, {0xc50fa000}, {0xc50fc000}, {0xc50fe000}, 
-    {0xc5100000}, {0xc5102000}, {0xc5104000}, {0xc5106000}, 
-    {0xc5108000}, {0xc510a000}, {0xc510c000}, {0xc510e000}, 
-    {0xc5110000}, {0xc5112000}, {0xc5114000}, {0xc5116000}, 
-    {0xc5118000}, {0xc511a000}, {0xc511c000}, {0xc511e000}, 
-    {0xc5120000}, {0xc5122000}, {0xc5124000}, {0xc5126000}, 
-    {0xc5128000}, {0xc512a000}, {0xc512c000}, {0xc512e000}, 
-    {0xc5130000}, {0xc5132000}, {0xc5134000}, {0xc5136000}, 
-    {0xc5138000}, {0xc513a000}, {0xc513c000}, {0xc513e000}, 
-    {0xc5140000}, {0xc5142000}, {0xc5144000}, {0xc5146000}, 
-    {0xc5148000}, {0xc514a000}, {0xc514c000}, {0xc514e000}, 
-    {0xc5150000}, {0xc5152000}, {0xc5154000}, {0xc5156000}, 
-    {0xc5158000}, {0xc515a000}, {0xc515c000}, {0xc515e000}, 
-    {0xc5160000}, {0xc5162000}, {0xc5164000}, {0xc5166000}, 
-    {0xc5168000}, {0xc516a000}, {0xc516c000}, {0xc516e000}, 
-    {0xc5170000}, {0xc5172000}, {0xc5174000}, {0xc5176000}, 
-    {0xc5178000}, {0xc517a000}, {0xc517c000}, {0xc517e000}, 
-    {0xc5180000}, {0xc5182000}, {0xc5184000}, {0xc5186000}, 
-    {0xc5188000}, {0xc518a000}, {0xc518c000}, {0xc518e000}, 
-    {0xc5190000}, {0xc5192000}, {0xc5194000}, {0xc5196000}, 
-    {0xc5198000}, {0xc519a000}, {0xc519c000}, {0xc519e000}, 
-    {0xc51a0000}, {0xc51a2000}, {0xc51a4000}, {0xc51a6000}, 
-    {0xc51a8000}, {0xc51aa000}, {0xc51ac000}, {0xc51ae000}, 
-    {0xc51b0000}, {0xc51b2000}, {0xc51b4000}, {0xc51b6000}, 
-    {0xc51b8000}, {0xc51ba000}, {0xc51bc000}, {0xc51be000}, 
-    {0xc51c0000}, {0xc51c2000}, {0xc51c4000}, {0xc51c6000}, 
-    {0xc51c8000}, {0xc51ca000}, {0xc51cc000}, {0xc51ce000}, 
-    {0xc51d0000}, {0xc51d2000}, {0xc51d4000}, {0xc51d6000}, 
-    {0xc51d8000}, {0xc51da000}, {0xc51dc000}, {0xc51de000}, 
-    {0xc51e0000}, {0xc51e2000}, {0xc51e4000}, {0xc51e6000}, 
-    {0xc51e8000}, {0xc51ea000}, {0xc51ec000}, {0xc51ee000}, 
-    {0xc51f0000}, {0xc51f2000}, {0xc51f4000}, {0xc51f6000}, 
-    {0xc51f8000}, {0xc51fa000}, {0xc51fc000}, {0xc51fe000}, 
-    {0xc5200000}, {0xc5202000}, {0xc5204000}, {0xc5206000}, 
-    {0xc5208000}, {0xc520a000}, {0xc520c000}, {0xc520e000}, 
-    {0xc5210000}, {0xc5212000}, {0xc5214000}, {0xc5216000}, 
-    {0xc5218000}, {0xc521a000}, {0xc521c000}, {0xc521e000}, 
-    {0xc5220000}, {0xc5222000}, {0xc5224000}, {0xc5226000}, 
-    {0xc5228000}, {0xc522a000}, {0xc522c000}, {0xc522e000}, 
-    {0xc5230000}, {0xc5232000}, {0xc5234000}, {0xc5236000}, 
-    {0xc5238000}, {0xc523a000}, {0xc523c000}, {0xc523e000}, 
-    {0xc5240000}, {0xc5242000}, {0xc5244000}, {0xc5246000}, 
-    {0xc5248000}, {0xc524a000}, {0xc524c000}, {0xc524e000}, 
-    {0xc5250000}, {0xc5252000}, {0xc5254000}, {0xc5256000}, 
-    {0xc5258000}, {0xc525a000}, {0xc525c000}, {0xc525e000}, 
-    {0xc5260000}, {0xc5262000}, {0xc5264000}, {0xc5266000}, 
-    {0xc5268000}, {0xc526a000}, {0xc526c000}, {0xc526e000}, 
-    {0xc5270000}, {0xc5272000}, {0xc5274000}, {0xc5276000}, 
-    {0xc5278000}, {0xc527a000}, {0xc527c000}, {0xc527e000}, 
-    {0xc5280000}, {0xc5282000}, {0xc5284000}, {0xc5286000}, 
-    {0xc5288000}, {0xc528a000}, {0xc528c000}, {0xc528e000}, 
-    {0xc5290000}, {0xc5292000}, {0xc5294000}, {0xc5296000}, 
-    {0xc5298000}, {0xc529a000}, {0xc529c000}, {0xc529e000}, 
-    {0xc52a0000}, {0xc52a2000}, {0xc52a4000}, {0xc52a6000}, 
-    {0xc52a8000}, {0xc52aa000}, {0xc52ac000}, {0xc52ae000}, 
-    {0xc52b0000}, {0xc52b2000}, {0xc52b4000}, {0xc52b6000}, 
-    {0xc52b8000}, {0xc52ba000}, {0xc52bc000}, {0xc52be000}, 
-    {0xc52c0000}, {0xc52c2000}, {0xc52c4000}, {0xc52c6000}, 
-    {0xc52c8000}, {0xc52ca000}, {0xc52cc000}, {0xc52ce000}, 
-    {0xc52d0000}, {0xc52d2000}, {0xc52d4000}, {0xc52d6000}, 
-    {0xc52d8000}, {0xc52da000}, {0xc52dc000}, {0xc52de000}, 
-    {0xc52e0000}, {0xc52e2000}, {0xc52e4000}, {0xc52e6000}, 
-    {0xc52e8000}, {0xc52ea000}, {0xc52ec000}, {0xc52ee000}, 
-    {0xc52f0000}, {0xc52f2000}, {0xc52f4000}, {0xc52f6000}, 
-    {0xc52f8000}, {0xc52fa000}, {0xc52fc000}, {0xc52fe000}, 
-    {0xc5300000}, {0xc5302000}, {0xc5304000}, {0xc5306000}, 
-    {0xc5308000}, {0xc530a000}, {0xc530c000}, {0xc530e000}, 
-    {0xc5310000}, {0xc5312000}, {0xc5314000}, {0xc5316000}, 
-    {0xc5318000}, {0xc531a000}, {0xc531c000}, {0xc531e000}, 
-    {0xc5320000}, {0xc5322000}, {0xc5324000}, {0xc5326000}, 
-    {0xc5328000}, {0xc532a000}, {0xc532c000}, {0xc532e000}, 
-    {0xc5330000}, {0xc5332000}, {0xc5334000}, {0xc5336000}, 
-    {0xc5338000}, {0xc533a000}, {0xc533c000}, {0xc533e000}, 
-    {0xc5340000}, {0xc5342000}, {0xc5344000}, {0xc5346000}, 
-    {0xc5348000}, {0xc534a000}, {0xc534c000}, {0xc534e000}, 
-    {0xc5350000}, {0xc5352000}, {0xc5354000}, {0xc5356000}, 
-    {0xc5358000}, {0xc535a000}, {0xc535c000}, {0xc535e000}, 
-    {0xc5360000}, {0xc5362000}, {0xc5364000}, {0xc5366000}, 
-    {0xc5368000}, {0xc536a000}, {0xc536c000}, {0xc536e000}, 
-    {0xc5370000}, {0xc5372000}, {0xc5374000}, {0xc5376000}, 
-    {0xc5378000}, {0xc537a000}, {0xc537c000}, {0xc537e000}, 
-    {0xc5380000}, {0xc5382000}, {0xc5384000}, {0xc5386000}, 
-    {0xc5388000}, {0xc538a000}, {0xc538c000}, {0xc538e000}, 
-    {0xc5390000}, {0xc5392000}, {0xc5394000}, {0xc5396000}, 
-    {0xc5398000}, {0xc539a000}, {0xc539c000}, {0xc539e000}, 
-    {0xc53a0000}, {0xc53a2000}, {0xc53a4000}, {0xc53a6000}, 
-    {0xc53a8000}, {0xc53aa000}, {0xc53ac000}, {0xc53ae000}, 
-    {0xc53b0000}, {0xc53b2000}, {0xc53b4000}, {0xc53b6000}, 
-    {0xc53b8000}, {0xc53ba000}, {0xc53bc000}, {0xc53be000}, 
-    {0xc53c0000}, {0xc53c2000}, {0xc53c4000}, {0xc53c6000}, 
-    {0xc53c8000}, {0xc53ca000}, {0xc53cc000}, {0xc53ce000}, 
-    {0xc53d0000}, {0xc53d2000}, {0xc53d4000}, {0xc53d6000}, 
-    {0xc53d8000}, {0xc53da000}, {0xc53dc000}, {0xc53de000}, 
-    {0xc53e0000}, {0xc53e2000}, {0xc53e4000}, {0xc53e6000}, 
-    {0xc53e8000}, {0xc53ea000}, {0xc53ec000}, {0xc53ee000}, 
-    {0xc53f0000}, {0xc53f2000}, {0xc53f4000}, {0xc53f6000}, 
-    {0xc53f8000}, {0xc53fa000}, {0xc53fc000}, {0xc53fe000}, 
-    {0xc5400000}, {0xc5402000}, {0xc5404000}, {0xc5406000}, 
-    {0xc5408000}, {0xc540a000}, {0xc540c000}, {0xc540e000}, 
-    {0xc5410000}, {0xc5412000}, {0xc5414000}, {0xc5416000}, 
-    {0xc5418000}, {0xc541a000}, {0xc541c000}, {0xc541e000}, 
-    {0xc5420000}, {0xc5422000}, {0xc5424000}, {0xc5426000}, 
-    {0xc5428000}, {0xc542a000}, {0xc542c000}, {0xc542e000}, 
-    {0xc5430000}, {0xc5432000}, {0xc5434000}, {0xc5436000}, 
-    {0xc5438000}, {0xc543a000}, {0xc543c000}, {0xc543e000}, 
-    {0xc5440000}, {0xc5442000}, {0xc5444000}, {0xc5446000}, 
-    {0xc5448000}, {0xc544a000}, {0xc544c000}, {0xc544e000}, 
-    {0xc5450000}, {0xc5452000}, {0xc5454000}, {0xc5456000}, 
-    {0xc5458000}, {0xc545a000}, {0xc545c000}, {0xc545e000}, 
-    {0xc5460000}, {0xc5462000}, {0xc5464000}, {0xc5466000}, 
-    {0xc5468000}, {0xc546a000}, {0xc546c000}, {0xc546e000}, 
-    {0xc5470000}, {0xc5472000}, {0xc5474000}, {0xc5476000}, 
-    {0xc5478000}, {0xc547a000}, {0xc547c000}, {0xc547e000}, 
-    {0xc5480000}, {0xc5482000}, {0xc5484000}, {0xc5486000}, 
-    {0xc5488000}, {0xc548a000}, {0xc548c000}, {0xc548e000}, 
-    {0xc5490000}, {0xc5492000}, {0xc5494000}, {0xc5496000}, 
-    {0xc5498000}, {0xc549a000}, {0xc549c000}, {0xc549e000}, 
-    {0xc54a0000}, {0xc54a2000}, {0xc54a4000}, {0xc54a6000}, 
-    {0xc54a8000}, {0xc54aa000}, {0xc54ac000}, {0xc54ae000}, 
-    {0xc54b0000}, {0xc54b2000}, {0xc54b4000}, {0xc54b6000}, 
-    {0xc54b8000}, {0xc54ba000}, {0xc54bc000}, {0xc54be000}, 
-    {0xc54c0000}, {0xc54c2000}, {0xc54c4000}, {0xc54c6000}, 
-    {0xc54c8000}, {0xc54ca000}, {0xc54cc000}, {0xc54ce000}, 
-    {0xc54d0000}, {0xc54d2000}, {0xc54d4000}, {0xc54d6000}, 
-    {0xc54d8000}, {0xc54da000}, {0xc54dc000}, {0xc54de000}, 
-    {0xc54e0000}, {0xc54e2000}, {0xc54e4000}, {0xc54e6000}, 
-    {0xc54e8000}, {0xc54ea000}, {0xc54ec000}, {0xc54ee000}, 
-    {0xc54f0000}, {0xc54f2000}, {0xc54f4000}, {0xc54f6000}, 
-    {0xc54f8000}, {0xc54fa000}, {0xc54fc000}, {0xc54fe000}, 
-    {0xc5500000}, {0xc5502000}, {0xc5504000}, {0xc5506000}, 
-    {0xc5508000}, {0xc550a000}, {0xc550c000}, {0xc550e000}, 
-    {0xc5510000}, {0xc5512000}, {0xc5514000}, {0xc5516000}, 
-    {0xc5518000}, {0xc551a000}, {0xc551c000}, {0xc551e000}, 
-    {0xc5520000}, {0xc5522000}, {0xc5524000}, {0xc5526000}, 
-    {0xc5528000}, {0xc552a000}, {0xc552c000}, {0xc552e000}, 
-    {0xc5530000}, {0xc5532000}, {0xc5534000}, {0xc5536000}, 
-    {0xc5538000}, {0xc553a000}, {0xc553c000}, {0xc553e000}, 
-    {0xc5540000}, {0xc5542000}, {0xc5544000}, {0xc5546000}, 
-    {0xc5548000}, {0xc554a000}, {0xc554c000}, {0xc554e000}, 
-    {0xc5550000}, {0xc5552000}, {0xc5554000}, {0xc5556000}, 
-    {0xc5558000}, {0xc555a000}, {0xc555c000}, {0xc555e000}, 
-    {0xc5560000}, {0xc5562000}, {0xc5564000}, {0xc5566000}, 
-    {0xc5568000}, {0xc556a000}, {0xc556c000}, {0xc556e000}, 
-    {0xc5570000}, {0xc5572000}, {0xc5574000}, {0xc5576000}, 
-    {0xc5578000}, {0xc557a000}, {0xc557c000}, {0xc557e000}, 
-    {0xc5580000}, {0xc5582000}, {0xc5584000}, {0xc5586000}, 
-    {0xc5588000}, {0xc558a000}, {0xc558c000}, {0xc558e000}, 
-    {0xc5590000}, {0xc5592000}, {0xc5594000}, {0xc5596000}, 
-    {0xc5598000}, {0xc559a000}, {0xc559c000}, {0xc559e000}, 
-    {0xc55a0000}, {0xc55a2000}, {0xc55a4000}, {0xc55a6000}, 
-    {0xc55a8000}, {0xc55aa000}, {0xc55ac000}, {0xc55ae000}, 
-    {0xc55b0000}, {0xc55b2000}, {0xc55b4000}, {0xc55b6000}, 
-    {0xc55b8000}, {0xc55ba000}, {0xc55bc000}, {0xc55be000}, 
-    {0xc55c0000}, {0xc55c2000}, {0xc55c4000}, {0xc55c6000}, 
-    {0xc55c8000}, {0xc55ca000}, {0xc55cc000}, {0xc55ce000}, 
-    {0xc55d0000}, {0xc55d2000}, {0xc55d4000}, {0xc55d6000}, 
-    {0xc55d8000}, {0xc55da000}, {0xc55dc000}, {0xc55de000}, 
-    {0xc55e0000}, {0xc55e2000}, {0xc55e4000}, {0xc55e6000}, 
-    {0xc55e8000}, {0xc55ea000}, {0xc55ec000}, {0xc55ee000}, 
-    {0xc55f0000}, {0xc55f2000}, {0xc55f4000}, {0xc55f6000}, 
-    {0xc55f8000}, {0xc55fa000}, {0xc55fc000}, {0xc55fe000}, 
-    {0xc5600000}, {0xc5602000}, {0xc5604000}, {0xc5606000}, 
-    {0xc5608000}, {0xc560a000}, {0xc560c000}, {0xc560e000}, 
-    {0xc5610000}, {0xc5612000}, {0xc5614000}, {0xc5616000}, 
-    {0xc5618000}, {0xc561a000}, {0xc561c000}, {0xc561e000}, 
-    {0xc5620000}, {0xc5622000}, {0xc5624000}, {0xc5626000}, 
-    {0xc5628000}, {0xc562a000}, {0xc562c000}, {0xc562e000}, 
-    {0xc5630000}, {0xc5632000}, {0xc5634000}, {0xc5636000}, 
-    {0xc5638000}, {0xc563a000}, {0xc563c000}, {0xc563e000}, 
-    {0xc5640000}, {0xc5642000}, {0xc5644000}, {0xc5646000}, 
-    {0xc5648000}, {0xc564a000}, {0xc564c000}, {0xc564e000}, 
-    {0xc5650000}, {0xc5652000}, {0xc5654000}, {0xc5656000}, 
-    {0xc5658000}, {0xc565a000}, {0xc565c000}, {0xc565e000}, 
-    {0xc5660000}, {0xc5662000}, {0xc5664000}, {0xc5666000}, 
-    {0xc5668000}, {0xc566a000}, {0xc566c000}, {0xc566e000}, 
-    {0xc5670000}, {0xc5672000}, {0xc5674000}, {0xc5676000}, 
-    {0xc5678000}, {0xc567a000}, {0xc567c000}, {0xc567e000}, 
-    {0xc5680000}, {0xc5682000}, {0xc5684000}, {0xc5686000}, 
-    {0xc5688000}, {0xc568a000}, {0xc568c000}, {0xc568e000}, 
-    {0xc5690000}, {0xc5692000}, {0xc5694000}, {0xc5696000}, 
-    {0xc5698000}, {0xc569a000}, {0xc569c000}, {0xc569e000}, 
-    {0xc56a0000}, {0xc56a2000}, {0xc56a4000}, {0xc56a6000}, 
-    {0xc56a8000}, {0xc56aa000}, {0xc56ac000}, {0xc56ae000}, 
-    {0xc56b0000}, {0xc56b2000}, {0xc56b4000}, {0xc56b6000}, 
-    {0xc56b8000}, {0xc56ba000}, {0xc56bc000}, {0xc56be000}, 
-    {0xc56c0000}, {0xc56c2000}, {0xc56c4000}, {0xc56c6000}, 
-    {0xc56c8000}, {0xc56ca000}, {0xc56cc000}, {0xc56ce000}, 
-    {0xc56d0000}, {0xc56d2000}, {0xc56d4000}, {0xc56d6000}, 
-    {0xc56d8000}, {0xc56da000}, {0xc56dc000}, {0xc56de000}, 
-    {0xc56e0000}, {0xc56e2000}, {0xc56e4000}, {0xc56e6000}, 
-    {0xc56e8000}, {0xc56ea000}, {0xc56ec000}, {0xc56ee000}, 
-    {0xc56f0000}, {0xc56f2000}, {0xc56f4000}, {0xc56f6000}, 
-    {0xc56f8000}, {0xc56fa000}, {0xc56fc000}, {0xc56fe000}, 
-    {0xc5700000}, {0xc5702000}, {0xc5704000}, {0xc5706000}, 
-    {0xc5708000}, {0xc570a000}, {0xc570c000}, {0xc570e000}, 
-    {0xc5710000}, {0xc5712000}, {0xc5714000}, {0xc5716000}, 
-    {0xc5718000}, {0xc571a000}, {0xc571c000}, {0xc571e000}, 
-    {0xc5720000}, {0xc5722000}, {0xc5724000}, {0xc5726000}, 
-    {0xc5728000}, {0xc572a000}, {0xc572c000}, {0xc572e000}, 
-    {0xc5730000}, {0xc5732000}, {0xc5734000}, {0xc5736000}, 
-    {0xc5738000}, {0xc573a000}, {0xc573c000}, {0xc573e000}, 
-    {0xc5740000}, {0xc5742000}, {0xc5744000}, {0xc5746000}, 
-    {0xc5748000}, {0xc574a000}, {0xc574c000}, {0xc574e000}, 
-    {0xc5750000}, {0xc5752000}, {0xc5754000}, {0xc5756000}, 
-    {0xc5758000}, {0xc575a000}, {0xc575c000}, {0xc575e000}, 
-    {0xc5760000}, {0xc5762000}, {0xc5764000}, {0xc5766000}, 
-    {0xc5768000}, {0xc576a000}, {0xc576c000}, {0xc576e000}, 
-    {0xc5770000}, {0xc5772000}, {0xc5774000}, {0xc5776000}, 
-    {0xc5778000}, {0xc577a000}, {0xc577c000}, {0xc577e000}, 
-    {0xc5780000}, {0xc5782000}, {0xc5784000}, {0xc5786000}, 
-    {0xc5788000}, {0xc578a000}, {0xc578c000}, {0xc578e000}, 
-    {0xc5790000}, {0xc5792000}, {0xc5794000}, {0xc5796000}, 
-    {0xc5798000}, {0xc579a000}, {0xc579c000}, {0xc579e000}, 
-    {0xc57a0000}, {0xc57a2000}, {0xc57a4000}, {0xc57a6000}, 
-    {0xc57a8000}, {0xc57aa000}, {0xc57ac000}, {0xc57ae000}, 
-    {0xc57b0000}, {0xc57b2000}, {0xc57b4000}, {0xc57b6000}, 
-    {0xc57b8000}, {0xc57ba000}, {0xc57bc000}, {0xc57be000}, 
-    {0xc57c0000}, {0xc57c2000}, {0xc57c4000}, {0xc57c6000}, 
-    {0xc57c8000}, {0xc57ca000}, {0xc57cc000}, {0xc57ce000}, 
-    {0xc57d0000}, {0xc57d2000}, {0xc57d4000}, {0xc57d6000}, 
-    {0xc57d8000}, {0xc57da000}, {0xc57dc000}, {0xc57de000}, 
-    {0xc57e0000}, {0xc57e2000}, {0xc57e4000}, {0xc57e6000}, 
-    {0xc57e8000}, {0xc57ea000}, {0xc57ec000}, {0xc57ee000}, 
-    {0xc57f0000}, {0xc57f2000}, {0xc57f4000}, {0xc57f6000}, 
-    {0xc57f8000}, {0xc57fa000}, {0xc57fc000}, {0xc57fe000}, 
-    {0xc5800000}, {0xc5802000}, {0xc5804000}, {0xc5806000}, 
-    {0xc5808000}, {0xc580a000}, {0xc580c000}, {0xc580e000}, 
-    {0xc5810000}, {0xc5812000}, {0xc5814000}, {0xc5816000}, 
-    {0xc5818000}, {0xc581a000}, {0xc581c000}, {0xc581e000}, 
-    {0xc5820000}, {0xc5822000}, {0xc5824000}, {0xc5826000}, 
-    {0xc5828000}, {0xc582a000}, {0xc582c000}, {0xc582e000}, 
-    {0xc5830000}, {0xc5832000}, {0xc5834000}, {0xc5836000}, 
-    {0xc5838000}, {0xc583a000}, {0xc583c000}, {0xc583e000}, 
-    {0xc5840000}, {0xc5842000}, {0xc5844000}, {0xc5846000}, 
-    {0xc5848000}, {0xc584a000}, {0xc584c000}, {0xc584e000}, 
-    {0xc5850000}, {0xc5852000}, {0xc5854000}, {0xc5856000}, 
-    {0xc5858000}, {0xc585a000}, {0xc585c000}, {0xc585e000}, 
-    {0xc5860000}, {0xc5862000}, {0xc5864000}, {0xc5866000}, 
-    {0xc5868000}, {0xc586a000}, {0xc586c000}, {0xc586e000}, 
-    {0xc5870000}, {0xc5872000}, {0xc5874000}, {0xc5876000}, 
-    {0xc5878000}, {0xc587a000}, {0xc587c000}, {0xc587e000}, 
-    {0xc5880000}, {0xc5882000}, {0xc5884000}, {0xc5886000}, 
-    {0xc5888000}, {0xc588a000}, {0xc588c000}, {0xc588e000}, 
-    {0xc5890000}, {0xc5892000}, {0xc5894000}, {0xc5896000}, 
-    {0xc5898000}, {0xc589a000}, {0xc589c000}, {0xc589e000}, 
-    {0xc58a0000}, {0xc58a2000}, {0xc58a4000}, {0xc58a6000}, 
-    {0xc58a8000}, {0xc58aa000}, {0xc58ac000}, {0xc58ae000}, 
-    {0xc58b0000}, {0xc58b2000}, {0xc58b4000}, {0xc58b6000}, 
-    {0xc58b8000}, {0xc58ba000}, {0xc58bc000}, {0xc58be000}, 
-    {0xc58c0000}, {0xc58c2000}, {0xc58c4000}, {0xc58c6000}, 
-    {0xc58c8000}, {0xc58ca000}, {0xc58cc000}, {0xc58ce000}, 
-    {0xc58d0000}, {0xc58d2000}, {0xc58d4000}, {0xc58d6000}, 
-    {0xc58d8000}, {0xc58da000}, {0xc58dc000}, {0xc58de000}, 
-    {0xc58e0000}, {0xc58e2000}, {0xc58e4000}, {0xc58e6000}, 
-    {0xc58e8000}, {0xc58ea000}, {0xc58ec000}, {0xc58ee000}, 
-    {0xc58f0000}, {0xc58f2000}, {0xc58f4000}, {0xc58f6000}, 
-    {0xc58f8000}, {0xc58fa000}, {0xc58fc000}, {0xc58fe000}, 
-    {0xc5900000}, {0xc5902000}, {0xc5904000}, {0xc5906000}, 
-    {0xc5908000}, {0xc590a000}, {0xc590c000}, {0xc590e000}, 
-    {0xc5910000}, {0xc5912000}, {0xc5914000}, {0xc5916000}, 
-    {0xc5918000}, {0xc591a000}, {0xc591c000}, {0xc591e000}, 
-    {0xc5920000}, {0xc5922000}, {0xc5924000}, {0xc5926000}, 
-    {0xc5928000}, {0xc592a000}, {0xc592c000}, {0xc592e000}, 
-    {0xc5930000}, {0xc5932000}, {0xc5934000}, {0xc5936000}, 
-    {0xc5938000}, {0xc593a000}, {0xc593c000}, {0xc593e000}, 
-    {0xc5940000}, {0xc5942000}, {0xc5944000}, {0xc5946000}, 
-    {0xc5948000}, {0xc594a000}, {0xc594c000}, {0xc594e000}, 
-    {0xc5950000}, {0xc5952000}, {0xc5954000}, {0xc5956000}, 
-    {0xc5958000}, {0xc595a000}, {0xc595c000}, {0xc595e000}, 
-    {0xc5960000}, {0xc5962000}, {0xc5964000}, {0xc5966000}, 
-    {0xc5968000}, {0xc596a000}, {0xc596c000}, {0xc596e000}, 
-    {0xc5970000}, {0xc5972000}, {0xc5974000}, {0xc5976000}, 
-    {0xc5978000}, {0xc597a000}, {0xc597c000}, {0xc597e000}, 
-    {0xc5980000}, {0xc5982000}, {0xc5984000}, {0xc5986000}, 
-    {0xc5988000}, {0xc598a000}, {0xc598c000}, {0xc598e000}, 
-    {0xc5990000}, {0xc5992000}, {0xc5994000}, {0xc5996000}, 
-    {0xc5998000}, {0xc599a000}, {0xc599c000}, {0xc599e000}, 
-    {0xc59a0000}, {0xc59a2000}, {0xc59a4000}, {0xc59a6000}, 
-    {0xc59a8000}, {0xc59aa000}, {0xc59ac000}, {0xc59ae000}, 
-    {0xc59b0000}, {0xc59b2000}, {0xc59b4000}, {0xc59b6000}, 
-    {0xc59b8000}, {0xc59ba000}, {0xc59bc000}, {0xc59be000}, 
-    {0xc59c0000}, {0xc59c2000}, {0xc59c4000}, {0xc59c6000}, 
-    {0xc59c8000}, {0xc59ca000}, {0xc59cc000}, {0xc59ce000}, 
-    {0xc59d0000}, {0xc59d2000}, {0xc59d4000}, {0xc59d6000}, 
-    {0xc59d8000}, {0xc59da000}, {0xc59dc000}, {0xc59de000}, 
-    {0xc59e0000}, {0xc59e2000}, {0xc59e4000}, {0xc59e6000}, 
-    {0xc59e8000}, {0xc59ea000}, {0xc59ec000}, {0xc59ee000}, 
-    {0xc59f0000}, {0xc59f2000}, {0xc59f4000}, {0xc59f6000}, 
-    {0xc59f8000}, {0xc59fa000}, {0xc59fc000}, {0xc59fe000}, 
-    {0xc5a00000}, {0xc5a02000}, {0xc5a04000}, {0xc5a06000}, 
-    {0xc5a08000}, {0xc5a0a000}, {0xc5a0c000}, {0xc5a0e000}, 
-    {0xc5a10000}, {0xc5a12000}, {0xc5a14000}, {0xc5a16000}, 
-    {0xc5a18000}, {0xc5a1a000}, {0xc5a1c000}, {0xc5a1e000}, 
-    {0xc5a20000}, {0xc5a22000}, {0xc5a24000}, {0xc5a26000}, 
-    {0xc5a28000}, {0xc5a2a000}, {0xc5a2c000}, {0xc5a2e000}, 
-    {0xc5a30000}, {0xc5a32000}, {0xc5a34000}, {0xc5a36000}, 
-    {0xc5a38000}, {0xc5a3a000}, {0xc5a3c000}, {0xc5a3e000}, 
-    {0xc5a40000}, {0xc5a42000}, {0xc5a44000}, {0xc5a46000}, 
-    {0xc5a48000}, {0xc5a4a000}, {0xc5a4c000}, {0xc5a4e000}, 
-    {0xc5a50000}, {0xc5a52000}, {0xc5a54000}, {0xc5a56000}, 
-    {0xc5a58000}, {0xc5a5a000}, {0xc5a5c000}, {0xc5a5e000}, 
-    {0xc5a60000}, {0xc5a62000}, {0xc5a64000}, {0xc5a66000}, 
-    {0xc5a68000}, {0xc5a6a000}, {0xc5a6c000}, {0xc5a6e000}, 
-    {0xc5a70000}, {0xc5a72000}, {0xc5a74000}, {0xc5a76000}, 
-    {0xc5a78000}, {0xc5a7a000}, {0xc5a7c000}, {0xc5a7e000}, 
-    {0xc5a80000}, {0xc5a82000}, {0xc5a84000}, {0xc5a86000}, 
-    {0xc5a88000}, {0xc5a8a000}, {0xc5a8c000}, {0xc5a8e000}, 
-    {0xc5a90000}, {0xc5a92000}, {0xc5a94000}, {0xc5a96000}, 
-    {0xc5a98000}, {0xc5a9a000}, {0xc5a9c000}, {0xc5a9e000}, 
-    {0xc5aa0000}, {0xc5aa2000}, {0xc5aa4000}, {0xc5aa6000}, 
-    {0xc5aa8000}, {0xc5aaa000}, {0xc5aac000}, {0xc5aae000}, 
-    {0xc5ab0000}, {0xc5ab2000}, {0xc5ab4000}, {0xc5ab6000}, 
-    {0xc5ab8000}, {0xc5aba000}, {0xc5abc000}, {0xc5abe000}, 
-    {0xc5ac0000}, {0xc5ac2000}, {0xc5ac4000}, {0xc5ac6000}, 
-    {0xc5ac8000}, {0xc5aca000}, {0xc5acc000}, {0xc5ace000}, 
-    {0xc5ad0000}, {0xc5ad2000}, {0xc5ad4000}, {0xc5ad6000}, 
-    {0xc5ad8000}, {0xc5ada000}, {0xc5adc000}, {0xc5ade000}, 
-    {0xc5ae0000}, {0xc5ae2000}, {0xc5ae4000}, {0xc5ae6000}, 
-    {0xc5ae8000}, {0xc5aea000}, {0xc5aec000}, {0xc5aee000}, 
-    {0xc5af0000}, {0xc5af2000}, {0xc5af4000}, {0xc5af6000}, 
-    {0xc5af8000}, {0xc5afa000}, {0xc5afc000}, {0xc5afe000}, 
-    {0xc5b00000}, {0xc5b02000}, {0xc5b04000}, {0xc5b06000}, 
-    {0xc5b08000}, {0xc5b0a000}, {0xc5b0c000}, {0xc5b0e000}, 
-    {0xc5b10000}, {0xc5b12000}, {0xc5b14000}, {0xc5b16000}, 
-    {0xc5b18000}, {0xc5b1a000}, {0xc5b1c000}, {0xc5b1e000}, 
-    {0xc5b20000}, {0xc5b22000}, {0xc5b24000}, {0xc5b26000}, 
-    {0xc5b28000}, {0xc5b2a000}, {0xc5b2c000}, {0xc5b2e000}, 
-    {0xc5b30000}, {0xc5b32000}, {0xc5b34000}, {0xc5b36000}, 
-    {0xc5b38000}, {0xc5b3a000}, {0xc5b3c000}, {0xc5b3e000}, 
-    {0xc5b40000}, {0xc5b42000}, {0xc5b44000}, {0xc5b46000}, 
-    {0xc5b48000}, {0xc5b4a000}, {0xc5b4c000}, {0xc5b4e000}, 
-    {0xc5b50000}, {0xc5b52000}, {0xc5b54000}, {0xc5b56000}, 
-    {0xc5b58000}, {0xc5b5a000}, {0xc5b5c000}, {0xc5b5e000}, 
-    {0xc5b60000}, {0xc5b62000}, {0xc5b64000}, {0xc5b66000}, 
-    {0xc5b68000}, {0xc5b6a000}, {0xc5b6c000}, {0xc5b6e000}, 
-    {0xc5b70000}, {0xc5b72000}, {0xc5b74000}, {0xc5b76000}, 
-    {0xc5b78000}, {0xc5b7a000}, {0xc5b7c000}, {0xc5b7e000}, 
-    {0xc5b80000}, {0xc5b82000}, {0xc5b84000}, {0xc5b86000}, 
-    {0xc5b88000}, {0xc5b8a000}, {0xc5b8c000}, {0xc5b8e000}, 
-    {0xc5b90000}, {0xc5b92000}, {0xc5b94000}, {0xc5b96000}, 
-    {0xc5b98000}, {0xc5b9a000}, {0xc5b9c000}, {0xc5b9e000}, 
-    {0xc5ba0000}, {0xc5ba2000}, {0xc5ba4000}, {0xc5ba6000}, 
-    {0xc5ba8000}, {0xc5baa000}, {0xc5bac000}, {0xc5bae000}, 
-    {0xc5bb0000}, {0xc5bb2000}, {0xc5bb4000}, {0xc5bb6000}, 
-    {0xc5bb8000}, {0xc5bba000}, {0xc5bbc000}, {0xc5bbe000}, 
-    {0xc5bc0000}, {0xc5bc2000}, {0xc5bc4000}, {0xc5bc6000}, 
-    {0xc5bc8000}, {0xc5bca000}, {0xc5bcc000}, {0xc5bce000}, 
-    {0xc5bd0000}, {0xc5bd2000}, {0xc5bd4000}, {0xc5bd6000}, 
-    {0xc5bd8000}, {0xc5bda000}, {0xc5bdc000}, {0xc5bde000}, 
-    {0xc5be0000}, {0xc5be2000}, {0xc5be4000}, {0xc5be6000}, 
-    {0xc5be8000}, {0xc5bea000}, {0xc5bec000}, {0xc5bee000}, 
-    {0xc5bf0000}, {0xc5bf2000}, {0xc5bf4000}, {0xc5bf6000}, 
-    {0xc5bf8000}, {0xc5bfa000}, {0xc5bfc000}, {0xc5bfe000}, 
-    {0xc5c00000}, {0xc5c02000}, {0xc5c04000}, {0xc5c06000}, 
-    {0xc5c08000}, {0xc5c0a000}, {0xc5c0c000}, {0xc5c0e000}, 
-    {0xc5c10000}, {0xc5c12000}, {0xc5c14000}, {0xc5c16000}, 
-    {0xc5c18000}, {0xc5c1a000}, {0xc5c1c000}, {0xc5c1e000}, 
-    {0xc5c20000}, {0xc5c22000}, {0xc5c24000}, {0xc5c26000}, 
-    {0xc5c28000}, {0xc5c2a000}, {0xc5c2c000}, {0xc5c2e000}, 
-    {0xc5c30000}, {0xc5c32000}, {0xc5c34000}, {0xc5c36000}, 
-    {0xc5c38000}, {0xc5c3a000}, {0xc5c3c000}, {0xc5c3e000}, 
-    {0xc5c40000}, {0xc5c42000}, {0xc5c44000}, {0xc5c46000}, 
-    {0xc5c48000}, {0xc5c4a000}, {0xc5c4c000}, {0xc5c4e000}, 
-    {0xc5c50000}, {0xc5c52000}, {0xc5c54000}, {0xc5c56000}, 
-    {0xc5c58000}, {0xc5c5a000}, {0xc5c5c000}, {0xc5c5e000}, 
-    {0xc5c60000}, {0xc5c62000}, {0xc5c64000}, {0xc5c66000}, 
-    {0xc5c68000}, {0xc5c6a000}, {0xc5c6c000}, {0xc5c6e000}, 
-    {0xc5c70000}, {0xc5c72000}, {0xc5c74000}, {0xc5c76000}, 
-    {0xc5c78000}, {0xc5c7a000}, {0xc5c7c000}, {0xc5c7e000}, 
-    {0xc5c80000}, {0xc5c82000}, {0xc5c84000}, {0xc5c86000}, 
-    {0xc5c88000}, {0xc5c8a000}, {0xc5c8c000}, {0xc5c8e000}, 
-    {0xc5c90000}, {0xc5c92000}, {0xc5c94000}, {0xc5c96000}, 
-    {0xc5c98000}, {0xc5c9a000}, {0xc5c9c000}, {0xc5c9e000}, 
-    {0xc5ca0000}, {0xc5ca2000}, {0xc5ca4000}, {0xc5ca6000}, 
-    {0xc5ca8000}, {0xc5caa000}, {0xc5cac000}, {0xc5cae000}, 
-    {0xc5cb0000}, {0xc5cb2000}, {0xc5cb4000}, {0xc5cb6000}, 
-    {0xc5cb8000}, {0xc5cba000}, {0xc5cbc000}, {0xc5cbe000}, 
-    {0xc5cc0000}, {0xc5cc2000}, {0xc5cc4000}, {0xc5cc6000}, 
-    {0xc5cc8000}, {0xc5cca000}, {0xc5ccc000}, {0xc5cce000}, 
-    {0xc5cd0000}, {0xc5cd2000}, {0xc5cd4000}, {0xc5cd6000}, 
-    {0xc5cd8000}, {0xc5cda000}, {0xc5cdc000}, {0xc5cde000}, 
-    {0xc5ce0000}, {0xc5ce2000}, {0xc5ce4000}, {0xc5ce6000}, 
-    {0xc5ce8000}, {0xc5cea000}, {0xc5cec000}, {0xc5cee000}, 
-    {0xc5cf0000}, {0xc5cf2000}, {0xc5cf4000}, {0xc5cf6000}, 
-    {0xc5cf8000}, {0xc5cfa000}, {0xc5cfc000}, {0xc5cfe000}, 
-    {0xc5d00000}, {0xc5d02000}, {0xc5d04000}, {0xc5d06000}, 
-    {0xc5d08000}, {0xc5d0a000}, {0xc5d0c000}, {0xc5d0e000}, 
-    {0xc5d10000}, {0xc5d12000}, {0xc5d14000}, {0xc5d16000}, 
-    {0xc5d18000}, {0xc5d1a000}, {0xc5d1c000}, {0xc5d1e000}, 
-    {0xc5d20000}, {0xc5d22000}, {0xc5d24000}, {0xc5d26000}, 
-    {0xc5d28000}, {0xc5d2a000}, {0xc5d2c000}, {0xc5d2e000}, 
-    {0xc5d30000}, {0xc5d32000}, {0xc5d34000}, {0xc5d36000}, 
-    {0xc5d38000}, {0xc5d3a000}, {0xc5d3c000}, {0xc5d3e000}, 
-    {0xc5d40000}, {0xc5d42000}, {0xc5d44000}, {0xc5d46000}, 
-    {0xc5d48000}, {0xc5d4a000}, {0xc5d4c000}, {0xc5d4e000}, 
-    {0xc5d50000}, {0xc5d52000}, {0xc5d54000}, {0xc5d56000}, 
-    {0xc5d58000}, {0xc5d5a000}, {0xc5d5c000}, {0xc5d5e000}, 
-    {0xc5d60000}, {0xc5d62000}, {0xc5d64000}, {0xc5d66000}, 
-    {0xc5d68000}, {0xc5d6a000}, {0xc5d6c000}, {0xc5d6e000}, 
-    {0xc5d70000}, {0xc5d72000}, {0xc5d74000}, {0xc5d76000}, 
-    {0xc5d78000}, {0xc5d7a000}, {0xc5d7c000}, {0xc5d7e000}, 
-    {0xc5d80000}, {0xc5d82000}, {0xc5d84000}, {0xc5d86000}, 
-    {0xc5d88000}, {0xc5d8a000}, {0xc5d8c000}, {0xc5d8e000}, 
-    {0xc5d90000}, {0xc5d92000}, {0xc5d94000}, {0xc5d96000}, 
-    {0xc5d98000}, {0xc5d9a000}, {0xc5d9c000}, {0xc5d9e000}, 
-    {0xc5da0000}, {0xc5da2000}, {0xc5da4000}, {0xc5da6000}, 
-    {0xc5da8000}, {0xc5daa000}, {0xc5dac000}, {0xc5dae000}, 
-    {0xc5db0000}, {0xc5db2000}, {0xc5db4000}, {0xc5db6000}, 
-    {0xc5db8000}, {0xc5dba000}, {0xc5dbc000}, {0xc5dbe000}, 
-    {0xc5dc0000}, {0xc5dc2000}, {0xc5dc4000}, {0xc5dc6000}, 
-    {0xc5dc8000}, {0xc5dca000}, {0xc5dcc000}, {0xc5dce000}, 
-    {0xc5dd0000}, {0xc5dd2000}, {0xc5dd4000}, {0xc5dd6000}, 
-    {0xc5dd8000}, {0xc5dda000}, {0xc5ddc000}, {0xc5dde000}, 
-    {0xc5de0000}, {0xc5de2000}, {0xc5de4000}, {0xc5de6000}, 
-    {0xc5de8000}, {0xc5dea000}, {0xc5dec000}, {0xc5dee000}, 
-    {0xc5df0000}, {0xc5df2000}, {0xc5df4000}, {0xc5df6000}, 
-    {0xc5df8000}, {0xc5dfa000}, {0xc5dfc000}, {0xc5dfe000}, 
-    {0xc5e00000}, {0xc5e02000}, {0xc5e04000}, {0xc5e06000}, 
-    {0xc5e08000}, {0xc5e0a000}, {0xc5e0c000}, {0xc5e0e000}, 
-    {0xc5e10000}, {0xc5e12000}, {0xc5e14000}, {0xc5e16000}, 
-    {0xc5e18000}, {0xc5e1a000}, {0xc5e1c000}, {0xc5e1e000}, 
-    {0xc5e20000}, {0xc5e22000}, {0xc5e24000}, {0xc5e26000}, 
-    {0xc5e28000}, {0xc5e2a000}, {0xc5e2c000}, {0xc5e2e000}, 
-    {0xc5e30000}, {0xc5e32000}, {0xc5e34000}, {0xc5e36000}, 
-    {0xc5e38000}, {0xc5e3a000}, {0xc5e3c000}, {0xc5e3e000}, 
-    {0xc5e40000}, {0xc5e42000}, {0xc5e44000}, {0xc5e46000}, 
-    {0xc5e48000}, {0xc5e4a000}, {0xc5e4c000}, {0xc5e4e000}, 
-    {0xc5e50000}, {0xc5e52000}, {0xc5e54000}, {0xc5e56000}, 
-    {0xc5e58000}, {0xc5e5a000}, {0xc5e5c000}, {0xc5e5e000}, 
-    {0xc5e60000}, {0xc5e62000}, {0xc5e64000}, {0xc5e66000}, 
-    {0xc5e68000}, {0xc5e6a000}, {0xc5e6c000}, {0xc5e6e000}, 
-    {0xc5e70000}, {0xc5e72000}, {0xc5e74000}, {0xc5e76000}, 
-    {0xc5e78000}, {0xc5e7a000}, {0xc5e7c000}, {0xc5e7e000}, 
-    {0xc5e80000}, {0xc5e82000}, {0xc5e84000}, {0xc5e86000}, 
-    {0xc5e88000}, {0xc5e8a000}, {0xc5e8c000}, {0xc5e8e000}, 
-    {0xc5e90000}, {0xc5e92000}, {0xc5e94000}, {0xc5e96000}, 
-    {0xc5e98000}, {0xc5e9a000}, {0xc5e9c000}, {0xc5e9e000}, 
-    {0xc5ea0000}, {0xc5ea2000}, {0xc5ea4000}, {0xc5ea6000}, 
-    {0xc5ea8000}, {0xc5eaa000}, {0xc5eac000}, {0xc5eae000}, 
-    {0xc5eb0000}, {0xc5eb2000}, {0xc5eb4000}, {0xc5eb6000}, 
-    {0xc5eb8000}, {0xc5eba000}, {0xc5ebc000}, {0xc5ebe000}, 
-    {0xc5ec0000}, {0xc5ec2000}, {0xc5ec4000}, {0xc5ec6000}, 
-    {0xc5ec8000}, {0xc5eca000}, {0xc5ecc000}, {0xc5ece000}, 
-    {0xc5ed0000}, {0xc5ed2000}, {0xc5ed4000}, {0xc5ed6000}, 
-    {0xc5ed8000}, {0xc5eda000}, {0xc5edc000}, {0xc5ede000}, 
-    {0xc5ee0000}, {0xc5ee2000}, {0xc5ee4000}, {0xc5ee6000}, 
-    {0xc5ee8000}, {0xc5eea000}, {0xc5eec000}, {0xc5eee000}, 
-    {0xc5ef0000}, {0xc5ef2000}, {0xc5ef4000}, {0xc5ef6000}, 
-    {0xc5ef8000}, {0xc5efa000}, {0xc5efc000}, {0xc5efe000}, 
-    {0xc5f00000}, {0xc5f02000}, {0xc5f04000}, {0xc5f06000}, 
-    {0xc5f08000}, {0xc5f0a000}, {0xc5f0c000}, {0xc5f0e000}, 
-    {0xc5f10000}, {0xc5f12000}, {0xc5f14000}, {0xc5f16000}, 
-    {0xc5f18000}, {0xc5f1a000}, {0xc5f1c000}, {0xc5f1e000}, 
-    {0xc5f20000}, {0xc5f22000}, {0xc5f24000}, {0xc5f26000}, 
-    {0xc5f28000}, {0xc5f2a000}, {0xc5f2c000}, {0xc5f2e000}, 
-    {0xc5f30000}, {0xc5f32000}, {0xc5f34000}, {0xc5f36000}, 
-    {0xc5f38000}, {0xc5f3a000}, {0xc5f3c000}, {0xc5f3e000}, 
-    {0xc5f40000}, {0xc5f42000}, {0xc5f44000}, {0xc5f46000}, 
-    {0xc5f48000}, {0xc5f4a000}, {0xc5f4c000}, {0xc5f4e000}, 
-    {0xc5f50000}, {0xc5f52000}, {0xc5f54000}, {0xc5f56000}, 
-    {0xc5f58000}, {0xc5f5a000}, {0xc5f5c000}, {0xc5f5e000}, 
-    {0xc5f60000}, {0xc5f62000}, {0xc5f64000}, {0xc5f66000}, 
-    {0xc5f68000}, {0xc5f6a000}, {0xc5f6c000}, {0xc5f6e000}, 
-    {0xc5f70000}, {0xc5f72000}, {0xc5f74000}, {0xc5f76000}, 
-    {0xc5f78000}, {0xc5f7a000}, {0xc5f7c000}, {0xc5f7e000}, 
-    {0xc5f80000}, {0xc5f82000}, {0xc5f84000}, {0xc5f86000}, 
-    {0xc5f88000}, {0xc5f8a000}, {0xc5f8c000}, {0xc5f8e000}, 
-    {0xc5f90000}, {0xc5f92000}, {0xc5f94000}, {0xc5f96000}, 
-    {0xc5f98000}, {0xc5f9a000}, {0xc5f9c000}, {0xc5f9e000}, 
-    {0xc5fa0000}, {0xc5fa2000}, {0xc5fa4000}, {0xc5fa6000}, 
-    {0xc5fa8000}, {0xc5faa000}, {0xc5fac000}, {0xc5fae000}, 
-    {0xc5fb0000}, {0xc5fb2000}, {0xc5fb4000}, {0xc5fb6000}, 
-    {0xc5fb8000}, {0xc5fba000}, {0xc5fbc000}, {0xc5fbe000}, 
-    {0xc5fc0000}, {0xc5fc2000}, {0xc5fc4000}, {0xc5fc6000}, 
-    {0xc5fc8000}, {0xc5fca000}, {0xc5fcc000}, {0xc5fce000}, 
-    {0xc5fd0000}, {0xc5fd2000}, {0xc5fd4000}, {0xc5fd6000}, 
-    {0xc5fd8000}, {0xc5fda000}, {0xc5fdc000}, {0xc5fde000}, 
-    {0xc5fe0000}, {0xc5fe2000}, {0xc5fe4000}, {0xc5fe6000}, 
-    {0xc5fe8000}, {0xc5fea000}, {0xc5fec000}, {0xc5fee000}, 
-    {0xc5ff0000}, {0xc5ff2000}, {0xc5ff4000}, {0xc5ff6000}, 
-    {0xc5ff8000}, {0xc5ffa000}, {0xc5ffc000}, {0xc5ffe000}, 
-    {0xc6000000}, {0xc6002000}, {0xc6004000}, {0xc6006000}, 
-    {0xc6008000}, {0xc600a000}, {0xc600c000}, {0xc600e000}, 
-    {0xc6010000}, {0xc6012000}, {0xc6014000}, {0xc6016000}, 
-    {0xc6018000}, {0xc601a000}, {0xc601c000}, {0xc601e000}, 
-    {0xc6020000}, {0xc6022000}, {0xc6024000}, {0xc6026000}, 
-    {0xc6028000}, {0xc602a000}, {0xc602c000}, {0xc602e000}, 
-    {0xc6030000}, {0xc6032000}, {0xc6034000}, {0xc6036000}, 
-    {0xc6038000}, {0xc603a000}, {0xc603c000}, {0xc603e000}, 
-    {0xc6040000}, {0xc6042000}, {0xc6044000}, {0xc6046000}, 
-    {0xc6048000}, {0xc604a000}, {0xc604c000}, {0xc604e000}, 
-    {0xc6050000}, {0xc6052000}, {0xc6054000}, {0xc6056000}, 
-    {0xc6058000}, {0xc605a000}, {0xc605c000}, {0xc605e000}, 
-    {0xc6060000}, {0xc6062000}, {0xc6064000}, {0xc6066000}, 
-    {0xc6068000}, {0xc606a000}, {0xc606c000}, {0xc606e000}, 
-    {0xc6070000}, {0xc6072000}, {0xc6074000}, {0xc6076000}, 
-    {0xc6078000}, {0xc607a000}, {0xc607c000}, {0xc607e000}, 
-    {0xc6080000}, {0xc6082000}, {0xc6084000}, {0xc6086000}, 
-    {0xc6088000}, {0xc608a000}, {0xc608c000}, {0xc608e000}, 
-    {0xc6090000}, {0xc6092000}, {0xc6094000}, {0xc6096000}, 
-    {0xc6098000}, {0xc609a000}, {0xc609c000}, {0xc609e000}, 
-    {0xc60a0000}, {0xc60a2000}, {0xc60a4000}, {0xc60a6000}, 
-    {0xc60a8000}, {0xc60aa000}, {0xc60ac000}, {0xc60ae000}, 
-    {0xc60b0000}, {0xc60b2000}, {0xc60b4000}, {0xc60b6000}, 
-    {0xc60b8000}, {0xc60ba000}, {0xc60bc000}, {0xc60be000}, 
-    {0xc60c0000}, {0xc60c2000}, {0xc60c4000}, {0xc60c6000}, 
-    {0xc60c8000}, {0xc60ca000}, {0xc60cc000}, {0xc60ce000}, 
-    {0xc60d0000}, {0xc60d2000}, {0xc60d4000}, {0xc60d6000}, 
-    {0xc60d8000}, {0xc60da000}, {0xc60dc000}, {0xc60de000}, 
-    {0xc60e0000}, {0xc60e2000}, {0xc60e4000}, {0xc60e6000}, 
-    {0xc60e8000}, {0xc60ea000}, {0xc60ec000}, {0xc60ee000}, 
-    {0xc60f0000}, {0xc60f2000}, {0xc60f4000}, {0xc60f6000}, 
-    {0xc60f8000}, {0xc60fa000}, {0xc60fc000}, {0xc60fe000}, 
-    {0xc6100000}, {0xc6102000}, {0xc6104000}, {0xc6106000}, 
-    {0xc6108000}, {0xc610a000}, {0xc610c000}, {0xc610e000}, 
-    {0xc6110000}, {0xc6112000}, {0xc6114000}, {0xc6116000}, 
-    {0xc6118000}, {0xc611a000}, {0xc611c000}, {0xc611e000}, 
-    {0xc6120000}, {0xc6122000}, {0xc6124000}, {0xc6126000}, 
-    {0xc6128000}, {0xc612a000}, {0xc612c000}, {0xc612e000}, 
-    {0xc6130000}, {0xc6132000}, {0xc6134000}, {0xc6136000}, 
-    {0xc6138000}, {0xc613a000}, {0xc613c000}, {0xc613e000}, 
-    {0xc6140000}, {0xc6142000}, {0xc6144000}, {0xc6146000}, 
-    {0xc6148000}, {0xc614a000}, {0xc614c000}, {0xc614e000}, 
-    {0xc6150000}, {0xc6152000}, {0xc6154000}, {0xc6156000}, 
-    {0xc6158000}, {0xc615a000}, {0xc615c000}, {0xc615e000}, 
-    {0xc6160000}, {0xc6162000}, {0xc6164000}, {0xc6166000}, 
-    {0xc6168000}, {0xc616a000}, {0xc616c000}, {0xc616e000}, 
-    {0xc6170000}, {0xc6172000}, {0xc6174000}, {0xc6176000}, 
-    {0xc6178000}, {0xc617a000}, {0xc617c000}, {0xc617e000}, 
-    {0xc6180000}, {0xc6182000}, {0xc6184000}, {0xc6186000}, 
-    {0xc6188000}, {0xc618a000}, {0xc618c000}, {0xc618e000}, 
-    {0xc6190000}, {0xc6192000}, {0xc6194000}, {0xc6196000}, 
-    {0xc6198000}, {0xc619a000}, {0xc619c000}, {0xc619e000}, 
-    {0xc61a0000}, {0xc61a2000}, {0xc61a4000}, {0xc61a6000}, 
-    {0xc61a8000}, {0xc61aa000}, {0xc61ac000}, {0xc61ae000}, 
-    {0xc61b0000}, {0xc61b2000}, {0xc61b4000}, {0xc61b6000}, 
-    {0xc61b8000}, {0xc61ba000}, {0xc61bc000}, {0xc61be000}, 
-    {0xc61c0000}, {0xc61c2000}, {0xc61c4000}, {0xc61c6000}, 
-    {0xc61c8000}, {0xc61ca000}, {0xc61cc000}, {0xc61ce000}, 
-    {0xc61d0000}, {0xc61d2000}, {0xc61d4000}, {0xc61d6000}, 
-    {0xc61d8000}, {0xc61da000}, {0xc61dc000}, {0xc61de000}, 
-    {0xc61e0000}, {0xc61e2000}, {0xc61e4000}, {0xc61e6000}, 
-    {0xc61e8000}, {0xc61ea000}, {0xc61ec000}, {0xc61ee000}, 
-    {0xc61f0000}, {0xc61f2000}, {0xc61f4000}, {0xc61f6000}, 
-    {0xc61f8000}, {0xc61fa000}, {0xc61fc000}, {0xc61fe000}, 
-    {0xc6200000}, {0xc6202000}, {0xc6204000}, {0xc6206000}, 
-    {0xc6208000}, {0xc620a000}, {0xc620c000}, {0xc620e000}, 
-    {0xc6210000}, {0xc6212000}, {0xc6214000}, {0xc6216000}, 
-    {0xc6218000}, {0xc621a000}, {0xc621c000}, {0xc621e000}, 
-    {0xc6220000}, {0xc6222000}, {0xc6224000}, {0xc6226000}, 
-    {0xc6228000}, {0xc622a000}, {0xc622c000}, {0xc622e000}, 
-    {0xc6230000}, {0xc6232000}, {0xc6234000}, {0xc6236000}, 
-    {0xc6238000}, {0xc623a000}, {0xc623c000}, {0xc623e000}, 
-    {0xc6240000}, {0xc6242000}, {0xc6244000}, {0xc6246000}, 
-    {0xc6248000}, {0xc624a000}, {0xc624c000}, {0xc624e000}, 
-    {0xc6250000}, {0xc6252000}, {0xc6254000}, {0xc6256000}, 
-    {0xc6258000}, {0xc625a000}, {0xc625c000}, {0xc625e000}, 
-    {0xc6260000}, {0xc6262000}, {0xc6264000}, {0xc6266000}, 
-    {0xc6268000}, {0xc626a000}, {0xc626c000}, {0xc626e000}, 
-    {0xc6270000}, {0xc6272000}, {0xc6274000}, {0xc6276000}, 
-    {0xc6278000}, {0xc627a000}, {0xc627c000}, {0xc627e000}, 
-    {0xc6280000}, {0xc6282000}, {0xc6284000}, {0xc6286000}, 
-    {0xc6288000}, {0xc628a000}, {0xc628c000}, {0xc628e000}, 
-    {0xc6290000}, {0xc6292000}, {0xc6294000}, {0xc6296000}, 
-    {0xc6298000}, {0xc629a000}, {0xc629c000}, {0xc629e000}, 
-    {0xc62a0000}, {0xc62a2000}, {0xc62a4000}, {0xc62a6000}, 
-    {0xc62a8000}, {0xc62aa000}, {0xc62ac000}, {0xc62ae000}, 
-    {0xc62b0000}, {0xc62b2000}, {0xc62b4000}, {0xc62b6000}, 
-    {0xc62b8000}, {0xc62ba000}, {0xc62bc000}, {0xc62be000}, 
-    {0xc62c0000}, {0xc62c2000}, {0xc62c4000}, {0xc62c6000}, 
-    {0xc62c8000}, {0xc62ca000}, {0xc62cc000}, {0xc62ce000}, 
-    {0xc62d0000}, {0xc62d2000}, {0xc62d4000}, {0xc62d6000}, 
-    {0xc62d8000}, {0xc62da000}, {0xc62dc000}, {0xc62de000}, 
-    {0xc62e0000}, {0xc62e2000}, {0xc62e4000}, {0xc62e6000}, 
-    {0xc62e8000}, {0xc62ea000}, {0xc62ec000}, {0xc62ee000}, 
-    {0xc62f0000}, {0xc62f2000}, {0xc62f4000}, {0xc62f6000}, 
-    {0xc62f8000}, {0xc62fa000}, {0xc62fc000}, {0xc62fe000}, 
-    {0xc6300000}, {0xc6302000}, {0xc6304000}, {0xc6306000}, 
-    {0xc6308000}, {0xc630a000}, {0xc630c000}, {0xc630e000}, 
-    {0xc6310000}, {0xc6312000}, {0xc6314000}, {0xc6316000}, 
-    {0xc6318000}, {0xc631a000}, {0xc631c000}, {0xc631e000}, 
-    {0xc6320000}, {0xc6322000}, {0xc6324000}, {0xc6326000}, 
-    {0xc6328000}, {0xc632a000}, {0xc632c000}, {0xc632e000}, 
-    {0xc6330000}, {0xc6332000}, {0xc6334000}, {0xc6336000}, 
-    {0xc6338000}, {0xc633a000}, {0xc633c000}, {0xc633e000}, 
-    {0xc6340000}, {0xc6342000}, {0xc6344000}, {0xc6346000}, 
-    {0xc6348000}, {0xc634a000}, {0xc634c000}, {0xc634e000}, 
-    {0xc6350000}, {0xc6352000}, {0xc6354000}, {0xc6356000}, 
-    {0xc6358000}, {0xc635a000}, {0xc635c000}, {0xc635e000}, 
-    {0xc6360000}, {0xc6362000}, {0xc6364000}, {0xc6366000}, 
-    {0xc6368000}, {0xc636a000}, {0xc636c000}, {0xc636e000}, 
-    {0xc6370000}, {0xc6372000}, {0xc6374000}, {0xc6376000}, 
-    {0xc6378000}, {0xc637a000}, {0xc637c000}, {0xc637e000}, 
-    {0xc6380000}, {0xc6382000}, {0xc6384000}, {0xc6386000}, 
-    {0xc6388000}, {0xc638a000}, {0xc638c000}, {0xc638e000}, 
-    {0xc6390000}, {0xc6392000}, {0xc6394000}, {0xc6396000}, 
-    {0xc6398000}, {0xc639a000}, {0xc639c000}, {0xc639e000}, 
-    {0xc63a0000}, {0xc63a2000}, {0xc63a4000}, {0xc63a6000}, 
-    {0xc63a8000}, {0xc63aa000}, {0xc63ac000}, {0xc63ae000}, 
-    {0xc63b0000}, {0xc63b2000}, {0xc63b4000}, {0xc63b6000}, 
-    {0xc63b8000}, {0xc63ba000}, {0xc63bc000}, {0xc63be000}, 
-    {0xc63c0000}, {0xc63c2000}, {0xc63c4000}, {0xc63c6000}, 
-    {0xc63c8000}, {0xc63ca000}, {0xc63cc000}, {0xc63ce000}, 
-    {0xc63d0000}, {0xc63d2000}, {0xc63d4000}, {0xc63d6000}, 
-    {0xc63d8000}, {0xc63da000}, {0xc63dc000}, {0xc63de000}, 
-    {0xc63e0000}, {0xc63e2000}, {0xc63e4000}, {0xc63e6000}, 
-    {0xc63e8000}, {0xc63ea000}, {0xc63ec000}, {0xc63ee000}, 
-    {0xc63f0000}, {0xc63f2000}, {0xc63f4000}, {0xc63f6000}, 
-    {0xc63f8000}, {0xc63fa000}, {0xc63fc000}, {0xc63fe000}, 
-    {0xc6400000}, {0xc6402000}, {0xc6404000}, {0xc6406000}, 
-    {0xc6408000}, {0xc640a000}, {0xc640c000}, {0xc640e000}, 
-    {0xc6410000}, {0xc6412000}, {0xc6414000}, {0xc6416000}, 
-    {0xc6418000}, {0xc641a000}, {0xc641c000}, {0xc641e000}, 
-    {0xc6420000}, {0xc6422000}, {0xc6424000}, {0xc6426000}, 
-    {0xc6428000}, {0xc642a000}, {0xc642c000}, {0xc642e000}, 
-    {0xc6430000}, {0xc6432000}, {0xc6434000}, {0xc6436000}, 
-    {0xc6438000}, {0xc643a000}, {0xc643c000}, {0xc643e000}, 
-    {0xc6440000}, {0xc6442000}, {0xc6444000}, {0xc6446000}, 
-    {0xc6448000}, {0xc644a000}, {0xc644c000}, {0xc644e000}, 
-    {0xc6450000}, {0xc6452000}, {0xc6454000}, {0xc6456000}, 
-    {0xc6458000}, {0xc645a000}, {0xc645c000}, {0xc645e000}, 
-    {0xc6460000}, {0xc6462000}, {0xc6464000}, {0xc6466000}, 
-    {0xc6468000}, {0xc646a000}, {0xc646c000}, {0xc646e000}, 
-    {0xc6470000}, {0xc6472000}, {0xc6474000}, {0xc6476000}, 
-    {0xc6478000}, {0xc647a000}, {0xc647c000}, {0xc647e000}, 
-    {0xc6480000}, {0xc6482000}, {0xc6484000}, {0xc6486000}, 
-    {0xc6488000}, {0xc648a000}, {0xc648c000}, {0xc648e000}, 
-    {0xc6490000}, {0xc6492000}, {0xc6494000}, {0xc6496000}, 
-    {0xc6498000}, {0xc649a000}, {0xc649c000}, {0xc649e000}, 
-    {0xc64a0000}, {0xc64a2000}, {0xc64a4000}, {0xc64a6000}, 
-    {0xc64a8000}, {0xc64aa000}, {0xc64ac000}, {0xc64ae000}, 
-    {0xc64b0000}, {0xc64b2000}, {0xc64b4000}, {0xc64b6000}, 
-    {0xc64b8000}, {0xc64ba000}, {0xc64bc000}, {0xc64be000}, 
-    {0xc64c0000}, {0xc64c2000}, {0xc64c4000}, {0xc64c6000}, 
-    {0xc64c8000}, {0xc64ca000}, {0xc64cc000}, {0xc64ce000}, 
-    {0xc64d0000}, {0xc64d2000}, {0xc64d4000}, {0xc64d6000}, 
-    {0xc64d8000}, {0xc64da000}, {0xc64dc000}, {0xc64de000}, 
-    {0xc64e0000}, {0xc64e2000}, {0xc64e4000}, {0xc64e6000}, 
-    {0xc64e8000}, {0xc64ea000}, {0xc64ec000}, {0xc64ee000}, 
-    {0xc64f0000}, {0xc64f2000}, {0xc64f4000}, {0xc64f6000}, 
-    {0xc64f8000}, {0xc64fa000}, {0xc64fc000}, {0xc64fe000}, 
-    {0xc6500000}, {0xc6502000}, {0xc6504000}, {0xc6506000}, 
-    {0xc6508000}, {0xc650a000}, {0xc650c000}, {0xc650e000}, 
-    {0xc6510000}, {0xc6512000}, {0xc6514000}, {0xc6516000}, 
-    {0xc6518000}, {0xc651a000}, {0xc651c000}, {0xc651e000}, 
-    {0xc6520000}, {0xc6522000}, {0xc6524000}, {0xc6526000}, 
-    {0xc6528000}, {0xc652a000}, {0xc652c000}, {0xc652e000}, 
-    {0xc6530000}, {0xc6532000}, {0xc6534000}, {0xc6536000}, 
-    {0xc6538000}, {0xc653a000}, {0xc653c000}, {0xc653e000}, 
-    {0xc6540000}, {0xc6542000}, {0xc6544000}, {0xc6546000}, 
-    {0xc6548000}, {0xc654a000}, {0xc654c000}, {0xc654e000}, 
-    {0xc6550000}, {0xc6552000}, {0xc6554000}, {0xc6556000}, 
-    {0xc6558000}, {0xc655a000}, {0xc655c000}, {0xc655e000}, 
-    {0xc6560000}, {0xc6562000}, {0xc6564000}, {0xc6566000}, 
-    {0xc6568000}, {0xc656a000}, {0xc656c000}, {0xc656e000}, 
-    {0xc6570000}, {0xc6572000}, {0xc6574000}, {0xc6576000}, 
-    {0xc6578000}, {0xc657a000}, {0xc657c000}, {0xc657e000}, 
-    {0xc6580000}, {0xc6582000}, {0xc6584000}, {0xc6586000}, 
-    {0xc6588000}, {0xc658a000}, {0xc658c000}, {0xc658e000}, 
-    {0xc6590000}, {0xc6592000}, {0xc6594000}, {0xc6596000}, 
-    {0xc6598000}, {0xc659a000}, {0xc659c000}, {0xc659e000}, 
-    {0xc65a0000}, {0xc65a2000}, {0xc65a4000}, {0xc65a6000}, 
-    {0xc65a8000}, {0xc65aa000}, {0xc65ac000}, {0xc65ae000}, 
-    {0xc65b0000}, {0xc65b2000}, {0xc65b4000}, {0xc65b6000}, 
-    {0xc65b8000}, {0xc65ba000}, {0xc65bc000}, {0xc65be000}, 
-    {0xc65c0000}, {0xc65c2000}, {0xc65c4000}, {0xc65c6000}, 
-    {0xc65c8000}, {0xc65ca000}, {0xc65cc000}, {0xc65ce000}, 
-    {0xc65d0000}, {0xc65d2000}, {0xc65d4000}, {0xc65d6000}, 
-    {0xc65d8000}, {0xc65da000}, {0xc65dc000}, {0xc65de000}, 
-    {0xc65e0000}, {0xc65e2000}, {0xc65e4000}, {0xc65e6000}, 
-    {0xc65e8000}, {0xc65ea000}, {0xc65ec000}, {0xc65ee000}, 
-    {0xc65f0000}, {0xc65f2000}, {0xc65f4000}, {0xc65f6000}, 
-    {0xc65f8000}, {0xc65fa000}, {0xc65fc000}, {0xc65fe000}, 
-    {0xc6600000}, {0xc6602000}, {0xc6604000}, {0xc6606000}, 
-    {0xc6608000}, {0xc660a000}, {0xc660c000}, {0xc660e000}, 
-    {0xc6610000}, {0xc6612000}, {0xc6614000}, {0xc6616000}, 
-    {0xc6618000}, {0xc661a000}, {0xc661c000}, {0xc661e000}, 
-    {0xc6620000}, {0xc6622000}, {0xc6624000}, {0xc6626000}, 
-    {0xc6628000}, {0xc662a000}, {0xc662c000}, {0xc662e000}, 
-    {0xc6630000}, {0xc6632000}, {0xc6634000}, {0xc6636000}, 
-    {0xc6638000}, {0xc663a000}, {0xc663c000}, {0xc663e000}, 
-    {0xc6640000}, {0xc6642000}, {0xc6644000}, {0xc6646000}, 
-    {0xc6648000}, {0xc664a000}, {0xc664c000}, {0xc664e000}, 
-    {0xc6650000}, {0xc6652000}, {0xc6654000}, {0xc6656000}, 
-    {0xc6658000}, {0xc665a000}, {0xc665c000}, {0xc665e000}, 
-    {0xc6660000}, {0xc6662000}, {0xc6664000}, {0xc6666000}, 
-    {0xc6668000}, {0xc666a000}, {0xc666c000}, {0xc666e000}, 
-    {0xc6670000}, {0xc6672000}, {0xc6674000}, {0xc6676000}, 
-    {0xc6678000}, {0xc667a000}, {0xc667c000}, {0xc667e000}, 
-    {0xc6680000}, {0xc6682000}, {0xc6684000}, {0xc6686000}, 
-    {0xc6688000}, {0xc668a000}, {0xc668c000}, {0xc668e000}, 
-    {0xc6690000}, {0xc6692000}, {0xc6694000}, {0xc6696000}, 
-    {0xc6698000}, {0xc669a000}, {0xc669c000}, {0xc669e000}, 
-    {0xc66a0000}, {0xc66a2000}, {0xc66a4000}, {0xc66a6000}, 
-    {0xc66a8000}, {0xc66aa000}, {0xc66ac000}, {0xc66ae000}, 
-    {0xc66b0000}, {0xc66b2000}, {0xc66b4000}, {0xc66b6000}, 
-    {0xc66b8000}, {0xc66ba000}, {0xc66bc000}, {0xc66be000}, 
-    {0xc66c0000}, {0xc66c2000}, {0xc66c4000}, {0xc66c6000}, 
-    {0xc66c8000}, {0xc66ca000}, {0xc66cc000}, {0xc66ce000}, 
-    {0xc66d0000}, {0xc66d2000}, {0xc66d4000}, {0xc66d6000}, 
-    {0xc66d8000}, {0xc66da000}, {0xc66dc000}, {0xc66de000}, 
-    {0xc66e0000}, {0xc66e2000}, {0xc66e4000}, {0xc66e6000}, 
-    {0xc66e8000}, {0xc66ea000}, {0xc66ec000}, {0xc66ee000}, 
-    {0xc66f0000}, {0xc66f2000}, {0xc66f4000}, {0xc66f6000}, 
-    {0xc66f8000}, {0xc66fa000}, {0xc66fc000}, {0xc66fe000}, 
-    {0xc6700000}, {0xc6702000}, {0xc6704000}, {0xc6706000}, 
-    {0xc6708000}, {0xc670a000}, {0xc670c000}, {0xc670e000}, 
-    {0xc6710000}, {0xc6712000}, {0xc6714000}, {0xc6716000}, 
-    {0xc6718000}, {0xc671a000}, {0xc671c000}, {0xc671e000}, 
-    {0xc6720000}, {0xc6722000}, {0xc6724000}, {0xc6726000}, 
-    {0xc6728000}, {0xc672a000}, {0xc672c000}, {0xc672e000}, 
-    {0xc6730000}, {0xc6732000}, {0xc6734000}, {0xc6736000}, 
-    {0xc6738000}, {0xc673a000}, {0xc673c000}, {0xc673e000}, 
-    {0xc6740000}, {0xc6742000}, {0xc6744000}, {0xc6746000}, 
-    {0xc6748000}, {0xc674a000}, {0xc674c000}, {0xc674e000}, 
-    {0xc6750000}, {0xc6752000}, {0xc6754000}, {0xc6756000}, 
-    {0xc6758000}, {0xc675a000}, {0xc675c000}, {0xc675e000}, 
-    {0xc6760000}, {0xc6762000}, {0xc6764000}, {0xc6766000}, 
-    {0xc6768000}, {0xc676a000}, {0xc676c000}, {0xc676e000}, 
-    {0xc6770000}, {0xc6772000}, {0xc6774000}, {0xc6776000}, 
-    {0xc6778000}, {0xc677a000}, {0xc677c000}, {0xc677e000}, 
-    {0xc6780000}, {0xc6782000}, {0xc6784000}, {0xc6786000}, 
-    {0xc6788000}, {0xc678a000}, {0xc678c000}, {0xc678e000}, 
-    {0xc6790000}, {0xc6792000}, {0xc6794000}, {0xc6796000}, 
-    {0xc6798000}, {0xc679a000}, {0xc679c000}, {0xc679e000}, 
-    {0xc67a0000}, {0xc67a2000}, {0xc67a4000}, {0xc67a6000}, 
-    {0xc67a8000}, {0xc67aa000}, {0xc67ac000}, {0xc67ae000}, 
-    {0xc67b0000}, {0xc67b2000}, {0xc67b4000}, {0xc67b6000}, 
-    {0xc67b8000}, {0xc67ba000}, {0xc67bc000}, {0xc67be000}, 
-    {0xc67c0000}, {0xc67c2000}, {0xc67c4000}, {0xc67c6000}, 
-    {0xc67c8000}, {0xc67ca000}, {0xc67cc000}, {0xc67ce000}, 
-    {0xc67d0000}, {0xc67d2000}, {0xc67d4000}, {0xc67d6000}, 
-    {0xc67d8000}, {0xc67da000}, {0xc67dc000}, {0xc67de000}, 
-    {0xc67e0000}, {0xc67e2000}, {0xc67e4000}, {0xc67e6000}, 
-    {0xc67e8000}, {0xc67ea000}, {0xc67ec000}, {0xc67ee000}, 
-    {0xc67f0000}, {0xc67f2000}, {0xc67f4000}, {0xc67f6000}, 
-    {0xc67f8000}, {0xc67fa000}, {0xc67fc000}, {0xc67fe000}, 
-    {0xc6800000}, {0xc6802000}, {0xc6804000}, {0xc6806000}, 
-    {0xc6808000}, {0xc680a000}, {0xc680c000}, {0xc680e000}, 
-    {0xc6810000}, {0xc6812000}, {0xc6814000}, {0xc6816000}, 
-    {0xc6818000}, {0xc681a000}, {0xc681c000}, {0xc681e000}, 
-    {0xc6820000}, {0xc6822000}, {0xc6824000}, {0xc6826000}, 
-    {0xc6828000}, {0xc682a000}, {0xc682c000}, {0xc682e000}, 
-    {0xc6830000}, {0xc6832000}, {0xc6834000}, {0xc6836000}, 
-    {0xc6838000}, {0xc683a000}, {0xc683c000}, {0xc683e000}, 
-    {0xc6840000}, {0xc6842000}, {0xc6844000}, {0xc6846000}, 
-    {0xc6848000}, {0xc684a000}, {0xc684c000}, {0xc684e000}, 
-    {0xc6850000}, {0xc6852000}, {0xc6854000}, {0xc6856000}, 
-    {0xc6858000}, {0xc685a000}, {0xc685c000}, {0xc685e000}, 
-    {0xc6860000}, {0xc6862000}, {0xc6864000}, {0xc6866000}, 
-    {0xc6868000}, {0xc686a000}, {0xc686c000}, {0xc686e000}, 
-    {0xc6870000}, {0xc6872000}, {0xc6874000}, {0xc6876000}, 
-    {0xc6878000}, {0xc687a000}, {0xc687c000}, {0xc687e000}, 
-    {0xc6880000}, {0xc6882000}, {0xc6884000}, {0xc6886000}, 
-    {0xc6888000}, {0xc688a000}, {0xc688c000}, {0xc688e000}, 
-    {0xc6890000}, {0xc6892000}, {0xc6894000}, {0xc6896000}, 
-    {0xc6898000}, {0xc689a000}, {0xc689c000}, {0xc689e000}, 
-    {0xc68a0000}, {0xc68a2000}, {0xc68a4000}, {0xc68a6000}, 
-    {0xc68a8000}, {0xc68aa000}, {0xc68ac000}, {0xc68ae000}, 
-    {0xc68b0000}, {0xc68b2000}, {0xc68b4000}, {0xc68b6000}, 
-    {0xc68b8000}, {0xc68ba000}, {0xc68bc000}, {0xc68be000}, 
-    {0xc68c0000}, {0xc68c2000}, {0xc68c4000}, {0xc68c6000}, 
-    {0xc68c8000}, {0xc68ca000}, {0xc68cc000}, {0xc68ce000}, 
-    {0xc68d0000}, {0xc68d2000}, {0xc68d4000}, {0xc68d6000}, 
-    {0xc68d8000}, {0xc68da000}, {0xc68dc000}, {0xc68de000}, 
-    {0xc68e0000}, {0xc68e2000}, {0xc68e4000}, {0xc68e6000}, 
-    {0xc68e8000}, {0xc68ea000}, {0xc68ec000}, {0xc68ee000}, 
-    {0xc68f0000}, {0xc68f2000}, {0xc68f4000}, {0xc68f6000}, 
-    {0xc68f8000}, {0xc68fa000}, {0xc68fc000}, {0xc68fe000}, 
-    {0xc6900000}, {0xc6902000}, {0xc6904000}, {0xc6906000}, 
-    {0xc6908000}, {0xc690a000}, {0xc690c000}, {0xc690e000}, 
-    {0xc6910000}, {0xc6912000}, {0xc6914000}, {0xc6916000}, 
-    {0xc6918000}, {0xc691a000}, {0xc691c000}, {0xc691e000}, 
-    {0xc6920000}, {0xc6922000}, {0xc6924000}, {0xc6926000}, 
-    {0xc6928000}, {0xc692a000}, {0xc692c000}, {0xc692e000}, 
-    {0xc6930000}, {0xc6932000}, {0xc6934000}, {0xc6936000}, 
-    {0xc6938000}, {0xc693a000}, {0xc693c000}, {0xc693e000}, 
-    {0xc6940000}, {0xc6942000}, {0xc6944000}, {0xc6946000}, 
-    {0xc6948000}, {0xc694a000}, {0xc694c000}, {0xc694e000}, 
-    {0xc6950000}, {0xc6952000}, {0xc6954000}, {0xc6956000}, 
-    {0xc6958000}, {0xc695a000}, {0xc695c000}, {0xc695e000}, 
-    {0xc6960000}, {0xc6962000}, {0xc6964000}, {0xc6966000}, 
-    {0xc6968000}, {0xc696a000}, {0xc696c000}, {0xc696e000}, 
-    {0xc6970000}, {0xc6972000}, {0xc6974000}, {0xc6976000}, 
-    {0xc6978000}, {0xc697a000}, {0xc697c000}, {0xc697e000}, 
-    {0xc6980000}, {0xc6982000}, {0xc6984000}, {0xc6986000}, 
-    {0xc6988000}, {0xc698a000}, {0xc698c000}, {0xc698e000}, 
-    {0xc6990000}, {0xc6992000}, {0xc6994000}, {0xc6996000}, 
-    {0xc6998000}, {0xc699a000}, {0xc699c000}, {0xc699e000}, 
-    {0xc69a0000}, {0xc69a2000}, {0xc69a4000}, {0xc69a6000}, 
-    {0xc69a8000}, {0xc69aa000}, {0xc69ac000}, {0xc69ae000}, 
-    {0xc69b0000}, {0xc69b2000}, {0xc69b4000}, {0xc69b6000}, 
-    {0xc69b8000}, {0xc69ba000}, {0xc69bc000}, {0xc69be000}, 
-    {0xc69c0000}, {0xc69c2000}, {0xc69c4000}, {0xc69c6000}, 
-    {0xc69c8000}, {0xc69ca000}, {0xc69cc000}, {0xc69ce000}, 
-    {0xc69d0000}, {0xc69d2000}, {0xc69d4000}, {0xc69d6000}, 
-    {0xc69d8000}, {0xc69da000}, {0xc69dc000}, {0xc69de000}, 
-    {0xc69e0000}, {0xc69e2000}, {0xc69e4000}, {0xc69e6000}, 
-    {0xc69e8000}, {0xc69ea000}, {0xc69ec000}, {0xc69ee000}, 
-    {0xc69f0000}, {0xc69f2000}, {0xc69f4000}, {0xc69f6000}, 
-    {0xc69f8000}, {0xc69fa000}, {0xc69fc000}, {0xc69fe000}, 
-    {0xc6a00000}, {0xc6a02000}, {0xc6a04000}, {0xc6a06000}, 
-    {0xc6a08000}, {0xc6a0a000}, {0xc6a0c000}, {0xc6a0e000}, 
-    {0xc6a10000}, {0xc6a12000}, {0xc6a14000}, {0xc6a16000}, 
-    {0xc6a18000}, {0xc6a1a000}, {0xc6a1c000}, {0xc6a1e000}, 
-    {0xc6a20000}, {0xc6a22000}, {0xc6a24000}, {0xc6a26000}, 
-    {0xc6a28000}, {0xc6a2a000}, {0xc6a2c000}, {0xc6a2e000}, 
-    {0xc6a30000}, {0xc6a32000}, {0xc6a34000}, {0xc6a36000}, 
-    {0xc6a38000}, {0xc6a3a000}, {0xc6a3c000}, {0xc6a3e000}, 
-    {0xc6a40000}, {0xc6a42000}, {0xc6a44000}, {0xc6a46000}, 
-    {0xc6a48000}, {0xc6a4a000}, {0xc6a4c000}, {0xc6a4e000}, 
-    {0xc6a50000}, {0xc6a52000}, {0xc6a54000}, {0xc6a56000}, 
-    {0xc6a58000}, {0xc6a5a000}, {0xc6a5c000}, {0xc6a5e000}, 
-    {0xc6a60000}, {0xc6a62000}, {0xc6a64000}, {0xc6a66000}, 
-    {0xc6a68000}, {0xc6a6a000}, {0xc6a6c000}, {0xc6a6e000}, 
-    {0xc6a70000}, {0xc6a72000}, {0xc6a74000}, {0xc6a76000}, 
-    {0xc6a78000}, {0xc6a7a000}, {0xc6a7c000}, {0xc6a7e000}, 
-    {0xc6a80000}, {0xc6a82000}, {0xc6a84000}, {0xc6a86000}, 
-    {0xc6a88000}, {0xc6a8a000}, {0xc6a8c000}, {0xc6a8e000}, 
-    {0xc6a90000}, {0xc6a92000}, {0xc6a94000}, {0xc6a96000}, 
-    {0xc6a98000}, {0xc6a9a000}, {0xc6a9c000}, {0xc6a9e000}, 
-    {0xc6aa0000}, {0xc6aa2000}, {0xc6aa4000}, {0xc6aa6000}, 
-    {0xc6aa8000}, {0xc6aaa000}, {0xc6aac000}, {0xc6aae000}, 
-    {0xc6ab0000}, {0xc6ab2000}, {0xc6ab4000}, {0xc6ab6000}, 
-    {0xc6ab8000}, {0xc6aba000}, {0xc6abc000}, {0xc6abe000}, 
-    {0xc6ac0000}, {0xc6ac2000}, {0xc6ac4000}, {0xc6ac6000}, 
-    {0xc6ac8000}, {0xc6aca000}, {0xc6acc000}, {0xc6ace000}, 
-    {0xc6ad0000}, {0xc6ad2000}, {0xc6ad4000}, {0xc6ad6000}, 
-    {0xc6ad8000}, {0xc6ada000}, {0xc6adc000}, {0xc6ade000}, 
-    {0xc6ae0000}, {0xc6ae2000}, {0xc6ae4000}, {0xc6ae6000}, 
-    {0xc6ae8000}, {0xc6aea000}, {0xc6aec000}, {0xc6aee000}, 
-    {0xc6af0000}, {0xc6af2000}, {0xc6af4000}, {0xc6af6000}, 
-    {0xc6af8000}, {0xc6afa000}, {0xc6afc000}, {0xc6afe000}, 
-    {0xc6b00000}, {0xc6b02000}, {0xc6b04000}, {0xc6b06000}, 
-    {0xc6b08000}, {0xc6b0a000}, {0xc6b0c000}, {0xc6b0e000}, 
-    {0xc6b10000}, {0xc6b12000}, {0xc6b14000}, {0xc6b16000}, 
-    {0xc6b18000}, {0xc6b1a000}, {0xc6b1c000}, {0xc6b1e000}, 
-    {0xc6b20000}, {0xc6b22000}, {0xc6b24000}, {0xc6b26000}, 
-    {0xc6b28000}, {0xc6b2a000}, {0xc6b2c000}, {0xc6b2e000}, 
-    {0xc6b30000}, {0xc6b32000}, {0xc6b34000}, {0xc6b36000}, 
-    {0xc6b38000}, {0xc6b3a000}, {0xc6b3c000}, {0xc6b3e000}, 
-    {0xc6b40000}, {0xc6b42000}, {0xc6b44000}, {0xc6b46000}, 
-    {0xc6b48000}, {0xc6b4a000}, {0xc6b4c000}, {0xc6b4e000}, 
-    {0xc6b50000}, {0xc6b52000}, {0xc6b54000}, {0xc6b56000}, 
-    {0xc6b58000}, {0xc6b5a000}, {0xc6b5c000}, {0xc6b5e000}, 
-    {0xc6b60000}, {0xc6b62000}, {0xc6b64000}, {0xc6b66000}, 
-    {0xc6b68000}, {0xc6b6a000}, {0xc6b6c000}, {0xc6b6e000}, 
-    {0xc6b70000}, {0xc6b72000}, {0xc6b74000}, {0xc6b76000}, 
-    {0xc6b78000}, {0xc6b7a000}, {0xc6b7c000}, {0xc6b7e000}, 
-    {0xc6b80000}, {0xc6b82000}, {0xc6b84000}, {0xc6b86000}, 
-    {0xc6b88000}, {0xc6b8a000}, {0xc6b8c000}, {0xc6b8e000}, 
-    {0xc6b90000}, {0xc6b92000}, {0xc6b94000}, {0xc6b96000}, 
-    {0xc6b98000}, {0xc6b9a000}, {0xc6b9c000}, {0xc6b9e000}, 
-    {0xc6ba0000}, {0xc6ba2000}, {0xc6ba4000}, {0xc6ba6000}, 
-    {0xc6ba8000}, {0xc6baa000}, {0xc6bac000}, {0xc6bae000}, 
-    {0xc6bb0000}, {0xc6bb2000}, {0xc6bb4000}, {0xc6bb6000}, 
-    {0xc6bb8000}, {0xc6bba000}, {0xc6bbc000}, {0xc6bbe000}, 
-    {0xc6bc0000}, {0xc6bc2000}, {0xc6bc4000}, {0xc6bc6000}, 
-    {0xc6bc8000}, {0xc6bca000}, {0xc6bcc000}, {0xc6bce000}, 
-    {0xc6bd0000}, {0xc6bd2000}, {0xc6bd4000}, {0xc6bd6000}, 
-    {0xc6bd8000}, {0xc6bda000}, {0xc6bdc000}, {0xc6bde000}, 
-    {0xc6be0000}, {0xc6be2000}, {0xc6be4000}, {0xc6be6000}, 
-    {0xc6be8000}, {0xc6bea000}, {0xc6bec000}, {0xc6bee000}, 
-    {0xc6bf0000}, {0xc6bf2000}, {0xc6bf4000}, {0xc6bf6000}, 
-    {0xc6bf8000}, {0xc6bfa000}, {0xc6bfc000}, {0xc6bfe000}, 
-    {0xc6c00000}, {0xc6c02000}, {0xc6c04000}, {0xc6c06000}, 
-    {0xc6c08000}, {0xc6c0a000}, {0xc6c0c000}, {0xc6c0e000}, 
-    {0xc6c10000}, {0xc6c12000}, {0xc6c14000}, {0xc6c16000}, 
-    {0xc6c18000}, {0xc6c1a000}, {0xc6c1c000}, {0xc6c1e000}, 
-    {0xc6c20000}, {0xc6c22000}, {0xc6c24000}, {0xc6c26000}, 
-    {0xc6c28000}, {0xc6c2a000}, {0xc6c2c000}, {0xc6c2e000}, 
-    {0xc6c30000}, {0xc6c32000}, {0xc6c34000}, {0xc6c36000}, 
-    {0xc6c38000}, {0xc6c3a000}, {0xc6c3c000}, {0xc6c3e000}, 
-    {0xc6c40000}, {0xc6c42000}, {0xc6c44000}, {0xc6c46000}, 
-    {0xc6c48000}, {0xc6c4a000}, {0xc6c4c000}, {0xc6c4e000}, 
-    {0xc6c50000}, {0xc6c52000}, {0xc6c54000}, {0xc6c56000}, 
-    {0xc6c58000}, {0xc6c5a000}, {0xc6c5c000}, {0xc6c5e000}, 
-    {0xc6c60000}, {0xc6c62000}, {0xc6c64000}, {0xc6c66000}, 
-    {0xc6c68000}, {0xc6c6a000}, {0xc6c6c000}, {0xc6c6e000}, 
-    {0xc6c70000}, {0xc6c72000}, {0xc6c74000}, {0xc6c76000}, 
-    {0xc6c78000}, {0xc6c7a000}, {0xc6c7c000}, {0xc6c7e000}, 
-    {0xc6c80000}, {0xc6c82000}, {0xc6c84000}, {0xc6c86000}, 
-    {0xc6c88000}, {0xc6c8a000}, {0xc6c8c000}, {0xc6c8e000}, 
-    {0xc6c90000}, {0xc6c92000}, {0xc6c94000}, {0xc6c96000}, 
-    {0xc6c98000}, {0xc6c9a000}, {0xc6c9c000}, {0xc6c9e000}, 
-    {0xc6ca0000}, {0xc6ca2000}, {0xc6ca4000}, {0xc6ca6000}, 
-    {0xc6ca8000}, {0xc6caa000}, {0xc6cac000}, {0xc6cae000}, 
-    {0xc6cb0000}, {0xc6cb2000}, {0xc6cb4000}, {0xc6cb6000}, 
-    {0xc6cb8000}, {0xc6cba000}, {0xc6cbc000}, {0xc6cbe000}, 
-    {0xc6cc0000}, {0xc6cc2000}, {0xc6cc4000}, {0xc6cc6000}, 
-    {0xc6cc8000}, {0xc6cca000}, {0xc6ccc000}, {0xc6cce000}, 
-    {0xc6cd0000}, {0xc6cd2000}, {0xc6cd4000}, {0xc6cd6000}, 
-    {0xc6cd8000}, {0xc6cda000}, {0xc6cdc000}, {0xc6cde000}, 
-    {0xc6ce0000}, {0xc6ce2000}, {0xc6ce4000}, {0xc6ce6000}, 
-    {0xc6ce8000}, {0xc6cea000}, {0xc6cec000}, {0xc6cee000}, 
-    {0xc6cf0000}, {0xc6cf2000}, {0xc6cf4000}, {0xc6cf6000}, 
-    {0xc6cf8000}, {0xc6cfa000}, {0xc6cfc000}, {0xc6cfe000}, 
-    {0xc6d00000}, {0xc6d02000}, {0xc6d04000}, {0xc6d06000}, 
-    {0xc6d08000}, {0xc6d0a000}, {0xc6d0c000}, {0xc6d0e000}, 
-    {0xc6d10000}, {0xc6d12000}, {0xc6d14000}, {0xc6d16000}, 
-    {0xc6d18000}, {0xc6d1a000}, {0xc6d1c000}, {0xc6d1e000}, 
-    {0xc6d20000}, {0xc6d22000}, {0xc6d24000}, {0xc6d26000}, 
-    {0xc6d28000}, {0xc6d2a000}, {0xc6d2c000}, {0xc6d2e000}, 
-    {0xc6d30000}, {0xc6d32000}, {0xc6d34000}, {0xc6d36000}, 
-    {0xc6d38000}, {0xc6d3a000}, {0xc6d3c000}, {0xc6d3e000}, 
-    {0xc6d40000}, {0xc6d42000}, {0xc6d44000}, {0xc6d46000}, 
-    {0xc6d48000}, {0xc6d4a000}, {0xc6d4c000}, {0xc6d4e000}, 
-    {0xc6d50000}, {0xc6d52000}, {0xc6d54000}, {0xc6d56000}, 
-    {0xc6d58000}, {0xc6d5a000}, {0xc6d5c000}, {0xc6d5e000}, 
-    {0xc6d60000}, {0xc6d62000}, {0xc6d64000}, {0xc6d66000}, 
-    {0xc6d68000}, {0xc6d6a000}, {0xc6d6c000}, {0xc6d6e000}, 
-    {0xc6d70000}, {0xc6d72000}, {0xc6d74000}, {0xc6d76000}, 
-    {0xc6d78000}, {0xc6d7a000}, {0xc6d7c000}, {0xc6d7e000}, 
-    {0xc6d80000}, {0xc6d82000}, {0xc6d84000}, {0xc6d86000}, 
-    {0xc6d88000}, {0xc6d8a000}, {0xc6d8c000}, {0xc6d8e000}, 
-    {0xc6d90000}, {0xc6d92000}, {0xc6d94000}, {0xc6d96000}, 
-    {0xc6d98000}, {0xc6d9a000}, {0xc6d9c000}, {0xc6d9e000}, 
-    {0xc6da0000}, {0xc6da2000}, {0xc6da4000}, {0xc6da6000}, 
-    {0xc6da8000}, {0xc6daa000}, {0xc6dac000}, {0xc6dae000}, 
-    {0xc6db0000}, {0xc6db2000}, {0xc6db4000}, {0xc6db6000}, 
-    {0xc6db8000}, {0xc6dba000}, {0xc6dbc000}, {0xc6dbe000}, 
-    {0xc6dc0000}, {0xc6dc2000}, {0xc6dc4000}, {0xc6dc6000}, 
-    {0xc6dc8000}, {0xc6dca000}, {0xc6dcc000}, {0xc6dce000}, 
-    {0xc6dd0000}, {0xc6dd2000}, {0xc6dd4000}, {0xc6dd6000}, 
-    {0xc6dd8000}, {0xc6dda000}, {0xc6ddc000}, {0xc6dde000}, 
-    {0xc6de0000}, {0xc6de2000}, {0xc6de4000}, {0xc6de6000}, 
-    {0xc6de8000}, {0xc6dea000}, {0xc6dec000}, {0xc6dee000}, 
-    {0xc6df0000}, {0xc6df2000}, {0xc6df4000}, {0xc6df6000}, 
-    {0xc6df8000}, {0xc6dfa000}, {0xc6dfc000}, {0xc6dfe000}, 
-    {0xc6e00000}, {0xc6e02000}, {0xc6e04000}, {0xc6e06000}, 
-    {0xc6e08000}, {0xc6e0a000}, {0xc6e0c000}, {0xc6e0e000}, 
-    {0xc6e10000}, {0xc6e12000}, {0xc6e14000}, {0xc6e16000}, 
-    {0xc6e18000}, {0xc6e1a000}, {0xc6e1c000}, {0xc6e1e000}, 
-    {0xc6e20000}, {0xc6e22000}, {0xc6e24000}, {0xc6e26000}, 
-    {0xc6e28000}, {0xc6e2a000}, {0xc6e2c000}, {0xc6e2e000}, 
-    {0xc6e30000}, {0xc6e32000}, {0xc6e34000}, {0xc6e36000}, 
-    {0xc6e38000}, {0xc6e3a000}, {0xc6e3c000}, {0xc6e3e000}, 
-    {0xc6e40000}, {0xc6e42000}, {0xc6e44000}, {0xc6e46000}, 
-    {0xc6e48000}, {0xc6e4a000}, {0xc6e4c000}, {0xc6e4e000}, 
-    {0xc6e50000}, {0xc6e52000}, {0xc6e54000}, {0xc6e56000}, 
-    {0xc6e58000}, {0xc6e5a000}, {0xc6e5c000}, {0xc6e5e000}, 
-    {0xc6e60000}, {0xc6e62000}, {0xc6e64000}, {0xc6e66000}, 
-    {0xc6e68000}, {0xc6e6a000}, {0xc6e6c000}, {0xc6e6e000}, 
-    {0xc6e70000}, {0xc6e72000}, {0xc6e74000}, {0xc6e76000}, 
-    {0xc6e78000}, {0xc6e7a000}, {0xc6e7c000}, {0xc6e7e000}, 
-    {0xc6e80000}, {0xc6e82000}, {0xc6e84000}, {0xc6e86000}, 
-    {0xc6e88000}, {0xc6e8a000}, {0xc6e8c000}, {0xc6e8e000}, 
-    {0xc6e90000}, {0xc6e92000}, {0xc6e94000}, {0xc6e96000}, 
-    {0xc6e98000}, {0xc6e9a000}, {0xc6e9c000}, {0xc6e9e000}, 
-    {0xc6ea0000}, {0xc6ea2000}, {0xc6ea4000}, {0xc6ea6000}, 
-    {0xc6ea8000}, {0xc6eaa000}, {0xc6eac000}, {0xc6eae000}, 
-    {0xc6eb0000}, {0xc6eb2000}, {0xc6eb4000}, {0xc6eb6000}, 
-    {0xc6eb8000}, {0xc6eba000}, {0xc6ebc000}, {0xc6ebe000}, 
-    {0xc6ec0000}, {0xc6ec2000}, {0xc6ec4000}, {0xc6ec6000}, 
-    {0xc6ec8000}, {0xc6eca000}, {0xc6ecc000}, {0xc6ece000}, 
-    {0xc6ed0000}, {0xc6ed2000}, {0xc6ed4000}, {0xc6ed6000}, 
-    {0xc6ed8000}, {0xc6eda000}, {0xc6edc000}, {0xc6ede000}, 
-    {0xc6ee0000}, {0xc6ee2000}, {0xc6ee4000}, {0xc6ee6000}, 
-    {0xc6ee8000}, {0xc6eea000}, {0xc6eec000}, {0xc6eee000}, 
-    {0xc6ef0000}, {0xc6ef2000}, {0xc6ef4000}, {0xc6ef6000}, 
-    {0xc6ef8000}, {0xc6efa000}, {0xc6efc000}, {0xc6efe000}, 
-    {0xc6f00000}, {0xc6f02000}, {0xc6f04000}, {0xc6f06000}, 
-    {0xc6f08000}, {0xc6f0a000}, {0xc6f0c000}, {0xc6f0e000}, 
-    {0xc6f10000}, {0xc6f12000}, {0xc6f14000}, {0xc6f16000}, 
-    {0xc6f18000}, {0xc6f1a000}, {0xc6f1c000}, {0xc6f1e000}, 
-    {0xc6f20000}, {0xc6f22000}, {0xc6f24000}, {0xc6f26000}, 
-    {0xc6f28000}, {0xc6f2a000}, {0xc6f2c000}, {0xc6f2e000}, 
-    {0xc6f30000}, {0xc6f32000}, {0xc6f34000}, {0xc6f36000}, 
-    {0xc6f38000}, {0xc6f3a000}, {0xc6f3c000}, {0xc6f3e000}, 
-    {0xc6f40000}, {0xc6f42000}, {0xc6f44000}, {0xc6f46000}, 
-    {0xc6f48000}, {0xc6f4a000}, {0xc6f4c000}, {0xc6f4e000}, 
-    {0xc6f50000}, {0xc6f52000}, {0xc6f54000}, {0xc6f56000}, 
-    {0xc6f58000}, {0xc6f5a000}, {0xc6f5c000}, {0xc6f5e000}, 
-    {0xc6f60000}, {0xc6f62000}, {0xc6f64000}, {0xc6f66000}, 
-    {0xc6f68000}, {0xc6f6a000}, {0xc6f6c000}, {0xc6f6e000}, 
-    {0xc6f70000}, {0xc6f72000}, {0xc6f74000}, {0xc6f76000}, 
-    {0xc6f78000}, {0xc6f7a000}, {0xc6f7c000}, {0xc6f7e000}, 
-    {0xc6f80000}, {0xc6f82000}, {0xc6f84000}, {0xc6f86000}, 
-    {0xc6f88000}, {0xc6f8a000}, {0xc6f8c000}, {0xc6f8e000}, 
-    {0xc6f90000}, {0xc6f92000}, {0xc6f94000}, {0xc6f96000}, 
-    {0xc6f98000}, {0xc6f9a000}, {0xc6f9c000}, {0xc6f9e000}, 
-    {0xc6fa0000}, {0xc6fa2000}, {0xc6fa4000}, {0xc6fa6000}, 
-    {0xc6fa8000}, {0xc6faa000}, {0xc6fac000}, {0xc6fae000}, 
-    {0xc6fb0000}, {0xc6fb2000}, {0xc6fb4000}, {0xc6fb6000}, 
-    {0xc6fb8000}, {0xc6fba000}, {0xc6fbc000}, {0xc6fbe000}, 
-    {0xc6fc0000}, {0xc6fc2000}, {0xc6fc4000}, {0xc6fc6000}, 
-    {0xc6fc8000}, {0xc6fca000}, {0xc6fcc000}, {0xc6fce000}, 
-    {0xc6fd0000}, {0xc6fd2000}, {0xc6fd4000}, {0xc6fd6000}, 
-    {0xc6fd8000}, {0xc6fda000}, {0xc6fdc000}, {0xc6fde000}, 
-    {0xc6fe0000}, {0xc6fe2000}, {0xc6fe4000}, {0xc6fe6000}, 
-    {0xc6fe8000}, {0xc6fea000}, {0xc6fec000}, {0xc6fee000}, 
-    {0xc6ff0000}, {0xc6ff2000}, {0xc6ff4000}, {0xc6ff6000}, 
-    {0xc6ff8000}, {0xc6ffa000}, {0xc6ffc000}, {0xc6ffe000}, 
-    {0xc7000000}, {0xc7002000}, {0xc7004000}, {0xc7006000}, 
-    {0xc7008000}, {0xc700a000}, {0xc700c000}, {0xc700e000}, 
-    {0xc7010000}, {0xc7012000}, {0xc7014000}, {0xc7016000}, 
-    {0xc7018000}, {0xc701a000}, {0xc701c000}, {0xc701e000}, 
-    {0xc7020000}, {0xc7022000}, {0xc7024000}, {0xc7026000}, 
-    {0xc7028000}, {0xc702a000}, {0xc702c000}, {0xc702e000}, 
-    {0xc7030000}, {0xc7032000}, {0xc7034000}, {0xc7036000}, 
-    {0xc7038000}, {0xc703a000}, {0xc703c000}, {0xc703e000}, 
-    {0xc7040000}, {0xc7042000}, {0xc7044000}, {0xc7046000}, 
-    {0xc7048000}, {0xc704a000}, {0xc704c000}, {0xc704e000}, 
-    {0xc7050000}, {0xc7052000}, {0xc7054000}, {0xc7056000}, 
-    {0xc7058000}, {0xc705a000}, {0xc705c000}, {0xc705e000}, 
-    {0xc7060000}, {0xc7062000}, {0xc7064000}, {0xc7066000}, 
-    {0xc7068000}, {0xc706a000}, {0xc706c000}, {0xc706e000}, 
-    {0xc7070000}, {0xc7072000}, {0xc7074000}, {0xc7076000}, 
-    {0xc7078000}, {0xc707a000}, {0xc707c000}, {0xc707e000}, 
-    {0xc7080000}, {0xc7082000}, {0xc7084000}, {0xc7086000}, 
-    {0xc7088000}, {0xc708a000}, {0xc708c000}, {0xc708e000}, 
-    {0xc7090000}, {0xc7092000}, {0xc7094000}, {0xc7096000}, 
-    {0xc7098000}, {0xc709a000}, {0xc709c000}, {0xc709e000}, 
-    {0xc70a0000}, {0xc70a2000}, {0xc70a4000}, {0xc70a6000}, 
-    {0xc70a8000}, {0xc70aa000}, {0xc70ac000}, {0xc70ae000}, 
-    {0xc70b0000}, {0xc70b2000}, {0xc70b4000}, {0xc70b6000}, 
-    {0xc70b8000}, {0xc70ba000}, {0xc70bc000}, {0xc70be000}, 
-    {0xc70c0000}, {0xc70c2000}, {0xc70c4000}, {0xc70c6000}, 
-    {0xc70c8000}, {0xc70ca000}, {0xc70cc000}, {0xc70ce000}, 
-    {0xc70d0000}, {0xc70d2000}, {0xc70d4000}, {0xc70d6000}, 
-    {0xc70d8000}, {0xc70da000}, {0xc70dc000}, {0xc70de000}, 
-    {0xc70e0000}, {0xc70e2000}, {0xc70e4000}, {0xc70e6000}, 
-    {0xc70e8000}, {0xc70ea000}, {0xc70ec000}, {0xc70ee000}, 
-    {0xc70f0000}, {0xc70f2000}, {0xc70f4000}, {0xc70f6000}, 
-    {0xc70f8000}, {0xc70fa000}, {0xc70fc000}, {0xc70fe000}, 
-    {0xc7100000}, {0xc7102000}, {0xc7104000}, {0xc7106000}, 
-    {0xc7108000}, {0xc710a000}, {0xc710c000}, {0xc710e000}, 
-    {0xc7110000}, {0xc7112000}, {0xc7114000}, {0xc7116000}, 
-    {0xc7118000}, {0xc711a000}, {0xc711c000}, {0xc711e000}, 
-    {0xc7120000}, {0xc7122000}, {0xc7124000}, {0xc7126000}, 
-    {0xc7128000}, {0xc712a000}, {0xc712c000}, {0xc712e000}, 
-    {0xc7130000}, {0xc7132000}, {0xc7134000}, {0xc7136000}, 
-    {0xc7138000}, {0xc713a000}, {0xc713c000}, {0xc713e000}, 
-    {0xc7140000}, {0xc7142000}, {0xc7144000}, {0xc7146000}, 
-    {0xc7148000}, {0xc714a000}, {0xc714c000}, {0xc714e000}, 
-    {0xc7150000}, {0xc7152000}, {0xc7154000}, {0xc7156000}, 
-    {0xc7158000}, {0xc715a000}, {0xc715c000}, {0xc715e000}, 
-    {0xc7160000}, {0xc7162000}, {0xc7164000}, {0xc7166000}, 
-    {0xc7168000}, {0xc716a000}, {0xc716c000}, {0xc716e000}, 
-    {0xc7170000}, {0xc7172000}, {0xc7174000}, {0xc7176000}, 
-    {0xc7178000}, {0xc717a000}, {0xc717c000}, {0xc717e000}, 
-    {0xc7180000}, {0xc7182000}, {0xc7184000}, {0xc7186000}, 
-    {0xc7188000}, {0xc718a000}, {0xc718c000}, {0xc718e000}, 
-    {0xc7190000}, {0xc7192000}, {0xc7194000}, {0xc7196000}, 
-    {0xc7198000}, {0xc719a000}, {0xc719c000}, {0xc719e000}, 
-    {0xc71a0000}, {0xc71a2000}, {0xc71a4000}, {0xc71a6000}, 
-    {0xc71a8000}, {0xc71aa000}, {0xc71ac000}, {0xc71ae000}, 
-    {0xc71b0000}, {0xc71b2000}, {0xc71b4000}, {0xc71b6000}, 
-    {0xc71b8000}, {0xc71ba000}, {0xc71bc000}, {0xc71be000}, 
-    {0xc71c0000}, {0xc71c2000}, {0xc71c4000}, {0xc71c6000}, 
-    {0xc71c8000}, {0xc71ca000}, {0xc71cc000}, {0xc71ce000}, 
-    {0xc71d0000}, {0xc71d2000}, {0xc71d4000}, {0xc71d6000}, 
-    {0xc71d8000}, {0xc71da000}, {0xc71dc000}, {0xc71de000}, 
-    {0xc71e0000}, {0xc71e2000}, {0xc71e4000}, {0xc71e6000}, 
-    {0xc71e8000}, {0xc71ea000}, {0xc71ec000}, {0xc71ee000}, 
-    {0xc71f0000}, {0xc71f2000}, {0xc71f4000}, {0xc71f6000}, 
-    {0xc71f8000}, {0xc71fa000}, {0xc71fc000}, {0xc71fe000}, 
-    {0xc7200000}, {0xc7202000}, {0xc7204000}, {0xc7206000}, 
-    {0xc7208000}, {0xc720a000}, {0xc720c000}, {0xc720e000}, 
-    {0xc7210000}, {0xc7212000}, {0xc7214000}, {0xc7216000}, 
-    {0xc7218000}, {0xc721a000}, {0xc721c000}, {0xc721e000}, 
-    {0xc7220000}, {0xc7222000}, {0xc7224000}, {0xc7226000}, 
-    {0xc7228000}, {0xc722a000}, {0xc722c000}, {0xc722e000}, 
-    {0xc7230000}, {0xc7232000}, {0xc7234000}, {0xc7236000}, 
-    {0xc7238000}, {0xc723a000}, {0xc723c000}, {0xc723e000}, 
-    {0xc7240000}, {0xc7242000}, {0xc7244000}, {0xc7246000}, 
-    {0xc7248000}, {0xc724a000}, {0xc724c000}, {0xc724e000}, 
-    {0xc7250000}, {0xc7252000}, {0xc7254000}, {0xc7256000}, 
-    {0xc7258000}, {0xc725a000}, {0xc725c000}, {0xc725e000}, 
-    {0xc7260000}, {0xc7262000}, {0xc7264000}, {0xc7266000}, 
-    {0xc7268000}, {0xc726a000}, {0xc726c000}, {0xc726e000}, 
-    {0xc7270000}, {0xc7272000}, {0xc7274000}, {0xc7276000}, 
-    {0xc7278000}, {0xc727a000}, {0xc727c000}, {0xc727e000}, 
-    {0xc7280000}, {0xc7282000}, {0xc7284000}, {0xc7286000}, 
-    {0xc7288000}, {0xc728a000}, {0xc728c000}, {0xc728e000}, 
-    {0xc7290000}, {0xc7292000}, {0xc7294000}, {0xc7296000}, 
-    {0xc7298000}, {0xc729a000}, {0xc729c000}, {0xc729e000}, 
-    {0xc72a0000}, {0xc72a2000}, {0xc72a4000}, {0xc72a6000}, 
-    {0xc72a8000}, {0xc72aa000}, {0xc72ac000}, {0xc72ae000}, 
-    {0xc72b0000}, {0xc72b2000}, {0xc72b4000}, {0xc72b6000}, 
-    {0xc72b8000}, {0xc72ba000}, {0xc72bc000}, {0xc72be000}, 
-    {0xc72c0000}, {0xc72c2000}, {0xc72c4000}, {0xc72c6000}, 
-    {0xc72c8000}, {0xc72ca000}, {0xc72cc000}, {0xc72ce000}, 
-    {0xc72d0000}, {0xc72d2000}, {0xc72d4000}, {0xc72d6000}, 
-    {0xc72d8000}, {0xc72da000}, {0xc72dc000}, {0xc72de000}, 
-    {0xc72e0000}, {0xc72e2000}, {0xc72e4000}, {0xc72e6000}, 
-    {0xc72e8000}, {0xc72ea000}, {0xc72ec000}, {0xc72ee000}, 
-    {0xc72f0000}, {0xc72f2000}, {0xc72f4000}, {0xc72f6000}, 
-    {0xc72f8000}, {0xc72fa000}, {0xc72fc000}, {0xc72fe000}, 
-    {0xc7300000}, {0xc7302000}, {0xc7304000}, {0xc7306000}, 
-    {0xc7308000}, {0xc730a000}, {0xc730c000}, {0xc730e000}, 
-    {0xc7310000}, {0xc7312000}, {0xc7314000}, {0xc7316000}, 
-    {0xc7318000}, {0xc731a000}, {0xc731c000}, {0xc731e000}, 
-    {0xc7320000}, {0xc7322000}, {0xc7324000}, {0xc7326000}, 
-    {0xc7328000}, {0xc732a000}, {0xc732c000}, {0xc732e000}, 
-    {0xc7330000}, {0xc7332000}, {0xc7334000}, {0xc7336000}, 
-    {0xc7338000}, {0xc733a000}, {0xc733c000}, {0xc733e000}, 
-    {0xc7340000}, {0xc7342000}, {0xc7344000}, {0xc7346000}, 
-    {0xc7348000}, {0xc734a000}, {0xc734c000}, {0xc734e000}, 
-    {0xc7350000}, {0xc7352000}, {0xc7354000}, {0xc7356000}, 
-    {0xc7358000}, {0xc735a000}, {0xc735c000}, {0xc735e000}, 
-    {0xc7360000}, {0xc7362000}, {0xc7364000}, {0xc7366000}, 
-    {0xc7368000}, {0xc736a000}, {0xc736c000}, {0xc736e000}, 
-    {0xc7370000}, {0xc7372000}, {0xc7374000}, {0xc7376000}, 
-    {0xc7378000}, {0xc737a000}, {0xc737c000}, {0xc737e000}, 
-    {0xc7380000}, {0xc7382000}, {0xc7384000}, {0xc7386000}, 
-    {0xc7388000}, {0xc738a000}, {0xc738c000}, {0xc738e000}, 
-    {0xc7390000}, {0xc7392000}, {0xc7394000}, {0xc7396000}, 
-    {0xc7398000}, {0xc739a000}, {0xc739c000}, {0xc739e000}, 
-    {0xc73a0000}, {0xc73a2000}, {0xc73a4000}, {0xc73a6000}, 
-    {0xc73a8000}, {0xc73aa000}, {0xc73ac000}, {0xc73ae000}, 
-    {0xc73b0000}, {0xc73b2000}, {0xc73b4000}, {0xc73b6000}, 
-    {0xc73b8000}, {0xc73ba000}, {0xc73bc000}, {0xc73be000}, 
-    {0xc73c0000}, {0xc73c2000}, {0xc73c4000}, {0xc73c6000}, 
-    {0xc73c8000}, {0xc73ca000}, {0xc73cc000}, {0xc73ce000}, 
-    {0xc73d0000}, {0xc73d2000}, {0xc73d4000}, {0xc73d6000}, 
-    {0xc73d8000}, {0xc73da000}, {0xc73dc000}, {0xc73de000}, 
-    {0xc73e0000}, {0xc73e2000}, {0xc73e4000}, {0xc73e6000}, 
-    {0xc73e8000}, {0xc73ea000}, {0xc73ec000}, {0xc73ee000}, 
-    {0xc73f0000}, {0xc73f2000}, {0xc73f4000}, {0xc73f6000}, 
-    {0xc73f8000}, {0xc73fa000}, {0xc73fc000}, {0xc73fe000}, 
-    {0xc7400000}, {0xc7402000}, {0xc7404000}, {0xc7406000}, 
-    {0xc7408000}, {0xc740a000}, {0xc740c000}, {0xc740e000}, 
-    {0xc7410000}, {0xc7412000}, {0xc7414000}, {0xc7416000}, 
-    {0xc7418000}, {0xc741a000}, {0xc741c000}, {0xc741e000}, 
-    {0xc7420000}, {0xc7422000}, {0xc7424000}, {0xc7426000}, 
-    {0xc7428000}, {0xc742a000}, {0xc742c000}, {0xc742e000}, 
-    {0xc7430000}, {0xc7432000}, {0xc7434000}, {0xc7436000}, 
-    {0xc7438000}, {0xc743a000}, {0xc743c000}, {0xc743e000}, 
-    {0xc7440000}, {0xc7442000}, {0xc7444000}, {0xc7446000}, 
-    {0xc7448000}, {0xc744a000}, {0xc744c000}, {0xc744e000}, 
-    {0xc7450000}, {0xc7452000}, {0xc7454000}, {0xc7456000}, 
-    {0xc7458000}, {0xc745a000}, {0xc745c000}, {0xc745e000}, 
-    {0xc7460000}, {0xc7462000}, {0xc7464000}, {0xc7466000}, 
-    {0xc7468000}, {0xc746a000}, {0xc746c000}, {0xc746e000}, 
-    {0xc7470000}, {0xc7472000}, {0xc7474000}, {0xc7476000}, 
-    {0xc7478000}, {0xc747a000}, {0xc747c000}, {0xc747e000}, 
-    {0xc7480000}, {0xc7482000}, {0xc7484000}, {0xc7486000}, 
-    {0xc7488000}, {0xc748a000}, {0xc748c000}, {0xc748e000}, 
-    {0xc7490000}, {0xc7492000}, {0xc7494000}, {0xc7496000}, 
-    {0xc7498000}, {0xc749a000}, {0xc749c000}, {0xc749e000}, 
-    {0xc74a0000}, {0xc74a2000}, {0xc74a4000}, {0xc74a6000}, 
-    {0xc74a8000}, {0xc74aa000}, {0xc74ac000}, {0xc74ae000}, 
-    {0xc74b0000}, {0xc74b2000}, {0xc74b4000}, {0xc74b6000}, 
-    {0xc74b8000}, {0xc74ba000}, {0xc74bc000}, {0xc74be000}, 
-    {0xc74c0000}, {0xc74c2000}, {0xc74c4000}, {0xc74c6000}, 
-    {0xc74c8000}, {0xc74ca000}, {0xc74cc000}, {0xc74ce000}, 
-    {0xc74d0000}, {0xc74d2000}, {0xc74d4000}, {0xc74d6000}, 
-    {0xc74d8000}, {0xc74da000}, {0xc74dc000}, {0xc74de000}, 
-    {0xc74e0000}, {0xc74e2000}, {0xc74e4000}, {0xc74e6000}, 
-    {0xc74e8000}, {0xc74ea000}, {0xc74ec000}, {0xc74ee000}, 
-    {0xc74f0000}, {0xc74f2000}, {0xc74f4000}, {0xc74f6000}, 
-    {0xc74f8000}, {0xc74fa000}, {0xc74fc000}, {0xc74fe000}, 
-    {0xc7500000}, {0xc7502000}, {0xc7504000}, {0xc7506000}, 
-    {0xc7508000}, {0xc750a000}, {0xc750c000}, {0xc750e000}, 
-    {0xc7510000}, {0xc7512000}, {0xc7514000}, {0xc7516000}, 
-    {0xc7518000}, {0xc751a000}, {0xc751c000}, {0xc751e000}, 
-    {0xc7520000}, {0xc7522000}, {0xc7524000}, {0xc7526000}, 
-    {0xc7528000}, {0xc752a000}, {0xc752c000}, {0xc752e000}, 
-    {0xc7530000}, {0xc7532000}, {0xc7534000}, {0xc7536000}, 
-    {0xc7538000}, {0xc753a000}, {0xc753c000}, {0xc753e000}, 
-    {0xc7540000}, {0xc7542000}, {0xc7544000}, {0xc7546000}, 
-    {0xc7548000}, {0xc754a000}, {0xc754c000}, {0xc754e000}, 
-    {0xc7550000}, {0xc7552000}, {0xc7554000}, {0xc7556000}, 
-    {0xc7558000}, {0xc755a000}, {0xc755c000}, {0xc755e000}, 
-    {0xc7560000}, {0xc7562000}, {0xc7564000}, {0xc7566000}, 
-    {0xc7568000}, {0xc756a000}, {0xc756c000}, {0xc756e000}, 
-    {0xc7570000}, {0xc7572000}, {0xc7574000}, {0xc7576000}, 
-    {0xc7578000}, {0xc757a000}, {0xc757c000}, {0xc757e000}, 
-    {0xc7580000}, {0xc7582000}, {0xc7584000}, {0xc7586000}, 
-    {0xc7588000}, {0xc758a000}, {0xc758c000}, {0xc758e000}, 
-    {0xc7590000}, {0xc7592000}, {0xc7594000}, {0xc7596000}, 
-    {0xc7598000}, {0xc759a000}, {0xc759c000}, {0xc759e000}, 
-    {0xc75a0000}, {0xc75a2000}, {0xc75a4000}, {0xc75a6000}, 
-    {0xc75a8000}, {0xc75aa000}, {0xc75ac000}, {0xc75ae000}, 
-    {0xc75b0000}, {0xc75b2000}, {0xc75b4000}, {0xc75b6000}, 
-    {0xc75b8000}, {0xc75ba000}, {0xc75bc000}, {0xc75be000}, 
-    {0xc75c0000}, {0xc75c2000}, {0xc75c4000}, {0xc75c6000}, 
-    {0xc75c8000}, {0xc75ca000}, {0xc75cc000}, {0xc75ce000}, 
-    {0xc75d0000}, {0xc75d2000}, {0xc75d4000}, {0xc75d6000}, 
-    {0xc75d8000}, {0xc75da000}, {0xc75dc000}, {0xc75de000}, 
-    {0xc75e0000}, {0xc75e2000}, {0xc75e4000}, {0xc75e6000}, 
-    {0xc75e8000}, {0xc75ea000}, {0xc75ec000}, {0xc75ee000}, 
-    {0xc75f0000}, {0xc75f2000}, {0xc75f4000}, {0xc75f6000}, 
-    {0xc75f8000}, {0xc75fa000}, {0xc75fc000}, {0xc75fe000}, 
-    {0xc7600000}, {0xc7602000}, {0xc7604000}, {0xc7606000}, 
-    {0xc7608000}, {0xc760a000}, {0xc760c000}, {0xc760e000}, 
-    {0xc7610000}, {0xc7612000}, {0xc7614000}, {0xc7616000}, 
-    {0xc7618000}, {0xc761a000}, {0xc761c000}, {0xc761e000}, 
-    {0xc7620000}, {0xc7622000}, {0xc7624000}, {0xc7626000}, 
-    {0xc7628000}, {0xc762a000}, {0xc762c000}, {0xc762e000}, 
-    {0xc7630000}, {0xc7632000}, {0xc7634000}, {0xc7636000}, 
-    {0xc7638000}, {0xc763a000}, {0xc763c000}, {0xc763e000}, 
-    {0xc7640000}, {0xc7642000}, {0xc7644000}, {0xc7646000}, 
-    {0xc7648000}, {0xc764a000}, {0xc764c000}, {0xc764e000}, 
-    {0xc7650000}, {0xc7652000}, {0xc7654000}, {0xc7656000}, 
-    {0xc7658000}, {0xc765a000}, {0xc765c000}, {0xc765e000}, 
-    {0xc7660000}, {0xc7662000}, {0xc7664000}, {0xc7666000}, 
-    {0xc7668000}, {0xc766a000}, {0xc766c000}, {0xc766e000}, 
-    {0xc7670000}, {0xc7672000}, {0xc7674000}, {0xc7676000}, 
-    {0xc7678000}, {0xc767a000}, {0xc767c000}, {0xc767e000}, 
-    {0xc7680000}, {0xc7682000}, {0xc7684000}, {0xc7686000}, 
-    {0xc7688000}, {0xc768a000}, {0xc768c000}, {0xc768e000}, 
-    {0xc7690000}, {0xc7692000}, {0xc7694000}, {0xc7696000}, 
-    {0xc7698000}, {0xc769a000}, {0xc769c000}, {0xc769e000}, 
-    {0xc76a0000}, {0xc76a2000}, {0xc76a4000}, {0xc76a6000}, 
-    {0xc76a8000}, {0xc76aa000}, {0xc76ac000}, {0xc76ae000}, 
-    {0xc76b0000}, {0xc76b2000}, {0xc76b4000}, {0xc76b6000}, 
-    {0xc76b8000}, {0xc76ba000}, {0xc76bc000}, {0xc76be000}, 
-    {0xc76c0000}, {0xc76c2000}, {0xc76c4000}, {0xc76c6000}, 
-    {0xc76c8000}, {0xc76ca000}, {0xc76cc000}, {0xc76ce000}, 
-    {0xc76d0000}, {0xc76d2000}, {0xc76d4000}, {0xc76d6000}, 
-    {0xc76d8000}, {0xc76da000}, {0xc76dc000}, {0xc76de000}, 
-    {0xc76e0000}, {0xc76e2000}, {0xc76e4000}, {0xc76e6000}, 
-    {0xc76e8000}, {0xc76ea000}, {0xc76ec000}, {0xc76ee000}, 
-    {0xc76f0000}, {0xc76f2000}, {0xc76f4000}, {0xc76f6000}, 
-    {0xc76f8000}, {0xc76fa000}, {0xc76fc000}, {0xc76fe000}, 
-    {0xc7700000}, {0xc7702000}, {0xc7704000}, {0xc7706000}, 
-    {0xc7708000}, {0xc770a000}, {0xc770c000}, {0xc770e000}, 
-    {0xc7710000}, {0xc7712000}, {0xc7714000}, {0xc7716000}, 
-    {0xc7718000}, {0xc771a000}, {0xc771c000}, {0xc771e000}, 
-    {0xc7720000}, {0xc7722000}, {0xc7724000}, {0xc7726000}, 
-    {0xc7728000}, {0xc772a000}, {0xc772c000}, {0xc772e000}, 
-    {0xc7730000}, {0xc7732000}, {0xc7734000}, {0xc7736000}, 
-    {0xc7738000}, {0xc773a000}, {0xc773c000}, {0xc773e000}, 
-    {0xc7740000}, {0xc7742000}, {0xc7744000}, {0xc7746000}, 
-    {0xc7748000}, {0xc774a000}, {0xc774c000}, {0xc774e000}, 
-    {0xc7750000}, {0xc7752000}, {0xc7754000}, {0xc7756000}, 
-    {0xc7758000}, {0xc775a000}, {0xc775c000}, {0xc775e000}, 
-    {0xc7760000}, {0xc7762000}, {0xc7764000}, {0xc7766000}, 
-    {0xc7768000}, {0xc776a000}, {0xc776c000}, {0xc776e000}, 
-    {0xc7770000}, {0xc7772000}, {0xc7774000}, {0xc7776000}, 
-    {0xc7778000}, {0xc777a000}, {0xc777c000}, {0xc777e000}, 
-    {0xc7780000}, {0xc7782000}, {0xc7784000}, {0xc7786000}, 
-    {0xc7788000}, {0xc778a000}, {0xc778c000}, {0xc778e000}, 
-    {0xc7790000}, {0xc7792000}, {0xc7794000}, {0xc7796000}, 
-    {0xc7798000}, {0xc779a000}, {0xc779c000}, {0xc779e000}, 
-    {0xc77a0000}, {0xc77a2000}, {0xc77a4000}, {0xc77a6000}, 
-    {0xc77a8000}, {0xc77aa000}, {0xc77ac000}, {0xc77ae000}, 
-    {0xc77b0000}, {0xc77b2000}, {0xc77b4000}, {0xc77b6000}, 
-    {0xc77b8000}, {0xc77ba000}, {0xc77bc000}, {0xc77be000}, 
-    {0xc77c0000}, {0xc77c2000}, {0xc77c4000}, {0xc77c6000}, 
-    {0xc77c8000}, {0xc77ca000}, {0xc77cc000}, {0xc77ce000}, 
-    {0xc77d0000}, {0xc77d2000}, {0xc77d4000}, {0xc77d6000}, 
-    {0xc77d8000}, {0xc77da000}, {0xc77dc000}, {0xc77de000}, 
-    {0xc77e0000}, {0xc77e2000}, {0xc77e4000}, {0xc77e6000}, 
-    {0xc77e8000}, {0xc77ea000}, {0xc77ec000}, {0xc77ee000}, 
-    {0xc77f0000}, {0xc77f2000}, {0xc77f4000}, {0xc77f6000}, 
-    {0xc77f8000}, {0xc77fa000}, {0xc77fc000}, {0xc77fe000}, 
-    {0xff800000}, {0xff802000}, {0xff804000}, {0xff806000}, 
-    {0xff808000}, {0xff80a000}, {0xff80c000}, {0xff80e000}, 
-    {0xff810000}, {0xff812000}, {0xff814000}, {0xff816000}, 
-    {0xff818000}, {0xff81a000}, {0xff81c000}, {0xff81e000}, 
-    {0xff820000}, {0xff822000}, {0xff824000}, {0xff826000}, 
-    {0xff828000}, {0xff82a000}, {0xff82c000}, {0xff82e000}, 
-    {0xff830000}, {0xff832000}, {0xff834000}, {0xff836000}, 
-    {0xff838000}, {0xff83a000}, {0xff83c000}, {0xff83e000}, 
-    {0xff840000}, {0xff842000}, {0xff844000}, {0xff846000}, 
-    {0xff848000}, {0xff84a000}, {0xff84c000}, {0xff84e000}, 
-    {0xff850000}, {0xff852000}, {0xff854000}, {0xff856000}, 
-    {0xff858000}, {0xff85a000}, {0xff85c000}, {0xff85e000}, 
-    {0xff860000}, {0xff862000}, {0xff864000}, {0xff866000}, 
-    {0xff868000}, {0xff86a000}, {0xff86c000}, {0xff86e000}, 
-    {0xff870000}, {0xff872000}, {0xff874000}, {0xff876000}, 
-    {0xff878000}, {0xff87a000}, {0xff87c000}, {0xff87e000}, 
-    {0xff880000}, {0xff882000}, {0xff884000}, {0xff886000}, 
-    {0xff888000}, {0xff88a000}, {0xff88c000}, {0xff88e000}, 
-    {0xff890000}, {0xff892000}, {0xff894000}, {0xff896000}, 
-    {0xff898000}, {0xff89a000}, {0xff89c000}, {0xff89e000}, 
-    {0xff8a0000}, {0xff8a2000}, {0xff8a4000}, {0xff8a6000}, 
-    {0xff8a8000}, {0xff8aa000}, {0xff8ac000}, {0xff8ae000}, 
-    {0xff8b0000}, {0xff8b2000}, {0xff8b4000}, {0xff8b6000}, 
-    {0xff8b8000}, {0xff8ba000}, {0xff8bc000}, {0xff8be000}, 
-    {0xff8c0000}, {0xff8c2000}, {0xff8c4000}, {0xff8c6000}, 
-    {0xff8c8000}, {0xff8ca000}, {0xff8cc000}, {0xff8ce000}, 
-    {0xff8d0000}, {0xff8d2000}, {0xff8d4000}, {0xff8d6000}, 
-    {0xff8d8000}, {0xff8da000}, {0xff8dc000}, {0xff8de000}, 
-    {0xff8e0000}, {0xff8e2000}, {0xff8e4000}, {0xff8e6000}, 
-    {0xff8e8000}, {0xff8ea000}, {0xff8ec000}, {0xff8ee000}, 
-    {0xff8f0000}, {0xff8f2000}, {0xff8f4000}, {0xff8f6000}, 
-    {0xff8f8000}, {0xff8fa000}, {0xff8fc000}, {0xff8fe000}, 
-    {0xff900000}, {0xff902000}, {0xff904000}, {0xff906000}, 
-    {0xff908000}, {0xff90a000}, {0xff90c000}, {0xff90e000}, 
-    {0xff910000}, {0xff912000}, {0xff914000}, {0xff916000}, 
-    {0xff918000}, {0xff91a000}, {0xff91c000}, {0xff91e000}, 
-    {0xff920000}, {0xff922000}, {0xff924000}, {0xff926000}, 
-    {0xff928000}, {0xff92a000}, {0xff92c000}, {0xff92e000}, 
-    {0xff930000}, {0xff932000}, {0xff934000}, {0xff936000}, 
-    {0xff938000}, {0xff93a000}, {0xff93c000}, {0xff93e000}, 
-    {0xff940000}, {0xff942000}, {0xff944000}, {0xff946000}, 
-    {0xff948000}, {0xff94a000}, {0xff94c000}, {0xff94e000}, 
-    {0xff950000}, {0xff952000}, {0xff954000}, {0xff956000}, 
-    {0xff958000}, {0xff95a000}, {0xff95c000}, {0xff95e000}, 
-    {0xff960000}, {0xff962000}, {0xff964000}, {0xff966000}, 
-    {0xff968000}, {0xff96a000}, {0xff96c000}, {0xff96e000}, 
-    {0xff970000}, {0xff972000}, {0xff974000}, {0xff976000}, 
-    {0xff978000}, {0xff97a000}, {0xff97c000}, {0xff97e000}, 
-    {0xff980000}, {0xff982000}, {0xff984000}, {0xff986000}, 
-    {0xff988000}, {0xff98a000}, {0xff98c000}, {0xff98e000}, 
-    {0xff990000}, {0xff992000}, {0xff994000}, {0xff996000}, 
-    {0xff998000}, {0xff99a000}, {0xff99c000}, {0xff99e000}, 
-    {0xff9a0000}, {0xff9a2000}, {0xff9a4000}, {0xff9a6000}, 
-    {0xff9a8000}, {0xff9aa000}, {0xff9ac000}, {0xff9ae000}, 
-    {0xff9b0000}, {0xff9b2000}, {0xff9b4000}, {0xff9b6000}, 
-    {0xff9b8000}, {0xff9ba000}, {0xff9bc000}, {0xff9be000}, 
-    {0xff9c0000}, {0xff9c2000}, {0xff9c4000}, {0xff9c6000}, 
-    {0xff9c8000}, {0xff9ca000}, {0xff9cc000}, {0xff9ce000}, 
-    {0xff9d0000}, {0xff9d2000}, {0xff9d4000}, {0xff9d6000}, 
-    {0xff9d8000}, {0xff9da000}, {0xff9dc000}, {0xff9de000}, 
-    {0xff9e0000}, {0xff9e2000}, {0xff9e4000}, {0xff9e6000}, 
-    {0xff9e8000}, {0xff9ea000}, {0xff9ec000}, {0xff9ee000}, 
-    {0xff9f0000}, {0xff9f2000}, {0xff9f4000}, {0xff9f6000}, 
-    {0xff9f8000}, {0xff9fa000}, {0xff9fc000}, {0xff9fe000}, 
-    {0xffa00000}, {0xffa02000}, {0xffa04000}, {0xffa06000}, 
-    {0xffa08000}, {0xffa0a000}, {0xffa0c000}, {0xffa0e000}, 
-    {0xffa10000}, {0xffa12000}, {0xffa14000}, {0xffa16000}, 
-    {0xffa18000}, {0xffa1a000}, {0xffa1c000}, {0xffa1e000}, 
-    {0xffa20000}, {0xffa22000}, {0xffa24000}, {0xffa26000}, 
-    {0xffa28000}, {0xffa2a000}, {0xffa2c000}, {0xffa2e000}, 
-    {0xffa30000}, {0xffa32000}, {0xffa34000}, {0xffa36000}, 
-    {0xffa38000}, {0xffa3a000}, {0xffa3c000}, {0xffa3e000}, 
-    {0xffa40000}, {0xffa42000}, {0xffa44000}, {0xffa46000}, 
-    {0xffa48000}, {0xffa4a000}, {0xffa4c000}, {0xffa4e000}, 
-    {0xffa50000}, {0xffa52000}, {0xffa54000}, {0xffa56000}, 
-    {0xffa58000}, {0xffa5a000}, {0xffa5c000}, {0xffa5e000}, 
-    {0xffa60000}, {0xffa62000}, {0xffa64000}, {0xffa66000}, 
-    {0xffa68000}, {0xffa6a000}, {0xffa6c000}, {0xffa6e000}, 
-    {0xffa70000}, {0xffa72000}, {0xffa74000}, {0xffa76000}, 
-    {0xffa78000}, {0xffa7a000}, {0xffa7c000}, {0xffa7e000}, 
-    {0xffa80000}, {0xffa82000}, {0xffa84000}, {0xffa86000}, 
-    {0xffa88000}, {0xffa8a000}, {0xffa8c000}, {0xffa8e000}, 
-    {0xffa90000}, {0xffa92000}, {0xffa94000}, {0xffa96000}, 
-    {0xffa98000}, {0xffa9a000}, {0xffa9c000}, {0xffa9e000}, 
-    {0xffaa0000}, {0xffaa2000}, {0xffaa4000}, {0xffaa6000}, 
-    {0xffaa8000}, {0xffaaa000}, {0xffaac000}, {0xffaae000}, 
-    {0xffab0000}, {0xffab2000}, {0xffab4000}, {0xffab6000}, 
-    {0xffab8000}, {0xffaba000}, {0xffabc000}, {0xffabe000}, 
-    {0xffac0000}, {0xffac2000}, {0xffac4000}, {0xffac6000}, 
-    {0xffac8000}, {0xffaca000}, {0xffacc000}, {0xfface000}, 
-    {0xffad0000}, {0xffad2000}, {0xffad4000}, {0xffad6000}, 
-    {0xffad8000}, {0xffada000}, {0xffadc000}, {0xffade000}, 
-    {0xffae0000}, {0xffae2000}, {0xffae4000}, {0xffae6000}, 
-    {0xffae8000}, {0xffaea000}, {0xffaec000}, {0xffaee000}, 
-    {0xffaf0000}, {0xffaf2000}, {0xffaf4000}, {0xffaf6000}, 
-    {0xffaf8000}, {0xffafa000}, {0xffafc000}, {0xffafe000}, 
-    {0xffb00000}, {0xffb02000}, {0xffb04000}, {0xffb06000}, 
-    {0xffb08000}, {0xffb0a000}, {0xffb0c000}, {0xffb0e000}, 
-    {0xffb10000}, {0xffb12000}, {0xffb14000}, {0xffb16000}, 
-    {0xffb18000}, {0xffb1a000}, {0xffb1c000}, {0xffb1e000}, 
-    {0xffb20000}, {0xffb22000}, {0xffb24000}, {0xffb26000}, 
-    {0xffb28000}, {0xffb2a000}, {0xffb2c000}, {0xffb2e000}, 
-    {0xffb30000}, {0xffb32000}, {0xffb34000}, {0xffb36000}, 
-    {0xffb38000}, {0xffb3a000}, {0xffb3c000}, {0xffb3e000}, 
-    {0xffb40000}, {0xffb42000}, {0xffb44000}, {0xffb46000}, 
-    {0xffb48000}, {0xffb4a000}, {0xffb4c000}, {0xffb4e000}, 
-    {0xffb50000}, {0xffb52000}, {0xffb54000}, {0xffb56000}, 
-    {0xffb58000}, {0xffb5a000}, {0xffb5c000}, {0xffb5e000}, 
-    {0xffb60000}, {0xffb62000}, {0xffb64000}, {0xffb66000}, 
-    {0xffb68000}, {0xffb6a000}, {0xffb6c000}, {0xffb6e000}, 
-    {0xffb70000}, {0xffb72000}, {0xffb74000}, {0xffb76000}, 
-    {0xffb78000}, {0xffb7a000}, {0xffb7c000}, {0xffb7e000}, 
-    {0xffb80000}, {0xffb82000}, {0xffb84000}, {0xffb86000}, 
-    {0xffb88000}, {0xffb8a000}, {0xffb8c000}, {0xffb8e000}, 
-    {0xffb90000}, {0xffb92000}, {0xffb94000}, {0xffb96000}, 
-    {0xffb98000}, {0xffb9a000}, {0xffb9c000}, {0xffb9e000}, 
-    {0xffba0000}, {0xffba2000}, {0xffba4000}, {0xffba6000}, 
-    {0xffba8000}, {0xffbaa000}, {0xffbac000}, {0xffbae000}, 
-    {0xffbb0000}, {0xffbb2000}, {0xffbb4000}, {0xffbb6000}, 
-    {0xffbb8000}, {0xffbba000}, {0xffbbc000}, {0xffbbe000}, 
-    {0xffbc0000}, {0xffbc2000}, {0xffbc4000}, {0xffbc6000}, 
-    {0xffbc8000}, {0xffbca000}, {0xffbcc000}, {0xffbce000}, 
-    {0xffbd0000}, {0xffbd2000}, {0xffbd4000}, {0xffbd6000}, 
-    {0xffbd8000}, {0xffbda000}, {0xffbdc000}, {0xffbde000}, 
-    {0xffbe0000}, {0xffbe2000}, {0xffbe4000}, {0xffbe6000}, 
-    {0xffbe8000}, {0xffbea000}, {0xffbec000}, {0xffbee000}, 
-    {0xffbf0000}, {0xffbf2000}, {0xffbf4000}, {0xffbf6000}, 
-    {0xffbf8000}, {0xffbfa000}, {0xffbfc000}, {0xffbfe000}, 
-    {0xffc00000}, {0xffc02000}, {0xffc04000}, {0xffc06000}, 
-    {0xffc08000}, {0xffc0a000}, {0xffc0c000}, {0xffc0e000}, 
-    {0xffc10000}, {0xffc12000}, {0xffc14000}, {0xffc16000}, 
-    {0xffc18000}, {0xffc1a000}, {0xffc1c000}, {0xffc1e000}, 
-    {0xffc20000}, {0xffc22000}, {0xffc24000}, {0xffc26000}, 
-    {0xffc28000}, {0xffc2a000}, {0xffc2c000}, {0xffc2e000}, 
-    {0xffc30000}, {0xffc32000}, {0xffc34000}, {0xffc36000}, 
-    {0xffc38000}, {0xffc3a000}, {0xffc3c000}, {0xffc3e000}, 
-    {0xffc40000}, {0xffc42000}, {0xffc44000}, {0xffc46000}, 
-    {0xffc48000}, {0xffc4a000}, {0xffc4c000}, {0xffc4e000}, 
-    {0xffc50000}, {0xffc52000}, {0xffc54000}, {0xffc56000}, 
-    {0xffc58000}, {0xffc5a000}, {0xffc5c000}, {0xffc5e000}, 
-    {0xffc60000}, {0xffc62000}, {0xffc64000}, {0xffc66000}, 
-    {0xffc68000}, {0xffc6a000}, {0xffc6c000}, {0xffc6e000}, 
-    {0xffc70000}, {0xffc72000}, {0xffc74000}, {0xffc76000}, 
-    {0xffc78000}, {0xffc7a000}, {0xffc7c000}, {0xffc7e000}, 
-    {0xffc80000}, {0xffc82000}, {0xffc84000}, {0xffc86000}, 
-    {0xffc88000}, {0xffc8a000}, {0xffc8c000}, {0xffc8e000}, 
-    {0xffc90000}, {0xffc92000}, {0xffc94000}, {0xffc96000}, 
-    {0xffc98000}, {0xffc9a000}, {0xffc9c000}, {0xffc9e000}, 
-    {0xffca0000}, {0xffca2000}, {0xffca4000}, {0xffca6000}, 
-    {0xffca8000}, {0xffcaa000}, {0xffcac000}, {0xffcae000}, 
-    {0xffcb0000}, {0xffcb2000}, {0xffcb4000}, {0xffcb6000}, 
-    {0xffcb8000}, {0xffcba000}, {0xffcbc000}, {0xffcbe000}, 
-    {0xffcc0000}, {0xffcc2000}, {0xffcc4000}, {0xffcc6000}, 
-    {0xffcc8000}, {0xffcca000}, {0xffccc000}, {0xffcce000}, 
-    {0xffcd0000}, {0xffcd2000}, {0xffcd4000}, {0xffcd6000}, 
-    {0xffcd8000}, {0xffcda000}, {0xffcdc000}, {0xffcde000}, 
-    {0xffce0000}, {0xffce2000}, {0xffce4000}, {0xffce6000}, 
-    {0xffce8000}, {0xffcea000}, {0xffcec000}, {0xffcee000}, 
-    {0xffcf0000}, {0xffcf2000}, {0xffcf4000}, {0xffcf6000}, 
-    {0xffcf8000}, {0xffcfa000}, {0xffcfc000}, {0xffcfe000}, 
-    {0xffd00000}, {0xffd02000}, {0xffd04000}, {0xffd06000}, 
-    {0xffd08000}, {0xffd0a000}, {0xffd0c000}, {0xffd0e000}, 
-    {0xffd10000}, {0xffd12000}, {0xffd14000}, {0xffd16000}, 
-    {0xffd18000}, {0xffd1a000}, {0xffd1c000}, {0xffd1e000}, 
-    {0xffd20000}, {0xffd22000}, {0xffd24000}, {0xffd26000}, 
-    {0xffd28000}, {0xffd2a000}, {0xffd2c000}, {0xffd2e000}, 
-    {0xffd30000}, {0xffd32000}, {0xffd34000}, {0xffd36000}, 
-    {0xffd38000}, {0xffd3a000}, {0xffd3c000}, {0xffd3e000}, 
-    {0xffd40000}, {0xffd42000}, {0xffd44000}, {0xffd46000}, 
-    {0xffd48000}, {0xffd4a000}, {0xffd4c000}, {0xffd4e000}, 
-    {0xffd50000}, {0xffd52000}, {0xffd54000}, {0xffd56000}, 
-    {0xffd58000}, {0xffd5a000}, {0xffd5c000}, {0xffd5e000}, 
-    {0xffd60000}, {0xffd62000}, {0xffd64000}, {0xffd66000}, 
-    {0xffd68000}, {0xffd6a000}, {0xffd6c000}, {0xffd6e000}, 
-    {0xffd70000}, {0xffd72000}, {0xffd74000}, {0xffd76000}, 
-    {0xffd78000}, {0xffd7a000}, {0xffd7c000}, {0xffd7e000}, 
-    {0xffd80000}, {0xffd82000}, {0xffd84000}, {0xffd86000}, 
-    {0xffd88000}, {0xffd8a000}, {0xffd8c000}, {0xffd8e000}, 
-    {0xffd90000}, {0xffd92000}, {0xffd94000}, {0xffd96000}, 
-    {0xffd98000}, {0xffd9a000}, {0xffd9c000}, {0xffd9e000}, 
-    {0xffda0000}, {0xffda2000}, {0xffda4000}, {0xffda6000}, 
-    {0xffda8000}, {0xffdaa000}, {0xffdac000}, {0xffdae000}, 
-    {0xffdb0000}, {0xffdb2000}, {0xffdb4000}, {0xffdb6000}, 
-    {0xffdb8000}, {0xffdba000}, {0xffdbc000}, {0xffdbe000}, 
-    {0xffdc0000}, {0xffdc2000}, {0xffdc4000}, {0xffdc6000}, 
-    {0xffdc8000}, {0xffdca000}, {0xffdcc000}, {0xffdce000}, 
-    {0xffdd0000}, {0xffdd2000}, {0xffdd4000}, {0xffdd6000}, 
-    {0xffdd8000}, {0xffdda000}, {0xffddc000}, {0xffdde000}, 
-    {0xffde0000}, {0xffde2000}, {0xffde4000}, {0xffde6000}, 
-    {0xffde8000}, {0xffdea000}, {0xffdec000}, {0xffdee000}, 
-    {0xffdf0000}, {0xffdf2000}, {0xffdf4000}, {0xffdf6000}, 
-    {0xffdf8000}, {0xffdfa000}, {0xffdfc000}, {0xffdfe000}, 
-    {0xffe00000}, {0xffe02000}, {0xffe04000}, {0xffe06000}, 
-    {0xffe08000}, {0xffe0a000}, {0xffe0c000}, {0xffe0e000}, 
-    {0xffe10000}, {0xffe12000}, {0xffe14000}, {0xffe16000}, 
-    {0xffe18000}, {0xffe1a000}, {0xffe1c000}, {0xffe1e000}, 
-    {0xffe20000}, {0xffe22000}, {0xffe24000}, {0xffe26000}, 
-    {0xffe28000}, {0xffe2a000}, {0xffe2c000}, {0xffe2e000}, 
-    {0xffe30000}, {0xffe32000}, {0xffe34000}, {0xffe36000}, 
-    {0xffe38000}, {0xffe3a000}, {0xffe3c000}, {0xffe3e000}, 
-    {0xffe40000}, {0xffe42000}, {0xffe44000}, {0xffe46000}, 
-    {0xffe48000}, {0xffe4a000}, {0xffe4c000}, {0xffe4e000}, 
-    {0xffe50000}, {0xffe52000}, {0xffe54000}, {0xffe56000}, 
-    {0xffe58000}, {0xffe5a000}, {0xffe5c000}, {0xffe5e000}, 
-    {0xffe60000}, {0xffe62000}, {0xffe64000}, {0xffe66000}, 
-    {0xffe68000}, {0xffe6a000}, {0xffe6c000}, {0xffe6e000}, 
-    {0xffe70000}, {0xffe72000}, {0xffe74000}, {0xffe76000}, 
-    {0xffe78000}, {0xffe7a000}, {0xffe7c000}, {0xffe7e000}, 
-    {0xffe80000}, {0xffe82000}, {0xffe84000}, {0xffe86000}, 
-    {0xffe88000}, {0xffe8a000}, {0xffe8c000}, {0xffe8e000}, 
-    {0xffe90000}, {0xffe92000}, {0xffe94000}, {0xffe96000}, 
-    {0xffe98000}, {0xffe9a000}, {0xffe9c000}, {0xffe9e000}, 
-    {0xffea0000}, {0xffea2000}, {0xffea4000}, {0xffea6000}, 
-    {0xffea8000}, {0xffeaa000}, {0xffeac000}, {0xffeae000}, 
-    {0xffeb0000}, {0xffeb2000}, {0xffeb4000}, {0xffeb6000}, 
-    {0xffeb8000}, {0xffeba000}, {0xffebc000}, {0xffebe000}, 
-    {0xffec0000}, {0xffec2000}, {0xffec4000}, {0xffec6000}, 
-    {0xffec8000}, {0xffeca000}, {0xffecc000}, {0xffece000}, 
-    {0xffed0000}, {0xffed2000}, {0xffed4000}, {0xffed6000}, 
-    {0xffed8000}, {0xffeda000}, {0xffedc000}, {0xffede000}, 
-    {0xffee0000}, {0xffee2000}, {0xffee4000}, {0xffee6000}, 
-    {0xffee8000}, {0xffeea000}, {0xffeec000}, {0xffeee000}, 
-    {0xffef0000}, {0xffef2000}, {0xffef4000}, {0xffef6000}, 
-    {0xffef8000}, {0xffefa000}, {0xffefc000}, {0xffefe000}, 
-    {0xfff00000}, {0xfff02000}, {0xfff04000}, {0xfff06000}, 
-    {0xfff08000}, {0xfff0a000}, {0xfff0c000}, {0xfff0e000}, 
-    {0xfff10000}, {0xfff12000}, {0xfff14000}, {0xfff16000}, 
-    {0xfff18000}, {0xfff1a000}, {0xfff1c000}, {0xfff1e000}, 
-    {0xfff20000}, {0xfff22000}, {0xfff24000}, {0xfff26000}, 
-    {0xfff28000}, {0xfff2a000}, {0xfff2c000}, {0xfff2e000}, 
-    {0xfff30000}, {0xfff32000}, {0xfff34000}, {0xfff36000}, 
-    {0xfff38000}, {0xfff3a000}, {0xfff3c000}, {0xfff3e000}, 
-    {0xfff40000}, {0xfff42000}, {0xfff44000}, {0xfff46000}, 
-    {0xfff48000}, {0xfff4a000}, {0xfff4c000}, {0xfff4e000}, 
-    {0xfff50000}, {0xfff52000}, {0xfff54000}, {0xfff56000}, 
-    {0xfff58000}, {0xfff5a000}, {0xfff5c000}, {0xfff5e000}, 
-    {0xfff60000}, {0xfff62000}, {0xfff64000}, {0xfff66000}, 
-    {0xfff68000}, {0xfff6a000}, {0xfff6c000}, {0xfff6e000}, 
-    {0xfff70000}, {0xfff72000}, {0xfff74000}, {0xfff76000}, 
-    {0xfff78000}, {0xfff7a000}, {0xfff7c000}, {0xfff7e000}, 
-    {0xfff80000}, {0xfff82000}, {0xfff84000}, {0xfff86000}, 
-    {0xfff88000}, {0xfff8a000}, {0xfff8c000}, {0xfff8e000}, 
-    {0xfff90000}, {0xfff92000}, {0xfff94000}, {0xfff96000}, 
-    {0xfff98000}, {0xfff9a000}, {0xfff9c000}, {0xfff9e000}, 
-    {0xfffa0000}, {0xfffa2000}, {0xfffa4000}, {0xfffa6000}, 
-    {0xfffa8000}, {0xfffaa000}, {0xfffac000}, {0xfffae000}, 
-    {0xfffb0000}, {0xfffb2000}, {0xfffb4000}, {0xfffb6000}, 
-    {0xfffb8000}, {0xfffba000}, {0xfffbc000}, {0xfffbe000}, 
-    {0xfffc0000}, {0xfffc2000}, {0xfffc4000}, {0xfffc6000}, 
-    {0xfffc8000}, {0xfffca000}, {0xfffcc000}, {0xfffce000}, 
-    {0xfffd0000}, {0xfffd2000}, {0xfffd4000}, {0xfffd6000}, 
-    {0xfffd8000}, {0xfffda000}, {0xfffdc000}, {0xfffde000}, 
-    {0xfffe0000}, {0xfffe2000}, {0xfffe4000}, {0xfffe6000}, 
-    {0xfffe8000}, {0xfffea000}, {0xfffec000}, {0xfffee000}, 
-    {0xffff0000}, {0xffff2000}, {0xffff4000}, {0xffff6000}, 
-    {0xffff8000}, {0xffffa000}, {0xffffc000}, {0xffffe000}, 
-};
diff --git a/jellyfish/yaggo.cpp b/jellyfish/yaggo.cpp
deleted file mode 100644
index 660a12f..0000000
--- a/jellyfish/yaggo.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Copyright (c) 2011 Guillaume Marcais
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <jellyfish/yaggo.hpp>
-
-namespace yaggo {
-  uint32_t string::as_uint32(bool si_suffix) const {
-    std::string err;
-    uint32_t res = yaggo::conv_uint<uint32_t>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to uint32_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  uint64_t string::as_uint64(bool si_suffix) const {
-    std::string err;
-    uint64_t res = yaggo::conv_uint<uint64_t>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to uint64_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  int32_t string::as_int32(bool si_suffix) const {
-    std::string err;
-    int32_t res = yaggo::conv_int<int32_t>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to int32_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  int64_t string::as_int64(bool si_suffix) const {
-    std::string err;
-    int64_t res = yaggo::conv_int<int64_t>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to int64_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  int string::as_int(bool si_suffix) const {
-    std::string err;
-    int res = yaggo::conv_int<int>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to int_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  long string::as_long(bool si_suffix) const {
-    std::string err;
-    long res = yaggo::conv_int<long>((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to long_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  double string::as_double(bool si_suffix) const {
-    std::string err;
-    double res = yaggo::conv_double((const char*)this->c_str(), err, si_suffix);
-    if(!err.empty()) {
-      std::string msg("Invalid conversion of '");
-      msg += *this;
-      msg += "' to double_t: ";
-      msg += err;
-      throw std::runtime_error(msg);
-    }
-    return res;
-  }
-
-  int string::as_enum(const char* const strs[]) {
-    std::string err;
-    int res = yaggo::conv_enum((const char*)this->c_str(), err, strs);
-    if(!err.empty())
-      throw std::runtime_error(err);
-    return res;
-  }
-
-  bool adjust_double_si_suffix(double &res, const char *suffix) {
-    if(*suffix == '\0')
-      return true;
-    if(*(suffix + 1) != '\0')
-      return false;
-
-    switch(*suffix) {
-    case 'a': res *= 1e-18; break;
-    case 'f': res *= 1e-15; break;
-    case 'p': res *= 1e-12; break;
-    case 'n': res *= 1e-9;  break;
-    case 'u': res *= 1e-6;  break;
-    case 'm': res *= 1e-3;  break;
-    case 'k': res *= 1e3;   break;
-    case 'M': res *= 1e6;   break;
-    case 'G': res *= 1e9;   break;
-    case 'T': res *= 1e12;  break;
-    case 'P': res *= 1e15;  break;
-    case 'E': res *= 1e18;  break;
-    default: return false;
-    }
-    return true;
-  }
-
-  double conv_double(const char *str, std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    double res = strtod(str, &endptr);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (double)0.0;
-    }
-    bool invalid =
-      si_suffix ? !adjust_double_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (double)0.0;
-    }
-    return res;
-  }
-
-  int conv_enum(const char* str, std::string& err, const char* const strs[]) {
-    int res = 0;
-    for(const char* const* cstr = strs; *cstr; ++cstr, ++res)
-      if(!strcmp(*cstr, str))
-        return res;
-    err += "Invalid constant '";
-    err += str;
-    err += "'. Expected one of { ";
-    for(const char* const* cstr = strs; *cstr; ++cstr) {
-      if(cstr != strs)
-        err += ", ";
-      err += *cstr;
-    }
-    err += " }";
-    return -1;
-  }
-}
diff --git a/jellyfish/yaggo.hpp b/jellyfish/yaggo.hpp
deleted file mode 100644
index 9cff366..0000000
--- a/jellyfish/yaggo.hpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Copyright (c) 2011 Guillaume Marcais
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __YAGGO_HPP__
-#define __YAGGO_HPP__
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <errno.h>
-#include <string.h>
-#include <stdexcept>
-#include <string>
-#include <limits>
-#include <vector>
-#include <iostream>
-#include <sstream>
-
-namespace yaggo {
-  class string : public std::string {
-  public:
-    string() : std::string() {}
-    explicit string(const std::string &s) : std::string(s) {}
-    explicit string(const char *s) : std::string(s) {}
-    int as_enum(const char* const strs[]);
-
-    uint32_t as_uint32_suffix() const { return as_uint32(true); }
-    uint32_t as_uint32(bool si_suffix = false) const;
-    uint64_t as_uint64_suffix() const { return as_uint64(true); }
-    uint64_t as_uint64(bool si_suffix = false) const;
-    int32_t as_int32_suffix() const { return as_int32(true); }
-    int32_t as_int32(bool si_suffix = false) const;
-    int64_t as_int64_suffix() const { return as_int64(true); }
-    int64_t as_int64(bool si_suffix = false) const;
-    int as_int_suffix() const { return as_int(true); }
-    int as_int(bool si_suffix = false) const;
-    long as_long_suffix() const { return as_long(true); }
-    long as_long(bool si_suffix = false) const;
-    double as_double_suffix() const { return as_double(true); }
-    double as_double(bool si_suffix = false) const;
-  };
-
-  bool adjust_double_si_suffix(double &res, const char *unit);
-  double conv_double(const char *str, std::string &err, bool si_suffix);
-  int conv_enum(const char* str, std::string& err, const char* const strs[]);
-
-  template<typename T>
-  static bool adjust_int_si_suffix(T &res, const char *suffix) {
-    if(*suffix == '\0')
-      return true;
-    if(*(suffix + 1) != '\0')
-      return false;
-
-    switch(*suffix) {
-    case 'k': res *= (T)1000; break;
-    case 'M': res *= (T)1000000; break;
-    case 'G': res *= (T)1000000000; break;
-    case 'T': res *= (T)1000000000000; break;
-    case 'P': res *= (T)1000000000000000; break;
-    case 'E': res *= (T)1000000000000000000; break;
-    default: return false;
-    }
-    return true;
-  }
-
-  template<typename T>
-  static T conv_int(const char *str, std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    long long int res = strtoll(str, &endptr, 0);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (T)0;
-    }
-    bool invalid = 
-      si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (T)0;
-    }
-    if(res > std::numeric_limits<T>::max() || 
-       res < std::numeric_limits<T>::min()) {
-      err.assign("Value out of range");
-      return (T)0;
-    }
-    return (T)res;
-  }
-
-  template<typename T>
-  static T conv_uint(const char *str, std::string &err, bool si_suffix) {
-    char *endptr = 0;
-    errno = 0;
-    while(isspace(*str)) { ++str; }
-    if(*str == '-') {
-      err.assign("Negative value");
-      return (T)0;
-    }
-    unsigned long long int res = strtoull(str, &endptr, 0);
-    if(errno) {
-      err.assign(strerror(errno));
-      return (T)0;
-    }
-    bool invalid =
-      si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
-    if(invalid) {
-      err.assign("Invalid character");
-      return (T)0;
-    }
-    if(res > std::numeric_limits<T>::max() || 
-       res < std::numeric_limits<T>::min()) {
-      err.assign("Value out of range");
-      return (T)0;
-    }
-    return (T)res;
-  }
-
-  template<typename T>
-  static std::string vec_str(const std::vector<T> &vec) {
-    std::ostringstream os;
-    for(typename std::vector<T>::const_iterator it = vec.begin();
-        it != vec.end(); ++it) {
-      if(it != vec.begin())
-        os << ",";
-      os << *it;
-    }
-    return os.str();
-  }
-  
-}
-
-#endif
diff --git a/jellyfish/allocators_mmap.cc b/lib/allocators_mmap.cc
similarity index 51%
rename from jellyfish/allocators_mmap.cc
rename to lib/allocators_mmap.cc
index e4a24d7..f39853a 100644
--- a/jellyfish/allocators_mmap.cc
+++ b/lib/allocators_mmap.cc
@@ -15,30 +15,56 @@
 */
 
 #include <config.h>
+#include <assert.h>
 #include <jellyfish/allocators_mmap.hpp>
 
 #ifndef MAP_ANONYMOUS
 #define MAP_ANONYMOUS MAP_ANON
 #endif
 
+#ifdef HAVE_VALGRIND
+#include <valgrind.h>
+// TODO: this should really come from the valgrind switch
+// --redzone-size. Don't know how to get access to that yet!
+static size_t redzone_size = 128;
+#endif
+
 void *allocators::mmap::realloc(size_t new_size) {
   void *new_ptr = MAP_FAILED;
-  if(ptr == MAP_FAILED) {
-    new_ptr     = ::mmap(NULL, new_size, PROT_WRITE|PROT_READ, 
+  const size_t asize = new_size
+#ifdef HAVE_VALGRIND
+    + 2 * redzone_size
+#endif
+    ;
+
+  if(ptr_ == MAP_FAILED) {
+    new_ptr     = ::mmap(NULL, asize, PROT_WRITE|PROT_READ,
 			 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
-  } 
+  }
   // mremap is Linux specific
   // TODO: We must do something if it is not supported
 #ifdef MREMAP_MAYMOVE
   else {
-    new_ptr = ::mremap(ptr, size, new_size, MREMAP_MAYMOVE);
+    new_ptr = ::mremap(ptr_, size_, new_size, MREMAP_MAYMOVE);
   }
 #endif
   if(new_ptr == MAP_FAILED)
     return NULL;
-  size = new_size;
-  ptr  = new_ptr;
-  return ptr;
+
+#ifdef HAVE_VALGRIND
+  new_ptr = (char*)new_ptr + redzone_size;
+  if(ptr_ == MAP_FAILED)
+    VALGRIND_MALLOCLIKE_BLOCK(new_ptr, new_size, redzone_size, 1);
+  // TODO: resize not yet supported
+#endif
+
+
+  size_ = new_size;
+  ptr_  = new_ptr;
+
+  fast_zero();
+
+  return ptr_;
 }
 
 size_t allocators::mmap::round_to_page(size_t _size) {
@@ -48,25 +74,41 @@ size_t allocators::mmap::round_to_page(size_t _size) {
 
 void allocators::mmap::fast_zero() {
   tinfo  info[nb_threads];
-  size_t pgsize   = round_to_page(1);
-  size_t nb_pages = size / pgsize + (size % pgsize != 0);
+  size_t pgsize        = round_to_page(1);
+  size_t nb_pages      = size_ / pgsize + (size_ % pgsize != 0);
+  int    total_threads = 0;
 
-  for(int i = 0; i < nb_threads; i++) {
-    info[i].start = (char *)ptr + pgsize * ((i * nb_pages) / nb_threads);
-    info[i].end   = (char *)ptr + pgsize * (((i + 1) * nb_pages) / nb_threads);
-        
+  for(size_t i = 0; i < (size_t)nb_threads; ++i, ++total_threads) {
+    info[i].start = (char *)ptr_ + pgsize * ((i * nb_pages) / nb_threads);
+    info[i].end   = (char *)ptr_ + std::min(pgsize * (((i + 1) * nb_pages) / nb_threads), size_);
     info[i].pgsize = pgsize;
-    pthread_create(&info[i].thid, NULL, _fast_zero, &info[i]);
+    if(pthread_create(&info[i].thid, NULL, _fast_zero, &info[i]))
+      break;
   }
-  for(int i = 0; i < nb_threads; i++)
+
+  for(int i = 0; i < total_threads; i++)
     pthread_join(info[i].thid, NULL);
 }
 
 void * allocators::mmap::_fast_zero(void *_info) {
   tinfo *info = (tinfo *)_info;
-      
-  for(char *cptr = info->start; cptr < info->end; cptr += info->pgsize)
+
+  for(char *cptr = info->start; cptr < info->end; cptr += info->pgsize) {
     *cptr = 0;
+  }
 
   return NULL;
 }
+
+void allocators::mmap::free() {
+  if(ptr_ == MAP_FAILED)
+    return;
+#ifdef HAVE_VALGRIND
+  VALGRIND_FREELIKE_BLOCK(ptr_, redzone_size);
+  ptr_   = (char*)ptr_ - redzone_size;
+  size_ += 2 * redzone_size;
+#endif
+  assert(::munmap(ptr_, size_) == 0);
+  ptr_  = MAP_FAILED;
+  size_ = 0;
+}
diff --git a/jellyfish/err.cc b/lib/err.cc
similarity index 84%
rename from jellyfish/err.cc
rename to lib/err.cc
index 933d488..481a33e 100644
--- a/jellyfish/err.cc
+++ b/lib/err.cc
@@ -16,14 +16,16 @@
 
 #include <jellyfish/err.hpp>
 
+namespace jellyfish {
 namespace err {
-  std::ostream &operator<<(std::ostream &os, const err::substr &ss) {
+  std::ostream &operator<<(std::ostream &os, const substr &ss) {
     os.write(ss._s, ss._l);
     return os;
   }
 
-  std::ostream &operator<<(std::ostream &os, const err::no_t &x) {
+  std::ostream &operator<<(std::ostream &os, const no_t &x) {
     x.write(os, errno);
     return os;
   }
 }
+}
diff --git a/lib/generator_manager.cc b/lib/generator_manager.cc
new file mode 100644
index 0000000..b9d801b
--- /dev/null
+++ b/lib/generator_manager.cc
@@ -0,0 +1,281 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <assert.h>
+
+#include <cstdlib>
+#include <vector>
+#include <string>
+#include <map>
+#include <memory>
+#include <sstream>
+
+#include <jellyfish/generator_manager.hpp>
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+int open_cloexec(const char* path, int flags) {
+#ifdef O_CLOEXEC
+    int fd = open(path, flags|O_CLOEXEC);
+#else
+    int fd = open(path, flags);
+    if(fd != -1)
+      fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
+    return fd;
+}
+
+std::string tmp_pipes::create_tmp_dir() {
+  std::vector<const char*> prefixes;
+  const char* tmpdir = getenv("TMPDIR");
+  if(tmpdir)
+    prefixes.push_back(tmpdir);
+#ifdef P_tmpdir
+  prefixes.push_back(P_tmpdir);
+#endif
+  prefixes.push_back(".");
+
+  for(auto it = prefixes.begin(); it != prefixes.end(); ++it) {
+    size_t len = strlen(*it) + 6 + 1;
+    std::unique_ptr<char[]> tmppath(new char[len]);
+    sprintf(tmppath.get(), "%sXXXXXX", *it);
+    const char* res = mkdtemp(tmppath.get());
+    if(res)
+      return std::string(res);
+  }
+  throw std::runtime_error(err::msg() << "Failed to create a temporary directory for the pipes. Set the variable TMPDIR properly: " << err::no);
+  return "";
+}
+
+std::vector<std::string> tmp_pipes::create_pipes(const std::string& tmpdir, int nb_pipes)
+{
+  std::vector<std::string> pipes;
+  for(int i = 0; i < nb_pipes; ++i) {
+    std::ostringstream path;
+    path << tmpdir << "/fifo" << i;
+    if(mkfifo(path.str().c_str(), S_IRUSR|S_IWUSR) == -1)
+      throw std::runtime_error(err::msg() << "Failed to create named fifos: " << err::no);
+    pipes.push_back(path.str());
+  }
+  return pipes;
+}
+
+void tmp_pipes::discard(int i) {
+  if(pipes_[i].empty())
+    return;
+  // First rename the fifo so no new reader will open it, then open
+  // the fifo (with its new name for writing, in non-blocking mode. If
+  // we get a valid file descriptor, some readers are blocked reading
+  // on the fifo: we close the fifo and free the readers. Otherwise,
+  // no readers is blocked and no action is required. Finally we
+  // unlink the fifo for good.
+  std::string discarded_name(pipes_[i]);
+  discarded_name += "_discarded";
+  if(rename(pipes_[i].c_str(), discarded_name.c_str()) == -1)
+    return;
+  pipes_[i].clear();
+  pipes_paths_[i] = 0;
+  int fd = open(discarded_name.c_str(), O_WRONLY|O_NONBLOCK);
+  if(fd != -1)
+    close(fd);
+  unlink(discarded_name.c_str());
+}
+
+void tmp_pipes::cleanup() {
+  for(size_t i = 0; i < pipes_.size(); ++i) {
+    discard(i);
+  }
+  rmdir(tmpdir_.c_str());
+}
+
+void generator_manager::start()  {
+  if(manager_pid_ != -1)
+    return;
+  manager_pid_ = fork();
+  switch(manager_pid_) {
+  case -1:
+    throw std::runtime_error(err::msg() << "Failed to start manager process: " << err::no);
+    break;
+  case 0:
+    manager_pid_ = -1;
+    break;
+  default:
+    cmds_.close();
+    return;
+  }
+
+
+  // In child
+  setup_signal_handlers();
+  start_commands(); // child start commands
+  int signal = kill_signal_;
+  if(signal == 0)
+    exit(EXIT_SUCCESS);
+
+  // Got killed. Kill all children, cleanup and kill myself with the
+  // same signal (and die from it this time :). We do not wait on the
+  // dead children as we are going to die soon as well, and we don't
+  // care about the return value at that point. Let init take care of
+  // that for us...
+  cleanup();
+  unset_signal_handlers();
+  kill(getpid(), signal); // kill myself
+  exit(EXIT_FAILURE); // Should not be reached
+}
+
+static generator_manager* manager = 0;
+void generator_manager::signal_handler(int signal) {
+  manager->kill_signal_ = signal;
+}
+void generator_manager::setup_signal_handlers() {
+  int res;
+  struct sigaction act;
+  memset(&act, '\0', sizeof(act));
+  act.sa_handler = signal_handler;
+  res = sigaction(SIGTERM, &act, 0);
+  assert(res == 0);
+  // Should we redefine other signals as well? Like SIGINT, SIGQUIT?
+}
+
+void generator_manager::unset_signal_handlers() {
+  struct sigaction act;
+  memset(&act, '\0', sizeof(act));
+  act.sa_handler = SIG_DFL;
+  assert(sigaction(SIGTERM, &act, 0) == 0);
+}
+
+bool generator_manager::wait() {
+  if(manager_pid_ == -1) return false;
+  pid_t pid = manager_pid_;
+  manager_pid_ = -1;
+  int status;
+  if(pid != waitpid(pid, &status, 0))
+    return false;
+  return WIFEXITED(status) && (WEXITSTATUS(status) == 0);
+}
+
+void generator_manager::cleanup() {
+  for(auto it = pid2pipe_.begin(); it != pid2pipe_.end(); ++it) {
+    kill(it->first, SIGTERM);
+    pipes_.discard(it->second.pipe);
+  }
+  pipes_.cleanup();
+}
+
+void generator_manager::start_one_command(const std::string& command, int pipe)
+{
+  cmd_info_type info = { command, pipe };
+  pid_t child = fork();
+  switch(child) {
+  case -1:
+    std::cerr << "Failed to fork. Command '" << command << "' not run" << std::endl;
+    return;
+  case 0:
+    break;
+  default:
+    pid2pipe_[child] = info;
+    return;
+  }
+
+  // In child
+  int dev_null = open_cloexec("/dev/null", O_RDONLY);
+  if(dev_null != -1)
+    dup2(dev_null, 0);
+
+  int pipe_fd = open_cloexec(pipes_[pipe], O_WRONLY);
+  if(pipe_fd == -1) {
+    std::cerr << "Failed to open output pipe. Command '" << command << "' not run" << std::endl;
+    exit(EXIT_FAILURE);
+  }
+  if(dup2(pipe_fd, 1) == -1) {
+    std::cerr << "Failed to dup pipe to stdout. Command '" << command << "' not run" << std::endl;
+    exit(EXIT_FAILURE);
+  }
+  execl(shell_, shell_, "-c", command.c_str(), (char*)0);
+  std::cerr << "Failed to exec. Command '" << command << "' not run" << std::endl;
+  exit(EXIT_FAILURE);
+}
+
+std::string generator_manager::get_cmd() {
+  std::string command;
+
+  while(std::getline(cmds_, command)) {
+    size_t pos = command.find_first_not_of(" \t\n\v\f\r");
+    if(pos != std::string::npos && command[pos] != '#')
+      break;
+    command.clear();
+  }
+  return command;
+}
+
+void generator_manager::start_commands()
+{
+  std::string command;
+  size_t i;
+  for(i = 0; i < pipes_.size(); ++i) {
+    command = get_cmd();
+    if(command.empty())
+      break;
+    start_one_command(command, i);
+  }
+  for( ; i < pipes_.size(); ++i)
+    pipes_.discard(i);
+
+  while(!pid2pipe_.empty()) {
+    int status;
+    int res = ::wait(&status);
+    if(res == -1) {
+      if(errno == EINTR) continue;
+      break;
+    }
+    cmd_info_type info = pid2pipe_[res];
+    pid2pipe_.erase(info.pipe);
+    command = get_cmd();
+    if(!command.empty()) {
+      start_one_command(command, info.pipe);
+    } else {
+      pipes_.discard(info.pipe);
+    }
+    if(!display_status(status, info.command)) {
+      cleanup();
+      exit(EXIT_FAILURE);
+    }
+  }
+}
+
+bool generator_manager::display_status(int status, const std::string& command)
+{
+  if(WIFEXITED(status) && WEXITSTATUS(status) != 0) {
+    std::cerr << "Command '" << command
+              << "' exited with error status " << WEXITSTATUS(status) << std::endl;
+    return false;
+  } else if(WIFSIGNALED(status)) {
+    std::cerr << "Command '" << command
+              << "' killed by signal " << WTERMSIG(status) << std::endl;
+    return false;
+  }
+  return true;
+}
+
+} // namespace jellyfish
diff --git a/lib/int128.cc b/lib/int128.cc
new file mode 100644
index 0000000..6f2d1f4
--- /dev/null
+++ b/lib/int128.cc
@@ -0,0 +1,94 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+
+void __int128_ns::__print_bases(std::ostream& prefix, std::ostream& os,
+                                unsigned __int128 x, 
+                                const std::ios::fmtflags& ff) {
+  if(x == 0) {
+    os << "0";
+    return;
+  }
+  if(ff & std::ios::showbase) {
+    if(ff & std::ios::hex) {
+      if(ff & std::ios::uppercase)
+        prefix << "0X";
+      else
+        prefix << "0x";
+    } else if(ff & std::ios::oct) {
+      prefix << "0";
+    }
+  }
+  if(ff & std::ios::hex) {
+    __print_digits<16>(os, (unsigned __int128)x,
+                       !(ff & std::ios::uppercase));
+  } else if(ff & std::ios::oct) {
+    __print_digits<8>(os, (unsigned __int128)x);
+  }
+}
+
+#ifndef HAVE_NUMERIC_LIMITS128
+const int std::numeric_limits<__int128>::digits;
+const int std::numeric_limits<__int128>::digits10;
+const bool std::numeric_limits<__int128>::is_signed;
+const bool std::numeric_limits<__int128>::is_integer;
+const bool std::numeric_limits<__int128>::is_exact;
+const int std::numeric_limits<__int128>::radix;
+const int std::numeric_limits<__int128>::min_exponent;
+const int std::numeric_limits<__int128>::min_exponent10;
+const int std::numeric_limits<__int128>::max_exponent;
+const int std::numeric_limits<__int128>::max_exponent10;
+const bool std::numeric_limits<__int128>::has_infinity;
+const bool std::numeric_limits<__int128>::has_quiet_NaN;
+const bool std::numeric_limits<__int128>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<__int128>::has_denorm;
+const bool std::numeric_limits<__int128>::has_denorm_loss;
+const bool std::numeric_limits<__int128>::is_iec559;
+const bool std::numeric_limits<__int128>::is_bounded;
+const bool std::numeric_limits<__int128>::is_modulo;
+const bool std::numeric_limits<__int128>::traps;
+const bool std::numeric_limits<__int128>::tinyness_before;
+const std::float_round_style std::numeric_limits<__int128>::round_style;
+
+const int std::numeric_limits<unsigned __int128>::digits;
+const int std::numeric_limits<unsigned __int128>::digits10;
+const bool std::numeric_limits<unsigned __int128>::is_signed;
+const bool std::numeric_limits<unsigned __int128>::is_integer;
+const bool std::numeric_limits<unsigned __int128>::is_exact;
+const int std::numeric_limits<unsigned __int128>::radix;
+const int std::numeric_limits<unsigned __int128>::min_exponent;
+const int std::numeric_limits<unsigned __int128>::min_exponent10;
+const int std::numeric_limits<unsigned __int128>::max_exponent;
+const int std::numeric_limits<unsigned __int128>::max_exponent10;
+const bool std::numeric_limits<unsigned __int128>::has_infinity;
+const bool std::numeric_limits<unsigned __int128>::has_quiet_NaN;
+const bool std::numeric_limits<unsigned __int128>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<unsigned __int128>::has_denorm;
+const bool std::numeric_limits<unsigned __int128>::has_denorm_loss;
+const bool std::numeric_limits<unsigned __int128>::is_iec559;
+const bool std::numeric_limits<unsigned __int128>::is_bounded;
+const bool std::numeric_limits<unsigned __int128>::is_modulo;
+const bool std::numeric_limits<unsigned __int128>::traps;
+const bool std::numeric_limits<unsigned __int128>::tinyness_before;
+const std::float_round_style std::numeric_limits<unsigned __int128>::round_style;
+#endif 
+#endif
diff --git a/lib/jsoncpp.cpp b/lib/jsoncpp.cpp
new file mode 100644
index 0000000..6665010
--- /dev/null
+++ b/lib/jsoncpp.cpp
@@ -0,0 +1,4230 @@
+/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/).
+/// It is intented to be used with #include <jellyfish/json.h>
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+/*
+The JsonCpp library's source code, including accompanying documentation, 
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all 
+jurisdictions which recognize such a disclaimer. In such jurisdictions, 
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this 
+software may choose to accept it either as 1) Public Domain, 2) under the 
+conditions of the MIT License (see below), or 3) under the terms of dual 
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+   http://en.wikipedia.org/wiki/MIT_License
+   
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+*/
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+#include <jellyfish/json.h>
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_tool.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+# define LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+
+/* This header provides common string manipulation support, such as UTF-8,
+ * portable conversion from/to string...
+ *
+ * It is an internal header that must not be exposed.
+ */
+
+namespace Json {
+
+/// Converts a unicode code-point to UTF-8.
+static inline std::string 
+codePointToUTF8(unsigned int cp)
+{
+   std::string result;
+   
+   // based on description from http://en.wikipedia.org/wiki/UTF-8
+
+   if (cp <= 0x7f) 
+   {
+      result.resize(1);
+      result[0] = static_cast<char>(cp);
+   } 
+   else if (cp <= 0x7FF) 
+   {
+      result.resize(2);
+      result[1] = static_cast<char>(0x80 | (0x3f & cp));
+      result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));
+   } 
+   else if (cp <= 0xFFFF) 
+   {
+      result.resize(3);
+      result[2] = static_cast<char>(0x80 | (0x3f & cp));
+      result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));
+      result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));
+   }
+   else if (cp <= 0x10FFFF) 
+   {
+      result.resize(4);
+      result[3] = static_cast<char>(0x80 | (0x3f & cp));
+      result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
+      result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));
+      result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));
+   }
+
+   return result;
+}
+
+
+/// Returns true if ch is a control character (in range [0,32[).
+static inline bool 
+isControlCharacter(char ch)
+{
+   return ch > 0 && ch <= 0x1F;
+}
+
+
+enum { 
+   /// Constant that specify the size of the buffer that must be passed to uintToString.
+   uintToStringBufferSize = 3*sizeof(LargestUInt)+1 
+};
+
+// Defines a char buffer for use with uintToString().
+typedef char UIntToStringBuffer[uintToStringBufferSize];
+
+
+/** Converts an unsigned integer to string.
+ * @param value Unsigned interger to convert to string
+ * @param current Input/Output string buffer. 
+ *        Must have at least uintToStringBufferSize chars free.
+ */
+static inline void 
+uintToString( LargestUInt value, 
+              char *&current )
+{
+   *--current = 0;
+   do
+   {
+      *--current = char(value % 10) + '0';
+      value /= 10;
+   }
+   while ( value != 0 );
+}
+
+} // namespace Json {
+
+#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_tool.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_reader.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/reader.h>
+# include <json/value.h>
+# include "json_tool.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <utility>
+#include <cstdio>
+#include <cassert>
+#include <cstring>
+#include <iostream>
+#include <stdexcept>
+
+#if _MSC_VER >= 1400 // VC++ 8.0
+#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.
+#endif
+
+namespace Json {
+
+// Implementation of class Features
+// ////////////////////////////////
+
+Features::Features()
+   : allowComments_( true )
+   , strictRoot_( false )
+{
+}
+
+
+Features 
+Features::all()
+{
+   return Features();
+}
+
+
+Features 
+Features::strictMode()
+{
+   Features features;
+   features.allowComments_ = false;
+   features.strictRoot_ = true;
+   return features;
+}
+
+// Implementation of class Reader
+// ////////////////////////////////
+
+
+static inline bool 
+in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )
+{
+   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4;
+}
+
+static inline bool 
+in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )
+{
+   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4  ||  c == c5;
+}
+
+
+static bool 
+containsNewLine( Reader::Location begin, 
+                 Reader::Location end )
+{
+   for ( ;begin < end; ++begin )
+      if ( *begin == '\n'  ||  *begin == '\r' )
+         return true;
+   return false;
+}
+
+
+// Class Reader
+// //////////////////////////////////////////////////////////////////
+
+Reader::Reader()
+   : features_( Features::all() )
+{
+}
+
+
+Reader::Reader( const Features &features )
+   : features_( features )
+{
+}
+
+
+bool
+Reader::parse( const std::string &document, 
+               Value &root,
+               bool collectComments )
+{
+   document_ = document;
+   const char *begin = document_.c_str();
+   const char *end = begin + document_.length();
+   return parse( begin, end, root, collectComments );
+}
+
+
+bool
+Reader::parse( std::istream& sin,
+               Value &root,
+               bool collectComments )
+{
+   //std::istream_iterator<char> begin(sin);
+   //std::istream_iterator<char> end;
+   // Those would allow streamed input from a file, if parse() were a
+   // template function.
+
+   // Since std::string is reference-counted, this at least does not
+   // create an extra copy.
+   std::string doc;
+   std::getline(sin, doc, (char)EOF);
+   return parse( doc, root, collectComments );
+}
+
+bool 
+Reader::parse( const char *beginDoc, const char *endDoc, 
+               Value &root,
+               bool collectComments )
+{
+   if ( !features_.allowComments_ )
+   {
+      collectComments = false;
+   }
+
+   begin_ = beginDoc;
+   end_ = endDoc;
+   collectComments_ = collectComments;
+   current_ = begin_;
+   lastValueEnd_ = 0;
+   lastValue_ = 0;
+   commentsBefore_ = "";
+   errors_.clear();
+   while ( !nodes_.empty() )
+      nodes_.pop();
+   nodes_.push( &root );
+   
+   bool successful = readValue();
+   Token token;
+   skipCommentTokens( token );
+   if ( collectComments_  &&  !commentsBefore_.empty() )
+      root.setComment( commentsBefore_, commentAfter );
+   if ( features_.strictRoot_ )
+   {
+      if ( !root.isArray()  &&  !root.isObject() )
+      {
+         // Set error location to start of doc, ideally should be first token found in doc
+         token.type_ = tokenError;
+         token.start_ = beginDoc;
+         token.end_ = endDoc;
+         addError( "A valid JSON document must be either an array or an object value.",
+                   token );
+         return false;
+      }
+   }
+   return successful;
+}
+
+
+bool
+Reader::readValue()
+{
+   Token token;
+   skipCommentTokens( token );
+   bool successful = true;
+
+   if ( collectComments_  &&  !commentsBefore_.empty() )
+   {
+      currentValue().setComment( commentsBefore_, commentBefore );
+      commentsBefore_ = "";
+   }
+
+
+   switch ( token.type_ )
+   {
+   case tokenObjectBegin:
+      successful = readObject( token );
+      break;
+   case tokenArrayBegin:
+      successful = readArray( token );
+      break;
+   case tokenNumber:
+      successful = decodeNumber( token );
+      break;
+   case tokenString:
+      successful = decodeString( token );
+      break;
+   case tokenTrue:
+      currentValue() = true;
+      break;
+   case tokenFalse:
+      currentValue() = false;
+      break;
+   case tokenNull:
+      currentValue() = Value();
+      break;
+   default:
+      return addError( "Syntax error: value, object or array expected.", token );
+   }
+
+   if ( collectComments_ )
+   {
+      lastValueEnd_ = current_;
+      lastValue_ = &currentValue();
+   }
+
+   return successful;
+}
+
+
+void 
+Reader::skipCommentTokens( Token &token )
+{
+   if ( features_.allowComments_ )
+   {
+      do
+      {
+         readToken( token );
+      }
+      while ( token.type_ == tokenComment );
+   }
+   else
+   {
+      readToken( token );
+   }
+}
+
+
+bool 
+Reader::expectToken( TokenType type, Token &token, const char *message )
+{
+   readToken( token );
+   if ( token.type_ != type )
+      return addError( message, token );
+   return true;
+}
+
+
+bool 
+Reader::readToken( Token &token )
+{
+   skipSpaces();
+   token.start_ = current_;
+   Char c = getNextChar();
+   bool ok = true;
+   switch ( c )
+   {
+   case '{':
+      token.type_ = tokenObjectBegin;
+      break;
+   case '}':
+      token.type_ = tokenObjectEnd;
+      break;
+   case '[':
+      token.type_ = tokenArrayBegin;
+      break;
+   case ']':
+      token.type_ = tokenArrayEnd;
+      break;
+   case '"':
+      token.type_ = tokenString;
+      ok = readString();
+      break;
+   case '/':
+      token.type_ = tokenComment;
+      ok = readComment();
+      break;
+   case '0':
+   case '1':
+   case '2':
+   case '3':
+   case '4':
+   case '5':
+   case '6':
+   case '7':
+   case '8':
+   case '9':
+   case '-':
+      token.type_ = tokenNumber;
+      readNumber();
+      break;
+   case 't':
+      token.type_ = tokenTrue;
+      ok = match( "rue", 3 );
+      break;
+   case 'f':
+      token.type_ = tokenFalse;
+      ok = match( "alse", 4 );
+      break;
+   case 'n':
+      token.type_ = tokenNull;
+      ok = match( "ull", 3 );
+      break;
+   case ',':
+      token.type_ = tokenArraySeparator;
+      break;
+   case ':':
+      token.type_ = tokenMemberSeparator;
+      break;
+   case 0:
+      token.type_ = tokenEndOfStream;
+      break;
+   default:
+      ok = false;
+      break;
+   }
+   if ( !ok )
+      token.type_ = tokenError;
+   token.end_ = current_;
+   return true;
+}
+
+
+void 
+Reader::skipSpaces()
+{
+   while ( current_ != end_ )
+   {
+      Char c = *current_;
+      if ( c == ' '  ||  c == '\t'  ||  c == '\r'  ||  c == '\n' )
+         ++current_;
+      else
+         break;
+   }
+}
+
+
+bool 
+Reader::match( Location pattern, 
+               int patternLength )
+{
+   if ( end_ - current_ < patternLength )
+      return false;
+   int index = patternLength;
+   while ( index-- )
+      if ( current_[index] != pattern[index] )
+         return false;
+   current_ += patternLength;
+   return true;
+}
+
+
+bool
+Reader::readComment()
+{
+   Location commentBegin = current_ - 1;
+   Char c = getNextChar();
+   bool successful = false;
+   if ( c == '*' )
+      successful = readCStyleComment();
+   else if ( c == '/' )
+      successful = readCppStyleComment();
+   if ( !successful )
+      return false;
+
+   if ( collectComments_ )
+   {
+      CommentPlacement placement = commentBefore;
+      if ( lastValueEnd_  &&  !containsNewLine( lastValueEnd_, commentBegin ) )
+      {
+         if ( c != '*'  ||  !containsNewLine( commentBegin, current_ ) )
+            placement = commentAfterOnSameLine;
+      }
+
+      addComment( commentBegin, current_, placement );
+   }
+   return true;
+}
+
+
+void 
+Reader::addComment( Location begin, 
+                    Location end, 
+                    CommentPlacement placement )
+{
+   assert( collectComments_ );
+   if ( placement == commentAfterOnSameLine )
+   {
+      assert( lastValue_ != 0 );
+      lastValue_->setComment( std::string( begin, end ), placement );
+   }
+   else
+   {
+      if ( !commentsBefore_.empty() )
+         commentsBefore_ += "\n";
+      commentsBefore_ += std::string( begin, end );
+   }
+}
+
+
+bool 
+Reader::readCStyleComment()
+{
+   while ( current_ != end_ )
+   {
+      Char c = getNextChar();
+      if ( c == '*'  &&  *current_ == '/' )
+         break;
+   }
+   return getNextChar() == '/';
+}
+
+
+bool 
+Reader::readCppStyleComment()
+{
+   while ( current_ != end_ )
+   {
+      Char c = getNextChar();
+      if (  c == '\r'  ||  c == '\n' )
+         break;
+   }
+   return true;
+}
+
+
+void 
+Reader::readNumber()
+{
+   while ( current_ != end_ )
+   {
+      if ( !(*current_ >= '0'  &&  *current_ <= '9')  &&
+           !in( *current_, '.', 'e', 'E', '+', '-' ) )
+         break;
+      ++current_;
+   }
+}
+
+bool
+Reader::readString()
+{
+   Char c = 0;
+   while ( current_ != end_ )
+   {
+      c = getNextChar();
+      if ( c == '\\' )
+         getNextChar();
+      else if ( c == '"' )
+         break;
+   }
+   return c == '"';
+}
+
+
+bool 
+Reader::readObject( Token &/*tokenStart*/ )
+{
+   Token tokenName;
+   std::string name;
+   currentValue() = Value( objectValue );
+   while ( readToken( tokenName ) )
+   {
+      bool initialTokenOk = true;
+      while ( tokenName.type_ == tokenComment  &&  initialTokenOk )
+         initialTokenOk = readToken( tokenName );
+      if  ( !initialTokenOk )
+         break;
+      if ( tokenName.type_ == tokenObjectEnd  &&  name.empty() )  // empty object
+         return true;
+      if ( tokenName.type_ != tokenString )
+         break;
+      
+      name = "";
+      if ( !decodeString( tokenName, name ) )
+         return recoverFromError( tokenObjectEnd );
+
+      Token colon;
+      if ( !readToken( colon ) ||  colon.type_ != tokenMemberSeparator )
+      {
+         return addErrorAndRecover( "Missing ':' after object member name", 
+                                    colon, 
+                                    tokenObjectEnd );
+      }
+      Value &value = currentValue()[ name ];
+      nodes_.push( &value );
+      bool ok = readValue();
+      nodes_.pop();
+      if ( !ok ) // error already set
+         return recoverFromError( tokenObjectEnd );
+
+      Token comma;
+      if ( !readToken( comma )
+            ||  ( comma.type_ != tokenObjectEnd  &&  
+                  comma.type_ != tokenArraySeparator &&
+                  comma.type_ != tokenComment ) )
+      {
+         return addErrorAndRecover( "Missing ',' or '}' in object declaration", 
+                                    comma, 
+                                    tokenObjectEnd );
+      }
+      bool finalizeTokenOk = true;
+      while ( comma.type_ == tokenComment &&
+              finalizeTokenOk )
+         finalizeTokenOk = readToken( comma );
+      if ( comma.type_ == tokenObjectEnd )
+         return true;
+   }
+   return addErrorAndRecover( "Missing '}' or object member name", 
+                              tokenName, 
+                              tokenObjectEnd );
+}
+
+
+bool 
+Reader::readArray( Token &/*tokenStart*/ )
+{
+   currentValue() = Value( arrayValue );
+   skipSpaces();
+   if ( *current_ == ']' ) // empty array
+   {
+      Token endArray;
+      readToken( endArray );
+      return true;
+   }
+   int index = 0;
+   for (;;)
+   {
+      Value &value = currentValue()[ index++ ];
+      nodes_.push( &value );
+      bool ok = readValue();
+      nodes_.pop();
+      if ( !ok ) // error already set
+         return recoverFromError( tokenArrayEnd );
+
+      Token token;
+      // Accept Comment after last item in the array.
+      ok = readToken( token );
+      while ( token.type_ == tokenComment  &&  ok )
+      {
+         ok = readToken( token );
+      }
+      bool badTokenType = ( token.type_ != tokenArraySeparator  &&
+                            token.type_ != tokenArrayEnd );
+      if ( !ok  ||  badTokenType )
+      {
+         return addErrorAndRecover( "Missing ',' or ']' in array declaration", 
+                                    token, 
+                                    tokenArrayEnd );
+      }
+      if ( token.type_ == tokenArrayEnd )
+         break;
+   }
+   return true;
+}
+
+
+bool 
+Reader::decodeNumber( Token &token )
+{
+   bool isDouble = false;
+   for ( Location inspect = token.start_; inspect != token.end_; ++inspect )
+   {
+      isDouble = isDouble  
+                 ||  in( *inspect, '.', 'e', 'E', '+' )  
+                 ||  ( *inspect == '-'  &&  inspect != token.start_ );
+   }
+   if ( isDouble )
+      return decodeDouble( token );
+   // Attempts to parse the number as an integer. If the number is
+   // larger than the maximum supported value of an integer then
+   // we decode the number as a double.
+   Location current = token.start_;
+   bool isNegative = *current == '-';
+   if ( isNegative )
+      ++current;
+   Value::LargestUInt maxIntegerValue = isNegative ? Value::LargestUInt(-Value::minLargestInt) 
+                                                   : Value::maxLargestUInt;
+   Value::LargestUInt threshold = maxIntegerValue / 10;
+   Value::UInt lastDigitThreshold = Value::UInt( maxIntegerValue % 10 );
+   assert( lastDigitThreshold <= 9 );
+   Value::LargestUInt value = 0;
+   while ( current < token.end_ )
+   {
+      Char c = *current++;
+      if ( c < '0'  ||  c > '9' )
+         return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
+      Value::UInt digit(c - '0');
+      if ( value >= threshold )
+      {
+         // If the current digit is not the last one, or if it is
+         // greater than the last digit of the maximum integer value,
+         // the parse the number as a double.
+         if ( current != token.end_  ||  digit > lastDigitThreshold )
+         {
+            return decodeDouble( token );
+         }
+      }
+      value = value * 10 + digit;
+   }
+   if ( isNegative )
+      currentValue() = -Value::LargestInt( value );
+   else if ( value <= Value::LargestUInt(Value::maxInt) )
+      currentValue() = Value::LargestInt( value );
+   else
+      currentValue() = value;
+   return true;
+}
+
+
+bool 
+Reader::decodeDouble( Token &token )
+{
+   double value = 0;
+   const int bufferSize = 32;
+   int count;
+   int length = int(token.end_ - token.start_);
+   if ( length <= bufferSize )
+   {
+      Char buffer[bufferSize+1];
+      memcpy( buffer, token.start_, length );
+      buffer[length] = 0;
+      count = sscanf( buffer, "%lf", &value );
+   }
+   else
+   {
+      std::string buffer( token.start_, token.end_ );
+      count = sscanf( buffer.c_str(), "%lf", &value );
+   }
+
+   if ( count != 1 )
+      return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
+   currentValue() = value;
+   return true;
+}
+
+
+bool 
+Reader::decodeString( Token &token )
+{
+   std::string decoded;
+   if ( !decodeString( token, decoded ) )
+      return false;
+   currentValue() = decoded;
+   return true;
+}
+
+
+bool 
+Reader::decodeString( Token &token, std::string &decoded )
+{
+   decoded.reserve( token.end_ - token.start_ - 2 );
+   Location current = token.start_ + 1; // skip '"'
+   Location end = token.end_ - 1;      // do not include '"'
+   while ( current != end )
+   {
+      Char c = *current++;
+      if ( c == '"' )
+         break;
+      else if ( c == '\\' )
+      {
+         if ( current == end )
+            return addError( "Empty escape sequence in string", token, current );
+         Char escape = *current++;
+         switch ( escape )
+         {
+         case '"': decoded += '"'; break;
+         case '/': decoded += '/'; break;
+         case '\\': decoded += '\\'; break;
+         case 'b': decoded += '\b'; break;
+         case 'f': decoded += '\f'; break;
+         case 'n': decoded += '\n'; break;
+         case 'r': decoded += '\r'; break;
+         case 't': decoded += '\t'; break;
+         case 'u':
+            {
+               unsigned int unicode;
+               if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
+                  return false;
+               decoded += codePointToUTF8(unicode);
+            }
+            break;
+         default:
+            return addError( "Bad escape sequence in string", token, current );
+         }
+      }
+      else
+      {
+         decoded += c;
+      }
+   }
+   return true;
+}
+
+bool
+Reader::decodeUnicodeCodePoint( Token &token, 
+                                     Location &current, 
+                                     Location end, 
+                                     unsigned int &unicode )
+{
+
+   if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )
+      return false;
+   if (unicode >= 0xD800 && unicode <= 0xDBFF)
+   {
+      // surrogate pairs
+      if (end - current < 6)
+         return addError( "additional six characters expected to parse unicode surrogate pair.", token, current );
+      unsigned int surrogatePair;
+      if (*(current++) == '\\' && *(current++)== 'u')
+      {
+         if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))
+         {
+            unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
+         } 
+         else
+            return false;
+      } 
+      else
+         return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current );
+   }
+   return true;
+}
+
+bool 
+Reader::decodeUnicodeEscapeSequence( Token &token, 
+                                     Location &current, 
+                                     Location end, 
+                                     unsigned int &unicode )
+{
+   if ( end - current < 4 )
+      return addError( "Bad unicode escape sequence in string: four digits expected.", token, current );
+   unicode = 0;
+   for ( int index =0; index < 4; ++index )
+   {
+      Char c = *current++;
+      unicode *= 16;
+      if ( c >= '0'  &&  c <= '9' )
+         unicode += c - '0';
+      else if ( c >= 'a'  &&  c <= 'f' )
+         unicode += c - 'a' + 10;
+      else if ( c >= 'A'  &&  c <= 'F' )
+         unicode += c - 'A' + 10;
+      else
+         return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current );
+   }
+   return true;
+}
+
+
+bool 
+Reader::addError( const std::string &message, 
+                  Token &token,
+                  Location extra )
+{
+   ErrorInfo info;
+   info.token_ = token;
+   info.message_ = message;
+   info.extra_ = extra;
+   errors_.push_back( info );
+   return false;
+}
+
+
+bool 
+Reader::recoverFromError( TokenType skipUntilToken )
+{
+   int errorCount = int(errors_.size());
+   Token skip;
+   for (;;)
+   {
+      if ( !readToken(skip) )
+         errors_.resize( errorCount ); // discard errors caused by recovery
+      if ( skip.type_ == skipUntilToken  ||  skip.type_ == tokenEndOfStream )
+         break;
+   }
+   errors_.resize( errorCount );
+   return false;
+}
+
+
+bool 
+Reader::addErrorAndRecover( const std::string &message, 
+                            Token &token,
+                            TokenType skipUntilToken )
+{
+   addError( message, token );
+   return recoverFromError( skipUntilToken );
+}
+
+
+Value &
+Reader::currentValue()
+{
+   return *(nodes_.top());
+}
+
+
+Reader::Char 
+Reader::getNextChar()
+{
+   if ( current_ == end_ )
+      return 0;
+   return *current_++;
+}
+
+
+void 
+Reader::getLocationLineAndColumn( Location location,
+                                  int &line,
+                                  int &column ) const
+{
+   Location current = begin_;
+   Location lastLineStart = current;
+   line = 0;
+   while ( current < location  &&  current != end_ )
+   {
+      Char c = *current++;
+      if ( c == '\r' )
+      {
+         if ( *current == '\n' )
+            ++current;
+         lastLineStart = current;
+         ++line;
+      }
+      else if ( c == '\n' )
+      {
+         lastLineStart = current;
+         ++line;
+      }
+   }
+   // column & line start at 1
+   column = int(location - lastLineStart) + 1;
+   ++line;
+}
+
+
+std::string
+Reader::getLocationLineAndColumn( Location location ) const
+{
+   int line, column;
+   getLocationLineAndColumn( location, line, column );
+   char buffer[18+16+16+1];
+   sprintf( buffer, "Line %d, Column %d", line, column );
+   return buffer;
+}
+
+
+// Deprecated. Preserved for backward compatibility
+std::string 
+Reader::getFormatedErrorMessages() const
+{
+    return getFormattedErrorMessages();
+}
+
+
+std::string 
+Reader::getFormattedErrorMessages() const
+{
+   std::string formattedMessage;
+   for ( Errors::const_iterator itError = errors_.begin();
+         itError != errors_.end();
+         ++itError )
+   {
+      const ErrorInfo &error = *itError;
+      formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n";
+      formattedMessage += "  " + error.message_ + "\n";
+      if ( error.extra_ )
+         formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n";
+   }
+   return formattedMessage;
+}
+
+
+std::istream& operator>>( std::istream &sin, Value &root )
+{
+    Json::Reader reader;
+    bool ok = reader.parse(sin, root, true);
+    //JSON_ASSERT( ok );
+    if (!ok) throw std::runtime_error(reader.getFormattedErrorMessages());
+    return sin;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_reader.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_batchallocator.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED
+# define JSONCPP_BATCHALLOCATOR_H_INCLUDED
+
+# include <stdlib.h>
+# include <assert.h>
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+namespace Json {
+
+/* Fast memory allocator.
+ *
+ * This memory allocator allocates memory for a batch of object (specified by
+ * the page size, the number of object in each page).
+ *
+ * It does not allow the destruction of a single object. All the allocated objects
+ * can be destroyed at once. The memory can be either released or reused for future
+ * allocation.
+ * 
+ * The in-place new operator must be used to construct the object using the pointer
+ * returned by allocate.
+ */
+template<typename AllocatedType
+        ,const unsigned int objectPerAllocation>
+class BatchAllocator
+{
+public:
+   typedef AllocatedType Type;
+
+   BatchAllocator( unsigned int objectsPerPage = 255 )
+      : freeHead_( 0 )
+      , objectsPerPage_( objectsPerPage )
+   {
+//      printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() );
+      assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space.
+      assert( objectsPerPage >= 16 );
+      batches_ = allocateBatch( 0 );   // allocated a dummy page
+      currentBatch_ = batches_;
+   }
+
+   ~BatchAllocator()
+   {
+      for ( BatchInfo *batch = batches_; batch;  )
+      {
+         BatchInfo *nextBatch = batch->next_;
+         free( batch );
+         batch = nextBatch;
+      }
+   }
+
+   /// allocate space for an array of objectPerAllocation object.
+   /// @warning it is the responsability of the caller to call objects constructors.
+   AllocatedType *allocate()
+   {
+      if ( freeHead_ ) // returns node from free list.
+      {
+         AllocatedType *object = freeHead_;
+         freeHead_ = *(AllocatedType **)object;
+         return object;
+      }
+      if ( currentBatch_->used_ == currentBatch_->end_ )
+      {
+         currentBatch_ = currentBatch_->next_;
+         while ( currentBatch_  &&  currentBatch_->used_ == currentBatch_->end_ )
+            currentBatch_ = currentBatch_->next_;
+
+         if ( !currentBatch_  ) // no free batch found, allocate a new one
+         { 
+            currentBatch_ = allocateBatch( objectsPerPage_ );
+            currentBatch_->next_ = batches_; // insert at the head of the list
+            batches_ = currentBatch_;
+         }
+      }
+      AllocatedType *allocated = currentBatch_->used_;
+      currentBatch_->used_ += objectPerAllocation;
+      return allocated;
+   }
+
+   /// Release the object.
+   /// @warning it is the responsability of the caller to actually destruct the object.
+   void release( AllocatedType *object )
+   {
+      assert( object != 0 );
+      *(AllocatedType **)object = freeHead_;
+      freeHead_ = object;
+   }
+
+private:
+   struct BatchInfo
+   {
+      BatchInfo *next_;
+      AllocatedType *used_;
+      AllocatedType *end_;
+      AllocatedType buffer_[objectPerAllocation];
+   };
+
+   // disabled copy constructor and assignement operator.
+   BatchAllocator( const BatchAllocator & );
+   void operator =( const BatchAllocator &);
+
+   static BatchInfo *allocateBatch( unsigned int objectsPerPage )
+   {
+      const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation
+                                + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage;
+      BatchInfo *batch = static_cast<BatchInfo*>( malloc( mallocSize ) );
+      batch->next_ = 0;
+      batch->used_ = batch->buffer_;
+      batch->end_ = batch->buffer_ + objectsPerPage;
+      return batch;
+   }
+
+   BatchInfo *batches_;
+   BatchInfo *currentBatch_;
+   /// Head of a single linked list within the allocated space of freeed object
+   AllocatedType *freeHead_;
+   unsigned int objectsPerPage_;
+};
+
+
+} // namespace Json
+
+# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION
+
+#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED
+
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_batchallocator.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_valueiterator.inl
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+// included by json_value.cpp
+
+namespace Json {
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueIteratorBase
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueIteratorBase::ValueIteratorBase()
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   : current_()
+   , isNull_( true )
+{
+}
+#else
+   : isArray_( true )
+   , isNull_( true )
+{
+   iterator_.array_ = ValueInternalArray::IteratorState();
+}
+#endif
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator &current )
+   : current_( current )
+   , isNull_( false )
+{
+}
+#else
+ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state )
+   : isArray_( true )
+{
+   iterator_.array_ = state;
+}
+
+
+ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state )
+   : isArray_( false )
+{
+   iterator_.map_ = state;
+}
+#endif
+
+Value &
+ValueIteratorBase::deref() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   return current_->second;
+#else
+   if ( isArray_ )
+      return ValueInternalArray::dereference( iterator_.array_ );
+   return ValueInternalMap::value( iterator_.map_ );
+#endif
+}
+
+
+void 
+ValueIteratorBase::increment()
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   ++current_;
+#else
+   if ( isArray_ )
+      ValueInternalArray::increment( iterator_.array_ );
+   ValueInternalMap::increment( iterator_.map_ );
+#endif
+}
+
+
+void 
+ValueIteratorBase::decrement()
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   --current_;
+#else
+   if ( isArray_ )
+      ValueInternalArray::decrement( iterator_.array_ );
+   ValueInternalMap::decrement( iterator_.map_ );
+#endif
+}
+
+
+ValueIteratorBase::difference_type 
+ValueIteratorBase::computeDistance( const SelfType &other ) const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+# ifdef JSON_USE_CPPTL_SMALLMAP
+   return current_ - other.current_;
+# else
+   // Iterator for null value are initialized using the default
+   // constructor, which initialize current_ to the default
+   // std::map::iterator. As begin() and end() are two instance 
+   // of the default std::map::iterator, they can not be compared.
+   // To allow this, we handle this comparison specifically.
+   if ( isNull_  &&  other.isNull_ )
+   {
+      return 0;
+   }
+
+
+   // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL,
+   // which is the one used by default).
+   // Using a portable hand-made version for non random iterator instead:
+   //   return difference_type( std::distance( current_, other.current_ ) );
+   difference_type myDistance = 0;
+   for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it )
+   {
+      ++myDistance;
+   }
+   return myDistance;
+# endif
+#else
+   if ( isArray_ )
+      return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ );
+   return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ );
+#endif
+}
+
+
+bool 
+ValueIteratorBase::isEqual( const SelfType &other ) const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   if ( isNull_ )
+   {
+      return other.isNull_;
+   }
+   return current_ == other.current_;
+#else
+   if ( isArray_ )
+      return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ );
+   return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ );
+#endif
+}
+
+
+void 
+ValueIteratorBase::copy( const SelfType &other )
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   current_ = other.current_;
+#else
+   if ( isArray_ )
+      iterator_.array_ = other.iterator_.array_;
+   iterator_.map_ = other.iterator_.map_;
+#endif
+}
+
+
+Value 
+ValueIteratorBase::key() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   const Value::CZString czstring = (*current_).first;
+   if ( czstring.c_str() )
+   {
+      if ( czstring.isStaticString() )
+         return Value( StaticString( czstring.c_str() ) );
+      return Value( czstring.c_str() );
+   }
+   return Value( czstring.index() );
+#else
+   if ( isArray_ )
+      return Value( ValueInternalArray::indexOf( iterator_.array_ ) );
+   bool isStatic;
+   const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic );
+   if ( isStatic )
+      return Value( StaticString( memberName ) );
+   return Value( memberName );
+#endif
+}
+
+
+UInt 
+ValueIteratorBase::index() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   const Value::CZString czstring = (*current_).first;
+   if ( !czstring.c_str() )
+      return czstring.index();
+   return Value::UInt( -1 );
+#else
+   if ( isArray_ )
+      return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) );
+   return Value::UInt( -1 );
+#endif
+}
+
+
+const char *
+ValueIteratorBase::memberName() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   const char *name = (*current_).first.c_str();
+   return name ? name : "";
+#else
+   if ( !isArray_ )
+      return ValueInternalMap::key( iterator_.map_ );
+   return "";
+#endif
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueConstIterator
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueConstIterator::ValueConstIterator()
+{
+}
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator &current )
+   : ValueIteratorBase( current )
+{
+}
+#else
+ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state )
+   : ValueIteratorBase( state )
+{
+}
+
+ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state )
+   : ValueIteratorBase( state )
+{
+}
+#endif
+
+ValueConstIterator &
+ValueConstIterator::operator =( const ValueIteratorBase &other )
+{
+   copy( other );
+   return *this;
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueIterator
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueIterator::ValueIterator()
+{
+}
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueIterator::ValueIterator( const Value::ObjectValues::iterator &current )
+   : ValueIteratorBase( current )
+{
+}
+#else
+ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state )
+   : ValueIteratorBase( state )
+{
+}
+
+ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state )
+   : ValueIteratorBase( state )
+{
+}
+#endif
+
+ValueIterator::ValueIterator( const ValueConstIterator &other )
+   : ValueIteratorBase( other )
+{
+}
+
+ValueIterator::ValueIterator( const ValueIterator &other )
+   : ValueIteratorBase( other )
+{
+}
+
+ValueIterator &
+ValueIterator::operator =( const SelfType &other )
+{
+   copy( other );
+   return *this;
+}
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_valueiterator.inl
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_value.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/value.h>
+# include <json/writer.h>
+# ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
+#  include "json_batchallocator.h"
+# endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <iostream>
+#include <utility>
+#include <stdexcept>
+#include <cstring>
+#include <cassert>
+#ifdef JSON_USE_CPPTL
+# include <cpptl/conststring.h>
+#endif
+#include <cstddef>    // size_t
+
+#define JSON_ASSERT_UNREACHABLE assert( false )
+#define JSON_ASSERT( condition ) assert( condition );  // @todo <= change this into an exception throw
+#define JSON_FAIL_MESSAGE( message ) throw std::runtime_error( message );
+#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) JSON_FAIL_MESSAGE( message )
+
+namespace Json {
+
+const Value Value::null;
+const Int Value::minInt = Int( ~(UInt(-1)/2) );
+const Int Value::maxInt = Int( UInt(-1)/2 );
+const UInt Value::maxUInt = UInt(-1);
+const Int64 Value::minInt64 = Int64( ~(UInt64(-1)/2) );
+const Int64 Value::maxInt64 = Int64( UInt64(-1)/2 );
+const UInt64 Value::maxUInt64 = UInt64(-1);
+const LargestInt Value::minLargestInt = LargestInt( ~(LargestUInt(-1)/2) );
+const LargestInt Value::maxLargestInt = LargestInt( LargestUInt(-1)/2 );
+const LargestUInt Value::maxLargestUInt = LargestUInt(-1);
+
+
+/// Unknown size marker
+static const unsigned int unknown = (unsigned)-1;
+
+
+/** Duplicates the specified string value.
+ * @param value Pointer to the string to duplicate. Must be zero-terminated if
+ *              length is "unknown".
+ * @param length Length of the value. if equals to unknown, then it will be
+ *               computed using strlen(value).
+ * @return Pointer on the duplicate instance of string.
+ */
+static inline char *
+duplicateStringValue( const char *value, 
+                      unsigned int length = unknown )
+{
+   if ( length == unknown )
+      length = (unsigned int)strlen(value);
+   char *newString = static_cast<char *>( malloc( length + 1 ) );
+   JSON_ASSERT_MESSAGE( newString != 0, "Failed to allocate string value buffer" );
+   memcpy( newString, value, length );
+   newString[length] = 0;
+   return newString;
+}
+
+
+/** Free the string duplicated by duplicateStringValue().
+ */
+static inline void 
+releaseStringValue( char *value )
+{
+   if ( value )
+      free( value );
+}
+
+} // namespace Json
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// ValueInternals...
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+#if !defined(JSON_IS_AMALGAMATION)
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+#  include "json_internalarray.inl"
+#  include "json_internalmap.inl"
+# endif // JSON_VALUE_USE_INTERNAL_MAP
+
+# include "json_valueiterator.inl"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::CommentInfo
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+
+Value::CommentInfo::CommentInfo()
+   : comment_( 0 )
+{
+}
+
+Value::CommentInfo::~CommentInfo()
+{
+   if ( comment_ )
+      releaseStringValue( comment_ );
+}
+
+
+void 
+Value::CommentInfo::setComment( const char *text )
+{
+   if ( comment_ )
+      releaseStringValue( comment_ );
+   JSON_ASSERT( text != 0 );
+   JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
+   // It seems that /**/ style comments are acceptable as well.
+   comment_ = duplicateStringValue( text );
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::CZString
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+# ifndef JSON_VALUE_USE_INTERNAL_MAP
+
+// Notes: index_ indicates if the string was allocated when
+// a string is stored.
+
+Value::CZString::CZString( ArrayIndex index )
+   : cstr_( 0 )
+   , index_( index )
+{
+}
+
+Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
+   : cstr_( allocate == duplicate ? duplicateStringValue(cstr) 
+                                  : cstr )
+   , index_( allocate )
+{
+}
+
+Value::CZString::CZString( const CZString &other )
+: cstr_( other.index_ != noDuplication &&  other.cstr_ != 0
+                ?  duplicateStringValue( other.cstr_ )
+                : other.cstr_ )
+   , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
+                         : other.index_ )
+{
+}
+
+Value::CZString::~CZString()
+{
+   if ( cstr_  &&  index_ == duplicate )
+      releaseStringValue( const_cast<char *>( cstr_ ) );
+}
+
+void 
+Value::CZString::swap( CZString &other )
+{
+   std::swap( cstr_, other.cstr_ );
+   std::swap( index_, other.index_ );
+}
+
+Value::CZString &
+Value::CZString::operator =( const CZString &other )
+{
+   CZString temp( other );
+   swap( temp );
+   return *this;
+}
+
+bool 
+Value::CZString::operator<( const CZString &other ) const 
+{
+   if ( cstr_ )
+      return strcmp( cstr_, other.cstr_ ) < 0;
+   return index_ < other.index_;
+}
+
+bool 
+Value::CZString::operator==( const CZString &other ) const 
+{
+   if ( cstr_ )
+      return strcmp( cstr_, other.cstr_ ) == 0;
+   return index_ == other.index_;
+}
+
+
+ArrayIndex 
+Value::CZString::index() const
+{
+   return index_;
+}
+
+
+const char *
+Value::CZString::c_str() const
+{
+   return cstr_;
+}
+
+bool 
+Value::CZString::isStaticString() const
+{
+   return index_ == noDuplication;
+}
+
+#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::Value
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+/*! \internal Default constructor initialization must be equivalent to:
+ * memset( this, 0, sizeof(Value) )
+ * This optimization is used in ValueInternalMap fast allocator.
+ */
+Value::Value( ValueType type )
+   : type_( type )
+   , allocated_( 0 )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   switch ( type )
+   {
+   case nullValue:
+      break;
+   case intValue:
+   case uintValue:
+      value_.int_ = 0;
+      break;
+   case realValue:
+      value_.real_ = 0.0;
+      break;
+   case stringValue:
+      value_.string_ = 0;
+      break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      value_.map_ = new ObjectValues();
+      break;
+#else
+   case arrayValue:
+      value_.array_ = arrayAllocator()->newArray();
+      break;
+   case objectValue:
+      value_.map_ = mapAllocator()->newMap();
+      break;
+#endif
+   case booleanValue:
+      value_.bool_ = false;
+      break;
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+}
+
+
+#if defined(JSON_HAS_INT64)
+Value::Value( UInt value )
+   : type_( uintValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.uint_ = value;
+}
+
+Value::Value( Int value )
+   : type_( intValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.int_ = value;
+}
+
+#endif // if defined(JSON_HAS_INT64)
+
+
+Value::Value( Int64 value )
+   : type_( intValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.int_ = value;
+}
+
+
+Value::Value( UInt64 value )
+   : type_( uintValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.uint_ = value;
+}
+
+Value::Value( double value )
+   : type_( realValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.real_ = value;
+}
+
+Value::Value( const char *value )
+   : type_( stringValue )
+   , allocated_( true )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.string_ = duplicateStringValue( value );
+}
+
+
+Value::Value( const char *beginValue, 
+              const char *endValue )
+   : type_( stringValue )
+   , allocated_( true )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.string_ = duplicateStringValue( beginValue, 
+                                          (unsigned int)(endValue - beginValue) );
+}
+
+
+Value::Value( const std::string &value )
+   : type_( stringValue )
+   , allocated_( true )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.string_ = duplicateStringValue( value.c_str(), 
+                                          (unsigned int)value.length() );
+
+}
+
+Value::Value( const StaticString &value )
+   : type_( stringValue )
+   , allocated_( false )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.string_ = const_cast<char *>( value.c_str() );
+}
+
+
+# ifdef JSON_USE_CPPTL
+Value::Value( const CppTL::ConstString &value )
+   : type_( stringValue )
+   , allocated_( true )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.string_ = duplicateStringValue( value, value.length() );
+}
+# endif
+
+Value::Value( bool value )
+   : type_( booleanValue )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   value_.bool_ = value;
+}
+
+
+Value::Value( const Value &other )
+   : type_( other.type_ )
+   , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+   , itemIsUsed_( 0 )
+#endif
+{
+   switch ( type_ )
+   {
+   case nullValue:
+   case intValue:
+   case uintValue:
+   case realValue:
+   case booleanValue:
+      value_ = other.value_;
+      break;
+   case stringValue:
+      if ( other.value_.string_ )
+      {
+         value_.string_ = duplicateStringValue( other.value_.string_ );
+         allocated_ = true;
+      }
+      else
+         value_.string_ = 0;
+      break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      value_.map_ = new ObjectValues( *other.value_.map_ );
+      break;
+#else
+   case arrayValue:
+      value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
+      break;
+   case objectValue:
+      value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
+      break;
+#endif
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   if ( other.comments_ )
+   {
+      comments_ = new CommentInfo[numberOfCommentPlacement];
+      for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
+      {
+         const CommentInfo &otherComment = other.comments_[comment];
+         if ( otherComment.comment_ )
+            comments_[comment].setComment( otherComment.comment_ );
+      }
+   }
+}
+
+
+Value::~Value()
+{
+   switch ( type_ )
+   {
+   case nullValue:
+   case intValue:
+   case uintValue:
+   case realValue:
+   case booleanValue:
+      break;
+   case stringValue:
+      if ( allocated_ )
+         releaseStringValue( value_.string_ );
+      break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      delete value_.map_;
+      break;
+#else
+   case arrayValue:
+      arrayAllocator()->destructArray( value_.array_ );
+      break;
+   case objectValue:
+      mapAllocator()->destructMap( value_.map_ );
+      break;
+#endif
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+
+   if ( comments_ )
+      delete[] comments_;
+}
+
+Value &
+Value::operator=( const Value &other )
+{
+   Value temp( other );
+   swap( temp );
+   return *this;
+}
+
+void 
+Value::swap( Value &other )
+{
+   ValueType temp = type_;
+   type_ = other.type_;
+   other.type_ = temp;
+   std::swap( value_, other.value_ );
+   int temp2 = allocated_;
+   allocated_ = other.allocated_;
+   other.allocated_ = temp2;
+}
+
+ValueType 
+Value::type() const
+{
+   return type_;
+}
+
+
+int 
+Value::compare( const Value &other ) const
+{
+   if ( *this < other )
+      return -1;
+   if ( *this > other )
+      return 1;
+   return 0;
+}
+
+
+bool 
+Value::operator <( const Value &other ) const
+{
+   int typeDelta = type_ - other.type_;
+   if ( typeDelta )
+      return typeDelta < 0 ? true : false;
+   switch ( type_ )
+   {
+   case nullValue:
+      return false;
+   case intValue:
+      return value_.int_ < other.value_.int_;
+   case uintValue:
+      return value_.uint_ < other.value_.uint_;
+   case realValue:
+      return value_.real_ < other.value_.real_;
+   case booleanValue:
+      return value_.bool_ < other.value_.bool_;
+   case stringValue:
+      return ( value_.string_ == 0  &&  other.value_.string_ )
+             || ( other.value_.string_  
+                  &&  value_.string_  
+                  && strcmp( value_.string_, other.value_.string_ ) < 0 );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      {
+         int delta = int( value_.map_->size() - other.value_.map_->size() );
+         if ( delta )
+            return delta < 0;
+         return (*value_.map_) < (*other.value_.map_);
+      }
+#else
+   case arrayValue:
+      return value_.array_->compare( *(other.value_.array_) ) < 0;
+   case objectValue:
+      return value_.map_->compare( *(other.value_.map_) ) < 0;
+#endif
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return false;  // unreachable
+}
+
+bool 
+Value::operator <=( const Value &other ) const
+{
+   return !(other < *this);
+}
+
+bool 
+Value::operator >=( const Value &other ) const
+{
+   return !(*this < other);
+}
+
+bool 
+Value::operator >( const Value &other ) const
+{
+   return other < *this;
+}
+
+bool 
+Value::operator ==( const Value &other ) const
+{
+   //if ( type_ != other.type_ )
+   // GCC 2.95.3 says:
+   // attempt to take address of bit-field structure member `Json::Value::type_'
+   // Beats me, but a temp solves the problem.
+   int temp = other.type_;
+   if ( type_ != temp )
+      return false;
+   switch ( type_ )
+   {
+   case nullValue:
+      return true;
+   case intValue:
+      return value_.int_ == other.value_.int_;
+   case uintValue:
+      return value_.uint_ == other.value_.uint_;
+   case realValue:
+      return value_.real_ == other.value_.real_;
+   case booleanValue:
+      return value_.bool_ == other.value_.bool_;
+   case stringValue:
+      return ( value_.string_ == other.value_.string_ )
+             || ( other.value_.string_  
+                  &&  value_.string_  
+                  && strcmp( value_.string_, other.value_.string_ ) == 0 );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      return value_.map_->size() == other.value_.map_->size()
+             && (*value_.map_) == (*other.value_.map_);
+#else
+   case arrayValue:
+      return value_.array_->compare( *(other.value_.array_) ) == 0;
+   case objectValue:
+      return value_.map_->compare( *(other.value_.map_) ) == 0;
+#endif
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return false;  // unreachable
+}
+
+bool 
+Value::operator !=( const Value &other ) const
+{
+   return !( *this == other );
+}
+
+const char *
+Value::asCString() const
+{
+   JSON_ASSERT( type_ == stringValue );
+   return value_.string_;
+}
+
+
+std::string 
+Value::asString() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return "";
+   case stringValue:
+      return value_.string_ ? value_.string_ : "";
+   case booleanValue:
+      return value_.bool_ ? "true" : "false";
+   case intValue:
+   case uintValue:
+   case realValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to string" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return ""; // unreachable
+}
+
+# ifdef JSON_USE_CPPTL
+CppTL::ConstString 
+Value::asConstString() const
+{
+   return CppTL::ConstString( asString().c_str() );
+}
+# endif
+
+
+Value::Int 
+Value::asInt() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0;
+   case intValue:
+      JSON_ASSERT_MESSAGE( value_.int_ >= minInt  &&  value_.int_ <= maxInt, "unsigned integer out of signed int range" );
+      return Int(value_.int_);
+   case uintValue:
+      JSON_ASSERT_MESSAGE( value_.uint_ <= UInt(maxInt), "unsigned integer out of signed int range" );
+      return Int(value_.uint_);
+   case realValue:
+      JSON_ASSERT_MESSAGE( value_.real_ >= minInt  &&  value_.real_ <= maxInt, "Real out of signed integer range" );
+      return Int( value_.real_ );
+   case booleanValue:
+      return value_.bool_ ? 1 : 0;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to int" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+
+
+Value::UInt 
+Value::asUInt() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0;
+   case intValue:
+      JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" );
+      JSON_ASSERT_MESSAGE( value_.int_ <= maxUInt, "signed integer out of UInt range" );
+      return UInt(value_.int_);
+   case uintValue:
+      JSON_ASSERT_MESSAGE( value_.uint_ <= maxUInt, "unsigned integer out of UInt range" );
+      return UInt(value_.uint_);
+   case realValue:
+      JSON_ASSERT_MESSAGE( value_.real_ >= 0  &&  value_.real_ <= maxUInt,  "Real out of unsigned integer range" );
+      return UInt( value_.real_ );
+   case booleanValue:
+      return value_.bool_ ? 1 : 0;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to uint" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+
+
+# if defined(JSON_HAS_INT64)
+
+Value::Int64
+Value::asInt64() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0;
+   case intValue:
+      return value_.int_;
+   case uintValue:
+      JSON_ASSERT_MESSAGE( value_.uint_ <= UInt64(maxInt64), "unsigned integer out of Int64 range" );
+      return value_.uint_;
+   case realValue:
+      JSON_ASSERT_MESSAGE( value_.real_ >= minInt64  &&  value_.real_ <= maxInt64, "Real out of Int64 range" );
+      return Int( value_.real_ );
+   case booleanValue:
+      return value_.bool_ ? 1 : 0;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to Int64" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+
+
+Value::UInt64
+Value::asUInt64() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0;
+   case intValue:
+      JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to UInt64" );
+      return value_.int_;
+   case uintValue:
+      return value_.uint_;
+   case realValue:
+      JSON_ASSERT_MESSAGE( value_.real_ >= 0  &&  value_.real_ <= maxUInt64,  "Real out of UInt64 range" );
+      return UInt( value_.real_ );
+   case booleanValue:
+      return value_.bool_ ? 1 : 0;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to UInt64" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+# endif // if defined(JSON_HAS_INT64)
+
+
+LargestInt 
+Value::asLargestInt() const
+{
+#if defined(JSON_NO_INT64)
+    return asInt();
+#else
+    return asInt64();
+#endif
+}
+
+
+LargestUInt 
+Value::asLargestUInt() const
+{
+#if defined(JSON_NO_INT64)
+    return asUInt();
+#else
+    return asUInt64();
+#endif
+}
+
+
+double 
+Value::asDouble() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0.0;
+   case intValue:
+      return static_cast<double>( value_.int_ );
+   case uintValue:
+#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+      return static_cast<double>( value_.uint_ );
+#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+      return static_cast<double>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
+#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+   case realValue:
+      return value_.real_;
+   case booleanValue:
+      return value_.bool_ ? 1.0 : 0.0;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to double" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+
+float
+Value::asFloat() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return 0.0f;
+   case intValue:
+      return static_cast<float>( value_.int_ );
+   case uintValue:
+#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+      return static_cast<float>( value_.uint_ );
+#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+      return static_cast<float>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
+#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+   case realValue:
+      return static_cast<float>( value_.real_ );
+   case booleanValue:
+      return value_.bool_ ? 1.0f : 0.0f;
+   case stringValue:
+   case arrayValue:
+   case objectValue:
+      JSON_FAIL_MESSAGE( "Type is not convertible to float" );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0.0f; // unreachable;
+}
+
+bool 
+Value::asBool() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return false;
+   case intValue:
+   case uintValue:
+      return value_.int_ != 0;
+   case realValue:
+      return value_.real_ != 0.0;
+   case booleanValue:
+      return value_.bool_;
+   case stringValue:
+      return value_.string_  &&  value_.string_[0] != 0;
+   case arrayValue:
+   case objectValue:
+      return value_.map_->size() != 0;
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return false; // unreachable;
+}
+
+
+bool 
+Value::isConvertibleTo( ValueType other ) const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+      return true;
+   case intValue:
+      return ( other == nullValue  &&  value_.int_ == 0 )
+             || other == intValue
+             || ( other == uintValue  && value_.int_ >= 0 )
+             || other == realValue
+             || other == stringValue
+             || other == booleanValue;
+   case uintValue:
+      return ( other == nullValue  &&  value_.uint_ == 0 )
+             || ( other == intValue  && value_.uint_ <= (unsigned)maxInt )
+             || other == uintValue
+             || other == realValue
+             || other == stringValue
+             || other == booleanValue;
+   case realValue:
+      return ( other == nullValue  &&  value_.real_ == 0.0 )
+             || ( other == intValue  &&  value_.real_ >= minInt  &&  value_.real_ <= maxInt )
+             || ( other == uintValue  &&  value_.real_ >= 0  &&  value_.real_ <= maxUInt )
+             || other == realValue
+             || other == stringValue
+             || other == booleanValue;
+   case booleanValue:
+      return ( other == nullValue  &&  value_.bool_ == false )
+             || other == intValue
+             || other == uintValue
+             || other == realValue
+             || other == stringValue
+             || other == booleanValue;
+   case stringValue:
+      return other == stringValue
+             || ( other == nullValue  &&  (!value_.string_  ||  value_.string_[0] == 0) );
+   case arrayValue:
+      return other == arrayValue
+             ||  ( other == nullValue  &&  value_.map_->size() == 0 );
+   case objectValue:
+      return other == objectValue
+             ||  ( other == nullValue  &&  value_.map_->size() == 0 );
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return false; // unreachable;
+}
+
+
+/// Number of values in array or object
+ArrayIndex 
+Value::size() const
+{
+   switch ( type_ )
+   {
+   case nullValue:
+   case intValue:
+   case uintValue:
+   case realValue:
+   case booleanValue:
+   case stringValue:
+      return 0;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:  // size of the array is highest index + 1
+      if ( !value_.map_->empty() )
+      {
+         ObjectValues::const_iterator itLast = value_.map_->end();
+         --itLast;
+         return (*itLast).first.index()+1;
+      }
+      return 0;
+   case objectValue:
+      return ArrayIndex( value_.map_->size() );
+#else
+   case arrayValue:
+      return Int( value_.array_->size() );
+   case objectValue:
+      return Int( value_.map_->size() );
+#endif
+   default:
+      JSON_ASSERT_UNREACHABLE;
+   }
+   return 0; // unreachable;
+}
+
+
+bool 
+Value::empty() const
+{
+   if ( isNull() || isArray() || isObject() )
+      return size() == 0u;
+   else
+      return false;
+}
+
+
+bool
+Value::operator!() const
+{
+   return isNull();
+}
+
+
+void 
+Value::clear()
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue  || type_ == objectValue );
+
+   switch ( type_ )
+   {
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+   case objectValue:
+      value_.map_->clear();
+      break;
+#else
+   case arrayValue:
+      value_.array_->clear();
+      break;
+   case objectValue:
+      value_.map_->clear();
+      break;
+#endif
+   default:
+      break;
+   }
+}
+
+void 
+Value::resize( ArrayIndex newSize )
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
+   if ( type_ == nullValue )
+      *this = Value( arrayValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   ArrayIndex oldSize = size();
+   if ( newSize == 0 )
+      clear();
+   else if ( newSize > oldSize )
+      (*this)[ newSize - 1 ];
+   else
+   {
+      for ( ArrayIndex index = newSize; index < oldSize; ++index )
+      {
+         value_.map_->erase( index );
+      }
+      assert( size() == newSize );
+   }
+#else
+   value_.array_->resize( newSize );
+#endif
+}
+
+
+Value &
+Value::operator[]( ArrayIndex index )
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
+   if ( type_ == nullValue )
+      *this = Value( arrayValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   CZString key( index );
+   ObjectValues::iterator it = value_.map_->lower_bound( key );
+   if ( it != value_.map_->end()  &&  (*it).first == key )
+      return (*it).second;
+
+   ObjectValues::value_type defaultValue( key, null );
+   it = value_.map_->insert( it, defaultValue );
+   return (*it).second;
+#else
+   return value_.array_->resolveReference( index );
+#endif
+}
+
+
+Value &
+Value::operator[]( int index )
+{
+   JSON_ASSERT( index >= 0 );
+   return (*this)[ ArrayIndex(index) ];
+}
+
+
+const Value &
+Value::operator[]( ArrayIndex index ) const
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
+   if ( type_ == nullValue )
+      return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   CZString key( index );
+   ObjectValues::const_iterator it = value_.map_->find( key );
+   if ( it == value_.map_->end() )
+      return null;
+   return (*it).second;
+#else
+   Value *value = value_.array_->find( index );
+   return value ? *value : null;
+#endif
+}
+
+
+const Value &
+Value::operator[]( int index ) const
+{
+   JSON_ASSERT( index >= 0 );
+   return (*this)[ ArrayIndex(index) ];
+}
+
+
+Value &
+Value::operator[]( const char *key )
+{
+   return resolveReference( key, false );
+}
+
+
+Value &
+Value::resolveReference( const char *key, 
+                         bool isStatic )
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
+   if ( type_ == nullValue )
+      *this = Value( objectValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   CZString actualKey( key, isStatic ? CZString::noDuplication 
+                                     : CZString::duplicateOnCopy );
+   ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
+   if ( it != value_.map_->end()  &&  (*it).first == actualKey )
+      return (*it).second;
+
+   ObjectValues::value_type defaultValue( actualKey, null );
+   it = value_.map_->insert( it, defaultValue );
+   Value &value = (*it).second;
+   return value;
+#else
+   return value_.map_->resolveReference( key, isStatic );
+#endif
+}
+
+
+Value 
+Value::get( ArrayIndex index, 
+            const Value &defaultValue ) const
+{
+   const Value *value = &((*this)[index]);
+   return value == &null ? defaultValue : *value;
+}
+
+
+bool 
+Value::isValidIndex( ArrayIndex index ) const
+{
+   return index < size();
+}
+
+
+
+const Value &
+Value::operator[]( const char *key ) const
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
+   if ( type_ == nullValue )
+      return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   CZString actualKey( key, CZString::noDuplication );
+   ObjectValues::const_iterator it = value_.map_->find( actualKey );
+   if ( it == value_.map_->end() )
+      return null;
+   return (*it).second;
+#else
+   const Value *value = value_.map_->find( key );
+   return value ? *value : null;
+#endif
+}
+
+
+Value &
+Value::operator[]( const std::string &key )
+{
+   return (*this)[ key.c_str() ];
+}
+
+
+const Value &
+Value::operator[]( const std::string &key ) const
+{
+   return (*this)[ key.c_str() ];
+}
+
+Value &
+Value::operator[]( const StaticString &key )
+{
+   return resolveReference( key, true );
+}
+
+
+# ifdef JSON_USE_CPPTL
+Value &
+Value::operator[]( const CppTL::ConstString &key )
+{
+   return (*this)[ key.c_str() ];
+}
+
+
+const Value &
+Value::operator[]( const CppTL::ConstString &key ) const
+{
+   return (*this)[ key.c_str() ];
+}
+# endif
+
+
+Value &
+Value::append( const Value &value )
+{
+   return (*this)[size()] = value;
+}
+
+
+Value 
+Value::get( const char *key, 
+            const Value &defaultValue ) const
+{
+   const Value *value = &((*this)[key]);
+   return value == &null ? defaultValue : *value;
+}
+
+
+Value 
+Value::get( const std::string &key,
+            const Value &defaultValue ) const
+{
+   return get( key.c_str(), defaultValue );
+}
+
+Value
+Value::removeMember( const char* key )
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
+   if ( type_ == nullValue )
+      return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   CZString actualKey( key, CZString::noDuplication );
+   ObjectValues::iterator it = value_.map_->find( actualKey );
+   if ( it == value_.map_->end() )
+      return null;
+   Value old(it->second);
+   value_.map_->erase(it);
+   return old;
+#else
+   Value *value = value_.map_->find( key );
+   if (value){
+      Value old(*value);
+      value_.map_.remove( key );
+      return old;
+   } else {
+      return null;
+   }
+#endif
+}
+
+Value
+Value::removeMember( const std::string &key )
+{
+   return removeMember( key.c_str() );
+}
+
+# ifdef JSON_USE_CPPTL
+Value 
+Value::get( const CppTL::ConstString &key,
+            const Value &defaultValue ) const
+{
+   return get( key.c_str(), defaultValue );
+}
+# endif
+
+bool 
+Value::isMember( const char *key ) const
+{
+   const Value *value = &((*this)[key]);
+   return value != &null;
+}
+
+
+bool 
+Value::isMember( const std::string &key ) const
+{
+   return isMember( key.c_str() );
+}
+
+
+# ifdef JSON_USE_CPPTL
+bool 
+Value::isMember( const CppTL::ConstString &key ) const
+{
+   return isMember( key.c_str() );
+}
+#endif
+
+Value::Members 
+Value::getMemberNames() const
+{
+   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
+   if ( type_ == nullValue )
+       return Value::Members();
+   Members members;
+   members.reserve( value_.map_->size() );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+   ObjectValues::const_iterator it = value_.map_->begin();
+   ObjectValues::const_iterator itEnd = value_.map_->end();
+   for ( ; it != itEnd; ++it )
+      members.push_back( std::string( (*it).first.c_str() ) );
+#else
+   ValueInternalMap::IteratorState it;
+   ValueInternalMap::IteratorState itEnd;
+   value_.map_->makeBeginIterator( it );
+   value_.map_->makeEndIterator( itEnd );
+   for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
+      members.push_back( std::string( ValueInternalMap::key( it ) ) );
+#endif
+   return members;
+}
+//
+//# ifdef JSON_USE_CPPTL
+//EnumMemberNames
+//Value::enumMemberNames() const
+//{
+//   if ( type_ == objectValue )
+//   {
+//      return CppTL::Enum::any(  CppTL::Enum::transform(
+//         CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
+//         MemberNamesTransform() ) );
+//   }
+//   return EnumMemberNames();
+//}
+//
+//
+//EnumValues 
+//Value::enumValues() const
+//{
+//   if ( type_ == objectValue  ||  type_ == arrayValue )
+//      return CppTL::Enum::anyValues( *(value_.map_), 
+//                                     CppTL::Type<const Value &>() );
+//   return EnumValues();
+//}
+//
+//# endif
+
+
+bool
+Value::isNull() const
+{
+   return type_ == nullValue;
+}
+
+
+bool 
+Value::isBool() const
+{
+   return type_ == booleanValue;
+}
+
+
+bool 
+Value::isInt() const
+{
+   return type_ == intValue;
+}
+
+
+bool 
+Value::isUInt() const
+{
+   return type_ == uintValue;
+}
+
+
+bool 
+Value::isIntegral() const
+{
+   return type_ == intValue  
+          ||  type_ == uintValue  
+          ||  type_ == booleanValue;
+}
+
+
+bool 
+Value::isDouble() const
+{
+   return type_ == realValue;
+}
+
+
+bool 
+Value::isNumeric() const
+{
+   return isIntegral() || isDouble();
+}
+
+
+bool 
+Value::isString() const
+{
+   return type_ == stringValue;
+}
+
+
+bool 
+Value::isArray() const
+{
+   return type_ == nullValue  ||  type_ == arrayValue;
+}
+
+
+bool 
+Value::isObject() const
+{
+   return type_ == nullValue  ||  type_ == objectValue;
+}
+
+
+void 
+Value::setComment( const char *comment,
+                   CommentPlacement placement )
+{
+   if ( !comments_ )
+      comments_ = new CommentInfo[numberOfCommentPlacement];
+   comments_[placement].setComment( comment );
+}
+
+
+void 
+Value::setComment( const std::string &comment,
+                   CommentPlacement placement )
+{
+   setComment( comment.c_str(), placement );
+}
+
+
+bool 
+Value::hasComment( CommentPlacement placement ) const
+{
+   return comments_ != 0  &&  comments_[placement].comment_ != 0;
+}
+
+std::string 
+Value::getComment( CommentPlacement placement ) const
+{
+   if ( hasComment(placement) )
+      return comments_[placement].comment_;
+   return "";
+}
+
+
+std::string 
+Value::toStyledString() const
+{
+   StyledWriter writer;
+   return writer.write( *this );
+}
+
+
+Value::const_iterator 
+Value::begin() const
+{
+   switch ( type_ )
+   {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+      if ( value_.array_ )
+      {
+         ValueInternalArray::IteratorState it;
+         value_.array_->makeBeginIterator( it );
+         return const_iterator( it );
+      }
+      break;
+   case objectValue:
+      if ( value_.map_ )
+      {
+         ValueInternalMap::IteratorState it;
+         value_.map_->makeBeginIterator( it );
+         return const_iterator( it );
+      }
+      break;
+#else
+   case arrayValue:
+   case objectValue:
+      if ( value_.map_ )
+         return const_iterator( value_.map_->begin() );
+      break;
+#endif
+   default:
+      break;
+   }
+   return const_iterator();
+}
+
+Value::const_iterator 
+Value::end() const
+{
+   switch ( type_ )
+   {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+      if ( value_.array_ )
+      {
+         ValueInternalArray::IteratorState it;
+         value_.array_->makeEndIterator( it );
+         return const_iterator( it );
+      }
+      break;
+   case objectValue:
+      if ( value_.map_ )
+      {
+         ValueInternalMap::IteratorState it;
+         value_.map_->makeEndIterator( it );
+         return const_iterator( it );
+      }
+      break;
+#else
+   case arrayValue:
+   case objectValue:
+      if ( value_.map_ )
+         return const_iterator( value_.map_->end() );
+      break;
+#endif
+   default:
+      break;
+   }
+   return const_iterator();
+}
+
+
+Value::iterator 
+Value::begin()
+{
+   switch ( type_ )
+   {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+      if ( value_.array_ )
+      {
+         ValueInternalArray::IteratorState it;
+         value_.array_->makeBeginIterator( it );
+         return iterator( it );
+      }
+      break;
+   case objectValue:
+      if ( value_.map_ )
+      {
+         ValueInternalMap::IteratorState it;
+         value_.map_->makeBeginIterator( it );
+         return iterator( it );
+      }
+      break;
+#else
+   case arrayValue:
+   case objectValue:
+      if ( value_.map_ )
+         return iterator( value_.map_->begin() );
+      break;
+#endif
+   default:
+      break;
+   }
+   return iterator();
+}
+
+Value::iterator 
+Value::end()
+{
+   switch ( type_ )
+   {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+   case arrayValue:
+      if ( value_.array_ )
+      {
+         ValueInternalArray::IteratorState it;
+         value_.array_->makeEndIterator( it );
+         return iterator( it );
+      }
+      break;
+   case objectValue:
+      if ( value_.map_ )
+      {
+         ValueInternalMap::IteratorState it;
+         value_.map_->makeEndIterator( it );
+         return iterator( it );
+      }
+      break;
+#else
+   case arrayValue:
+   case objectValue:
+      if ( value_.map_ )
+         return iterator( value_.map_->end() );
+      break;
+#endif
+   default:
+      break;
+   }
+   return iterator();
+}
+
+
+// class PathArgument
+// //////////////////////////////////////////////////////////////////
+
+PathArgument::PathArgument()
+   : kind_( kindNone )
+{
+}
+
+
+PathArgument::PathArgument( ArrayIndex index )
+   : index_( index )
+   , kind_( kindIndex )
+{
+}
+
+
+PathArgument::PathArgument( const char *key )
+   : key_( key )
+   , kind_( kindKey )
+{
+}
+
+
+PathArgument::PathArgument( const std::string &key )
+   : key_( key.c_str() )
+   , kind_( kindKey )
+{
+}
+
+// class Path
+// //////////////////////////////////////////////////////////////////
+
+Path::Path( const std::string &path,
+            const PathArgument &a1,
+            const PathArgument &a2,
+            const PathArgument &a3,
+            const PathArgument &a4,
+            const PathArgument &a5 )
+{
+   InArgs in;
+   in.push_back( &a1 );
+   in.push_back( &a2 );
+   in.push_back( &a3 );
+   in.push_back( &a4 );
+   in.push_back( &a5 );
+   makePath( path, in );
+}
+
+
+void 
+Path::makePath( const std::string &path,
+                const InArgs &in )
+{
+   const char *current = path.c_str();
+   const char *end = current + path.length();
+   InArgs::const_iterator itInArg = in.begin();
+   while ( current != end )
+   {
+      if ( *current == '[' )
+      {
+         ++current;
+         if ( *current == '%' )
+            addPathInArg( path, in, itInArg, PathArgument::kindIndex );
+         else
+         {
+            ArrayIndex index = 0;
+            for ( ; current != end && *current >= '0'  &&  *current <= '9'; ++current )
+               index = index * 10 + ArrayIndex(*current - '0');
+            args_.push_back( index );
+         }
+         if ( current == end  ||  *current++ != ']' )
+            invalidPath( path, int(current - path.c_str()) );
+      }
+      else if ( *current == '%' )
+      {
+         addPathInArg( path, in, itInArg, PathArgument::kindKey );
+         ++current;
+      }
+      else if ( *current == '.' )
+      {
+         ++current;
+      }
+      else
+      {
+         const char *beginName = current;
+         while ( current != end  &&  !strchr( "[.", *current ) )
+            ++current;
+         args_.push_back( std::string( beginName, current ) );
+      }
+   }
+}
+
+
+void 
+Path::addPathInArg( const std::string &path, 
+                    const InArgs &in, 
+                    InArgs::const_iterator &itInArg, 
+                    PathArgument::Kind kind )
+{
+   if ( itInArg == in.end() )
+   {
+      // Error: missing argument %d
+   }
+   else if ( (*itInArg)->kind_ != kind )
+   {
+      // Error: bad argument type
+   }
+   else
+   {
+      args_.push_back( **itInArg );
+   }
+}
+
+
+void 
+Path::invalidPath( const std::string &path, 
+                   int location )
+{
+   // Error: invalid path.
+}
+
+
+const Value &
+Path::resolve( const Value &root ) const
+{
+   const Value *node = &root;
+   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+   {
+      const PathArgument &arg = *it;
+      if ( arg.kind_ == PathArgument::kindIndex )
+      {
+         if ( !node->isArray()  ||  node->isValidIndex( arg.index_ ) )
+         {
+            // Error: unable to resolve path (array value expected at position...
+         }
+         node = &((*node)[arg.index_]);
+      }
+      else if ( arg.kind_ == PathArgument::kindKey )
+      {
+         if ( !node->isObject() )
+         {
+            // Error: unable to resolve path (object value expected at position...)
+         }
+         node = &((*node)[arg.key_]);
+         if ( node == &Value::null )
+         {
+            // Error: unable to resolve path (object has no member named '' at position...)
+         }
+      }
+   }
+   return *node;
+}
+
+
+Value 
+Path::resolve( const Value &root, 
+               const Value &defaultValue ) const
+{
+   const Value *node = &root;
+   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+   {
+      const PathArgument &arg = *it;
+      if ( arg.kind_ == PathArgument::kindIndex )
+      {
+         if ( !node->isArray()  ||  node->isValidIndex( arg.index_ ) )
+            return defaultValue;
+         node = &((*node)[arg.index_]);
+      }
+      else if ( arg.kind_ == PathArgument::kindKey )
+      {
+         if ( !node->isObject() )
+            return defaultValue;
+         node = &((*node)[arg.key_]);
+         if ( node == &Value::null )
+            return defaultValue;
+      }
+   }
+   return *node;
+}
+
+
+Value &
+Path::make( Value &root ) const
+{
+   Value *node = &root;
+   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+   {
+      const PathArgument &arg = *it;
+      if ( arg.kind_ == PathArgument::kindIndex )
+      {
+         if ( !node->isArray() )
+         {
+            // Error: node is not an array at position ...
+         }
+         node = &((*node)[arg.index_]);
+      }
+      else if ( arg.kind_ == PathArgument::kindKey )
+      {
+         if ( !node->isObject() )
+         {
+            // Error: node is not an object at position...
+         }
+         node = &((*node)[arg.key_]);
+      }
+   }
+   return *node;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_value.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_writer.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/writer.h>
+# include "json_tool.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <utility>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+
+#if _MSC_VER >= 1400 // VC++ 8.0
+#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.
+#endif
+
+namespace Json {
+
+static bool containsControlCharacter( const char* str )
+{
+   while ( *str ) 
+   {
+      if ( isControlCharacter( *(str++) ) )
+         return true;
+   }
+   return false;
+}
+
+
+std::string valueToString( LargestInt value )
+{
+   UIntToStringBuffer buffer;
+   char *current = buffer + sizeof(buffer);
+   bool isNegative = value < 0;
+   if ( isNegative )
+      value = -value;
+   uintToString( LargestUInt(value), current );
+   if ( isNegative )
+      *--current = '-';
+   assert( current >= buffer );
+   return current;
+}
+
+
+std::string valueToString( LargestUInt value )
+{
+   UIntToStringBuffer buffer;
+   char *current = buffer + sizeof(buffer);
+   uintToString( value, current );
+   assert( current >= buffer );
+   return current;
+}
+
+#if defined(JSON_HAS_INT64)
+
+std::string valueToString( Int value )
+{
+   return valueToString( LargestInt(value) );
+}
+
+
+std::string valueToString( UInt value )
+{
+   return valueToString( LargestUInt(value) );
+}
+
+#endif // # if defined(JSON_HAS_INT64)
+
+
+std::string valueToString( double value )
+{
+   char buffer[32];
+#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. 
+   sprintf_s(buffer, sizeof(buffer), "%#.16g", value); 
+#else	
+   sprintf(buffer, "%#.16g", value); 
+#endif
+   char* ch = buffer + strlen(buffer) - 1;
+   if (*ch != '0') return buffer; // nothing to truncate, so save time
+   while(ch > buffer && *ch == '0'){
+     --ch;
+   }
+   char* last_nonzero = ch;
+   while(ch >= buffer){
+     switch(*ch){
+     case '0':
+     case '1':
+     case '2':
+     case '3':
+     case '4':
+     case '5':
+     case '6':
+     case '7':
+     case '8':
+     case '9':
+       --ch;
+       continue;
+     case '.':
+       // Truncate zeroes to save bytes in output, but keep one.
+       *(last_nonzero+2) = '\0';
+       return buffer;
+     default:
+       return buffer;
+     }
+   }
+   return buffer;
+}
+
+
+std::string valueToString( bool value )
+{
+   return value ? "true" : "false";
+}
+
+std::string valueToQuotedString( const char *value )
+{
+   // Not sure how to handle unicode...
+   if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value ))
+      return std::string("\"") + value + "\"";
+   // We have to walk value and escape any special characters.
+   // Appending to std::string is not efficient, but this should be rare.
+   // (Note: forward slashes are *not* rare, but I am not escaping them.)
+   std::string::size_type maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL
+   std::string result;
+   result.reserve(maxsize); // to avoid lots of mallocs
+   result += "\"";
+   for (const char* c=value; *c != 0; ++c)
+   {
+      switch(*c)
+      {
+         case '\"':
+            result += "\\\"";
+            break;
+         case '\\':
+            result += "\\\\";
+            break;
+         case '\b':
+            result += "\\b";
+            break;
+         case '\f':
+            result += "\\f";
+            break;
+         case '\n':
+            result += "\\n";
+            break;
+         case '\r':
+            result += "\\r";
+            break;
+         case '\t':
+            result += "\\t";
+            break;
+         //case '/':
+            // Even though \/ is considered a legal escape in JSON, a bare
+            // slash is also legal, so I see no reason to escape it.
+            // (I hope I am not misunderstanding something.
+            // blep notes: actually escaping \/ may be useful in javascript to avoid </ 
+            // sequence.
+            // Should add a flag to allow this compatibility mode and prevent this 
+            // sequence from occurring.
+         default:
+            if ( isControlCharacter( *c ) )
+            {
+               std::ostringstream oss;
+               oss << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);
+               result += oss.str();
+            }
+            else
+            {
+               result += *c;
+            }
+            break;
+      }
+   }
+   result += "\"";
+   return result;
+}
+
+// Class Writer
+// //////////////////////////////////////////////////////////////////
+Writer::~Writer()
+{
+}
+
+
+// Class FastWriter
+// //////////////////////////////////////////////////////////////////
+
+FastWriter::FastWriter()
+   : yamlCompatiblityEnabled_( false )
+{
+}
+
+
+void 
+FastWriter::enableYAMLCompatibility()
+{
+   yamlCompatiblityEnabled_ = true;
+}
+
+
+std::string 
+FastWriter::write( const Value &root )
+{
+   document_ = "";
+   writeValue( root );
+   document_ += "\n";
+   return document_;
+}
+
+
+void 
+FastWriter::writeValue( const Value &value )
+{
+   switch ( value.type() )
+   {
+   case nullValue:
+      document_ += "null";
+      break;
+   case intValue:
+      document_ += valueToString( value.asLargestInt() );
+      break;
+   case uintValue:
+      document_ += valueToString( value.asLargestUInt() );
+      break;
+   case realValue:
+      document_ += valueToString( value.asDouble() );
+      break;
+   case stringValue:
+      document_ += valueToQuotedString( value.asCString() );
+      break;
+   case booleanValue:
+      document_ += valueToString( value.asBool() );
+      break;
+   case arrayValue:
+      {
+         document_ += "[";
+         int size = value.size();
+         for ( int index =0; index < size; ++index )
+         {
+            if ( index > 0 )
+               document_ += ",";
+            writeValue( value[index] );
+         }
+         document_ += "]";
+      }
+      break;
+   case objectValue:
+      {
+         Value::Members members( value.getMemberNames() );
+         document_ += "{";
+         for ( Value::Members::iterator it = members.begin(); 
+               it != members.end(); 
+               ++it )
+         {
+            const std::string &name = *it;
+            if ( it != members.begin() )
+               document_ += ",";
+            document_ += valueToQuotedString( name.c_str() );
+            document_ += yamlCompatiblityEnabled_ ? ": " 
+                                                  : ":";
+            writeValue( value[name] );
+         }
+         document_ += "}";
+      }
+      break;
+   }
+}
+
+
+// Class StyledWriter
+// //////////////////////////////////////////////////////////////////
+
+StyledWriter::StyledWriter()
+   : rightMargin_( 74 )
+   , indentSize_( 3 )
+{
+}
+
+
+std::string 
+StyledWriter::write( const Value &root )
+{
+   document_ = "";
+   addChildValues_ = false;
+   indentString_ = "";
+   writeCommentBeforeValue( root );
+   writeValue( root );
+   writeCommentAfterValueOnSameLine( root );
+   document_ += "\n";
+   return document_;
+}
+
+
+void 
+StyledWriter::writeValue( const Value &value )
+{
+   switch ( value.type() )
+   {
+   case nullValue:
+      pushValue( "null" );
+      break;
+   case intValue:
+      pushValue( valueToString( value.asLargestInt() ) );
+      break;
+   case uintValue:
+      pushValue( valueToString( value.asLargestUInt() ) );
+      break;
+   case realValue:
+      pushValue( valueToString( value.asDouble() ) );
+      break;
+   case stringValue:
+      pushValue( valueToQuotedString( value.asCString() ) );
+      break;
+   case booleanValue:
+      pushValue( valueToString( value.asBool() ) );
+      break;
+   case arrayValue:
+      writeArrayValue( value);
+      break;
+   case objectValue:
+      {
+         Value::Members members( value.getMemberNames() );
+         if ( members.empty() )
+            pushValue( "{}" );
+         else
+         {
+            writeWithIndent( "{" );
+            indent();
+            Value::Members::iterator it = members.begin();
+            for (;;)
+            {
+               const std::string &name = *it;
+               const Value &childValue = value[name];
+               writeCommentBeforeValue( childValue );
+               writeWithIndent( valueToQuotedString( name.c_str() ) );
+               document_ += " : ";
+               writeValue( childValue );
+               if ( ++it == members.end() )
+               {
+                  writeCommentAfterValueOnSameLine( childValue );
+                  break;
+               }
+               document_ += ",";
+               writeCommentAfterValueOnSameLine( childValue );
+            }
+            unindent();
+            writeWithIndent( "}" );
+         }
+      }
+      break;
+   }
+}
+
+
+void 
+StyledWriter::writeArrayValue( const Value &value )
+{
+   unsigned size = value.size();
+   if ( size == 0 )
+      pushValue( "[]" );
+   else
+   {
+      bool isArrayMultiLine = isMultineArray( value );
+      if ( isArrayMultiLine )
+      {
+         writeWithIndent( "[" );
+         indent();
+         bool hasChildValue = !childValues_.empty();
+         unsigned index =0;
+         for (;;)
+         {
+            const Value &childValue = value[index];
+            writeCommentBeforeValue( childValue );
+            if ( hasChildValue )
+               writeWithIndent( childValues_[index] );
+            else
+            {
+               writeIndent();
+               writeValue( childValue );
+            }
+            if ( ++index == size )
+            {
+               writeCommentAfterValueOnSameLine( childValue );
+               break;
+            }
+            document_ += ",";
+            writeCommentAfterValueOnSameLine( childValue );
+         }
+         unindent();
+         writeWithIndent( "]" );
+      }
+      else // output on a single line
+      {
+         assert( childValues_.size() == size );
+         document_ += "[ ";
+         for ( unsigned index =0; index < size; ++index )
+         {
+            if ( index > 0 )
+               document_ += ", ";
+            document_ += childValues_[index];
+         }
+         document_ += " ]";
+      }
+   }
+}
+
+
+bool 
+StyledWriter::isMultineArray( const Value &value )
+{
+   int size = value.size();
+   bool isMultiLine = size*3 >= rightMargin_ ;
+   childValues_.clear();
+   for ( int index =0; index < size  &&  !isMultiLine; ++index )
+   {
+      const Value &childValue = value[index];
+      isMultiLine = isMultiLine  ||
+                     ( (childValue.isArray()  ||  childValue.isObject())  &&  
+                        childValue.size() > 0 );
+   }
+   if ( !isMultiLine ) // check if line length > max line length
+   {
+      childValues_.reserve( size );
+      addChildValues_ = true;
+      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
+      for ( int index =0; index < size  &&  !isMultiLine; ++index )
+      {
+         writeValue( value[index] );
+         lineLength += int( childValues_[index].length() );
+         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );
+      }
+      addChildValues_ = false;
+      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;
+   }
+   return isMultiLine;
+}
+
+
+void 
+StyledWriter::pushValue( const std::string &value )
+{
+   if ( addChildValues_ )
+      childValues_.push_back( value );
+   else
+      document_ += value;
+}
+
+
+void 
+StyledWriter::writeIndent()
+{
+   if ( !document_.empty() )
+   {
+      char last = document_[document_.length()-1];
+      if ( last == ' ' )     // already indented
+         return;
+      if ( last != '\n' )    // Comments may add new-line
+         document_ += '\n';
+   }
+   document_ += indentString_;
+}
+
+
+void 
+StyledWriter::writeWithIndent( const std::string &value )
+{
+   writeIndent();
+   document_ += value;
+}
+
+
+void 
+StyledWriter::indent()
+{
+   indentString_ += std::string( indentSize_, ' ' );
+}
+
+
+void 
+StyledWriter::unindent()
+{
+   assert( int(indentString_.size()) >= indentSize_ );
+   indentString_.resize( indentString_.size() - indentSize_ );
+}
+
+
+void 
+StyledWriter::writeCommentBeforeValue( const Value &root )
+{
+   if ( !root.hasComment( commentBefore ) )
+      return;
+   document_ += normalizeEOL( root.getComment( commentBefore ) );
+   document_ += "\n";
+}
+
+
+void 
+StyledWriter::writeCommentAfterValueOnSameLine( const Value &root )
+{
+   if ( root.hasComment( commentAfterOnSameLine ) )
+      document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
+
+   if ( root.hasComment( commentAfter ) )
+   {
+      document_ += "\n";
+      document_ += normalizeEOL( root.getComment( commentAfter ) );
+      document_ += "\n";
+   }
+}
+
+
+bool 
+StyledWriter::hasCommentForValue( const Value &value )
+{
+   return value.hasComment( commentBefore )
+          ||  value.hasComment( commentAfterOnSameLine )
+          ||  value.hasComment( commentAfter );
+}
+
+
+std::string 
+StyledWriter::normalizeEOL( const std::string &text )
+{
+   std::string normalized;
+   normalized.reserve( text.length() );
+   const char *begin = text.c_str();
+   const char *end = begin + text.length();
+   const char *current = begin;
+   while ( current != end )
+   {
+      char c = *current++;
+      if ( c == '\r' ) // mac or dos EOL
+      {
+         if ( *current == '\n' ) // convert dos EOL
+            ++current;
+         normalized += '\n';
+      }
+      else // handle unix EOL & other char
+         normalized += c;
+   }
+   return normalized;
+}
+
+
+// Class StyledStreamWriter
+// //////////////////////////////////////////////////////////////////
+
+StyledStreamWriter::StyledStreamWriter( std::string indentation )
+   : document_(NULL)
+   , rightMargin_( 74 )
+   , indentation_( indentation )
+{
+}
+
+
+void
+StyledStreamWriter::write( std::ostream &out, const Value &root )
+{
+   document_ = &out;
+   addChildValues_ = false;
+   indentString_ = "";
+   writeCommentBeforeValue( root );
+   writeValue( root );
+   writeCommentAfterValueOnSameLine( root );
+   *document_ << "\n";
+   document_ = NULL; // Forget the stream, for safety.
+}
+
+
+void 
+StyledStreamWriter::writeValue( const Value &value )
+{
+   switch ( value.type() )
+   {
+   case nullValue:
+      pushValue( "null" );
+      break;
+   case intValue:
+      pushValue( valueToString( value.asLargestInt() ) );
+      break;
+   case uintValue:
+      pushValue( valueToString( value.asLargestUInt() ) );
+      break;
+   case realValue:
+      pushValue( valueToString( value.asDouble() ) );
+      break;
+   case stringValue:
+      pushValue( valueToQuotedString( value.asCString() ) );
+      break;
+   case booleanValue:
+      pushValue( valueToString( value.asBool() ) );
+      break;
+   case arrayValue:
+      writeArrayValue( value);
+      break;
+   case objectValue:
+      {
+         Value::Members members( value.getMemberNames() );
+         if ( members.empty() )
+            pushValue( "{}" );
+         else
+         {
+            writeWithIndent( "{" );
+            indent();
+            Value::Members::iterator it = members.begin();
+            for (;;)
+            {
+               const std::string &name = *it;
+               const Value &childValue = value[name];
+               writeCommentBeforeValue( childValue );
+               writeWithIndent( valueToQuotedString( name.c_str() ) );
+               *document_ << " : ";
+               writeValue( childValue );
+               if ( ++it == members.end() )
+               {
+                  writeCommentAfterValueOnSameLine( childValue );
+                  break;
+               }
+               *document_ << ",";
+               writeCommentAfterValueOnSameLine( childValue );
+            }
+            unindent();
+            writeWithIndent( "}" );
+         }
+      }
+      break;
+   }
+}
+
+
+void 
+StyledStreamWriter::writeArrayValue( const Value &value )
+{
+   unsigned size = value.size();
+   if ( size == 0 )
+      pushValue( "[]" );
+   else
+   {
+      bool isArrayMultiLine = isMultineArray( value );
+      if ( isArrayMultiLine )
+      {
+         writeWithIndent( "[" );
+         indent();
+         bool hasChildValue = !childValues_.empty();
+         unsigned index =0;
+         for (;;)
+         {
+            const Value &childValue = value[index];
+            writeCommentBeforeValue( childValue );
+            if ( hasChildValue )
+               writeWithIndent( childValues_[index] );
+            else
+            {
+               writeIndent();
+               writeValue( childValue );
+            }
+            if ( ++index == size )
+            {
+               writeCommentAfterValueOnSameLine( childValue );
+               break;
+            }
+            *document_ << ",";
+            writeCommentAfterValueOnSameLine( childValue );
+         }
+         unindent();
+         writeWithIndent( "]" );
+      }
+      else // output on a single line
+      {
+         assert( childValues_.size() == size );
+         *document_ << "[ ";
+         for ( unsigned index =0; index < size; ++index )
+         {
+            if ( index > 0 )
+               *document_ << ", ";
+            *document_ << childValues_[index];
+         }
+         *document_ << " ]";
+      }
+   }
+}
+
+
+bool 
+StyledStreamWriter::isMultineArray( const Value &value )
+{
+   int size = value.size();
+   bool isMultiLine = size*3 >= rightMargin_ ;
+   childValues_.clear();
+   for ( int index =0; index < size  &&  !isMultiLine; ++index )
+   {
+      const Value &childValue = value[index];
+      isMultiLine = isMultiLine  ||
+                     ( (childValue.isArray()  ||  childValue.isObject())  &&  
+                        childValue.size() > 0 );
+   }
+   if ( !isMultiLine ) // check if line length > max line length
+   {
+      childValues_.reserve( size );
+      addChildValues_ = true;
+      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
+      for ( int index =0; index < size  &&  !isMultiLine; ++index )
+      {
+         writeValue( value[index] );
+         lineLength += int( childValues_[index].length() );
+         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );
+      }
+      addChildValues_ = false;
+      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;
+   }
+   return isMultiLine;
+}
+
+
+void 
+StyledStreamWriter::pushValue( const std::string &value )
+{
+   if ( addChildValues_ )
+      childValues_.push_back( value );
+   else
+      *document_ << value;
+}
+
+
+void 
+StyledStreamWriter::writeIndent()
+{
+  /*
+    Some comments in this method would have been nice. ;-)
+
+   if ( !document_.empty() )
+   {
+      char last = document_[document_.length()-1];
+      if ( last == ' ' )     // already indented
+         return;
+      if ( last != '\n' )    // Comments may add new-line
+         *document_ << '\n';
+   }
+  */
+   *document_ << '\n' << indentString_;
+}
+
+
+void 
+StyledStreamWriter::writeWithIndent( const std::string &value )
+{
+   writeIndent();
+   *document_ << value;
+}
+
+
+void 
+StyledStreamWriter::indent()
+{
+   indentString_ += indentation_;
+}
+
+
+void 
+StyledStreamWriter::unindent()
+{
+   assert( indentString_.size() >= indentation_.size() );
+   indentString_.resize( indentString_.size() - indentation_.size() );
+}
+
+
+void 
+StyledStreamWriter::writeCommentBeforeValue( const Value &root )
+{
+   if ( !root.hasComment( commentBefore ) )
+      return;
+   *document_ << normalizeEOL( root.getComment( commentBefore ) );
+   *document_ << "\n";
+}
+
+
+void 
+StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )
+{
+   if ( root.hasComment( commentAfterOnSameLine ) )
+      *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
+
+   if ( root.hasComment( commentAfter ) )
+   {
+      *document_ << "\n";
+      *document_ << normalizeEOL( root.getComment( commentAfter ) );
+      *document_ << "\n";
+   }
+}
+
+
+bool 
+StyledStreamWriter::hasCommentForValue( const Value &value )
+{
+   return value.hasComment( commentBefore )
+          ||  value.hasComment( commentAfterOnSameLine )
+          ||  value.hasComment( commentAfter );
+}
+
+
+std::string 
+StyledStreamWriter::normalizeEOL( const std::string &text )
+{
+   std::string normalized;
+   normalized.reserve( text.length() );
+   const char *begin = text.c_str();
+   const char *end = begin + text.length();
+   const char *current = begin;
+   while ( current != end )
+   {
+      char c = *current++;
+      if ( c == '\r' ) // mac or dos EOL
+      {
+         if ( *current == '\n' ) // convert dos EOL
+            ++current;
+         normalized += '\n';
+      }
+      else // handle unix EOL & other char
+         normalized += c;
+   }
+   return normalized;
+}
+
+
+std::ostream& operator<<( std::ostream &sout, const Value &root )
+{
+   Json::StyledStreamWriter writer;
+   writer.write(sout, root);
+   return sout;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_writer.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
diff --git a/jellyfish/hash_function.hpp b/lib/mer_dna.cc
similarity index 71%
rename from jellyfish/hash_function.hpp
rename to lib/mer_dna.cc
index 408628c..c8751dd 100644
--- a/jellyfish/hash_function.hpp
+++ b/lib/mer_dna.cc
@@ -14,10 +14,10 @@
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef __JELLYFISH_HASH_FUNCTION_HPP__
-#define __JELLYFISH_HASH_FUNCTION_HPP__
 
+#include <jellyfish/mer_dna.hpp>
 
-uint64_t MurmurHash64A(const void *key, int len, uint64_t seed);
-
-#endif
+namespace jellyfish { namespace mer_dna_ns {
+const char* const error_different_k = "Length of k-mers are different";
+const char* const error_short_string = "Input string is to short";
+} } // namespace jellyfish { namespace mer_dna_ns
diff --git a/jellyfish/misc.cc b/lib/misc.cc
similarity index 65%
rename from jellyfish/misc.cc
rename to lib/misc.cc
index 4f6b0c9..31e7c8f 100644
--- a/jellyfish/misc.cc
+++ b/lib/misc.cc
@@ -20,6 +20,7 @@ n    the Free Software Foundation, either version 3 of the License, or
 #include <jellyfish/err.hpp>
 #include <jellyfish/backtrace.hpp>
 
+namespace jellyfish {
 uint64_t bogus_sum(void *data, size_t len) {
   uint64_t res = 0, tmp = 0;
   uint64_t *ptr = (uint64_t *)data;
@@ -60,3 +61,42 @@ std::streamoff get_file_size(std::istream& is) {
   is.seekg(cpos);
   return res;
 }
+
+template<long int n>
+struct ConstFloorLog2 {
+  static const int val = ConstFloorLog2<n / 2>::val + 1;
+};
+template<>
+struct ConstFloorLog2<1> {
+  static const int val = 0;
+};
+// Return length random bits
+uint64_t random_bits(int length) {
+  uint64_t res = 0;
+  for(int i = 0; i < length; i += ConstFloorLog2<RAND_MAX>::val) {
+    res ^= (uint64_t)random() << i;
+  }
+  return res & ((uint64_t)-1 >> (bsizeof(uint64_t) - length));
+}
+
+bool isblunt(char c) {
+  return isalnum(c) || c == '_' || c == '-' || c == '/' || c == '.';
+}
+std::string quote_arg(const std::string& arg) {
+  if(std::all_of(arg.begin(), arg.end(), isblunt))
+    return arg;
+
+  std::string res("'");
+  size_t pos = 0;
+  while(true) {
+    size_t qpos = arg.find_first_of("'", pos);
+    res += arg.substr(pos, qpos - pos);
+    if(qpos == std::string::npos) break;
+    res += "'\\''";
+    pos = qpos + 1;
+  }
+  res += "'";
+  return res;
+}
+
+} // namespace jellyfish
diff --git a/lib/rectangular_binary_matrix.cc b/lib/rectangular_binary_matrix.cc
new file mode 100644
index 0000000..4eedb93
--- /dev/null
+++ b/lib/rectangular_binary_matrix.cc
@@ -0,0 +1,216 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <new>
+#include <stdexcept>
+#include <vector>
+#include <sstream>
+#include <assert.h>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+
+uint64_t *jellyfish::RectangularBinaryMatrix::alloc(unsigned int r, unsigned int c) {
+  if(r > (sizeof(uint64_t) * 8) || r == 0 || c == 0) {
+    std::ostringstream err;
+    err << "Invalid matrix size " << r << "x" << c;
+    throw std::out_of_range(err.str());
+  }
+  void *mem;
+  // Make sure the number of words allocated is a multiple of
+  // 8. Necessary for loop unrolling of vector multiplication
+  size_t alloc_columns = (c / 8 + (c % 8 != 0)) * 8;
+  if(posix_memalign(&mem, sizeof(uint64_t) * 2, alloc_columns * sizeof(uint64_t)))
+    throw std::bad_alloc();
+  memset(mem, '\0', sizeof(uint64_t) * alloc_columns);
+  return (uint64_t *)mem;
+}
+
+void jellyfish::RectangularBinaryMatrix::init_low_identity() {
+  memset(_columns, '\0', sizeof(uint64_t) * _c);
+  unsigned int row = std::min(_c, _r);
+  unsigned int col = _c - row;
+  _columns[col] = (uint64_t)1 << (row - 1);
+  for(unsigned int i = col + 1; i < _c; ++i)
+    _columns[i] = _columns[i - 1] >> 1;
+}
+
+bool jellyfish::RectangularBinaryMatrix::is_low_identity() {
+  unsigned int row = std::min(_c, _r);
+  unsigned int col = _c - row;
+
+  for(unsigned int i = 0; i < col; ++i)
+    if(_columns[i])
+      return false;
+  if(_columns[col] != (uint64_t)1 << (row - 1))
+    return false;
+  for(unsigned int i = col + 1; i < _c; ++i)
+    if(_columns[i] != _columns[i - 1] >> 1)
+      return false;
+  return true;
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::pseudo_multiplication(const jellyfish::RectangularBinaryMatrix &rhs) const {
+  if(_r != rhs._r || _c != rhs._c)
+    throw std::domain_error("Matrices of different size");
+  RectangularBinaryMatrix res(_r, _c);
+
+  // v is a vector. The lower part is equal to the given column of rhs
+  // and the high part is the identity matrix.
+  //  uint64_t v[nb_words()];
+  uint64_t *v = new uint64_t[nb_words()];
+  memset(v, '\0', sizeof(uint64_t) * nb_words());
+  unsigned int j = nb_words() - 1;
+  v[j]           = msb();
+  const unsigned int row = std::min(_c, _r);
+  const unsigned int col = _c - row;
+
+  unsigned int i;
+  for(i = 0; i < col; ++i) {
+    // Set the lower part to rhs and do vector multiplication
+    v[0] ^= rhs[i];
+    res.get(i) = this->times(&v[0]);
+    //res.get(i) = this->times_loop(v);
+
+    // Zero the lower part and shift the one down the diagonal.
+    v[0]  ^= rhs[i];
+    v[j] >>= 1;
+    if(!v[j])
+      v[--j] = (uint64_t)1 << (sizeof(uint64_t) * 8 - 1);
+  }
+  // No more identity part to deal with
+  memset(v, '\0', sizeof(uint64_t) * nb_words());
+  for( ; i < _c; ++i) {
+    v[0] = rhs[i];
+    res.get(i) = this->times(v);
+    //res.get(i) = this->times_loop(v);
+  }
+
+  delete[] v;
+  return res;
+}
+
+unsigned int jellyfish::RectangularBinaryMatrix::pseudo_rank() const {
+  unsigned int            rank = _c;
+  RectangularBinaryMatrix pivot(*this);
+
+  // Make the matrix lower triangular.
+  unsigned int srow = std::min(_r, _c);
+  unsigned int scol = _c - srow;
+  uint64_t mask = (uint64_t)1 << (srow - 1);
+  for(unsigned int i = scol; i < _c; ++i, mask >>= 1) {
+    if(!(pivot.get(i) & mask)) {
+      // current column has a 0 in the diagonal. XOR it with another
+      // column to get a 1.
+      unsigned int j;
+      for(j = i + 1; j < _c; ++j)
+        if(pivot.get(j) & mask)
+          break;
+      if(j == _c) {
+        // Did not find one, the matrix is not full rank.
+        rank = i;
+        break;
+      }
+      pivot.get(i) ^= pivot.get(j);
+    }
+
+    // Zero out every ones on the ith row in the upper part of the
+    // matrix.
+    for(unsigned int j = i + 1; j < _c; ++j)
+      if(pivot.get(j) & mask)
+        pivot.get(j) ^= pivot.get(i);
+  }
+
+  return rank;
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::pseudo_inverse() const {
+  RectangularBinaryMatrix pivot(*this);
+  RectangularBinaryMatrix res(_r, _c); res.init_low_identity();
+  unsigned int            i, j;
+  uint64_t                mask;
+
+  // Do gaussian elimination on the columns and apply the same
+  // operation to res.
+
+  // Make pivot lower triangular.
+  unsigned int srow = std::min(_r, _c);
+  unsigned int scol = _c - srow;
+  mask = (uint64_t)1 << (srow - 1);
+  for(i = scol; i < _c; ++i, mask >>= 1) {
+    if(!(pivot.get(i) & mask)) {
+      // current column has a 0 in the diagonal. XOR it with another
+      // column to get a 1.
+      unsigned int j;
+      for(j = i + 1; j < _c; ++j)
+        if(pivot.get(j) & mask)
+          break;
+      if(j == _c)
+        throw std::domain_error("Matrix is singular");
+      pivot.get(i) ^= pivot.get(j);
+      res.get(i)   ^= res.get(j);
+    }
+    // Zero out every ones on the ith row in the upper part of the
+    // matrix.
+    for(j = i + 1; j < _c; ++j) {
+      if(pivot.get(j) & mask) {
+        pivot.get(j) ^= pivot.get(i);
+        res.get(j)   ^= res.get(i);
+      }
+    }
+  }
+
+  // Make pivot the lower identity
+  mask = (uint64_t)1 << (srow - 1);
+  for(i = scol; i < _c; ++i, mask >>= 1) {
+    for(j = 0; j < i; ++j) {
+      if(pivot.get(j) & mask) {
+        pivot.get(j) ^= pivot.get(i);
+        res.get(j)   ^= res.get(i);
+      }
+    }
+  }
+
+  return res;
+}
+
+void jellyfish::RectangularBinaryMatrix::print(std::ostream &os) const {
+  uint64_t mask = (uint64_t)1 << (_r - 1);
+  for( ; mask; mask >>= 1) {
+    for(unsigned int j = 0; j < _c; ++j) {
+      os << (mask & _columns[j] ? "1" : "0");
+    }
+    os << "\n";
+  }
+}
+
+template<typename T>
+void jellyfish::RectangularBinaryMatrix::print_vector(std::ostream &os, const T &v) const {
+  uint64_t mask = msb();
+  for(int i = nb_words() - 1; i >= 0; --i) {
+    for( ; mask; mask >>= 1)
+      os << (v[i] & mask ? "1" : "0");
+    mask  = (uint64_t)1 << (sizeof(uint64_t) * 8 - 1);
+  }
+  os << "\n";
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::randomize_pseudo_inverse(uint64_t (*rng)()) {
+  while(true) {
+    randomize(rng);
+    try {
+      return pseudo_inverse();
+    } catch(std::domain_error &e) { }
+  }
+}
diff --git a/lib/storage.cc b/lib/storage.cc
new file mode 100644
index 0000000..6c33f77
--- /dev/null
+++ b/lib/storage.cc
@@ -0,0 +1,51 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+#include <jellyfish/storage.hpp>
+
+namespace jellyfish {
+const size_t _quadratic_reprobes[257] = {
+      1,
+      1,     3,     6,    10,    15,    21,    28,    36,    45,    55,
+     66,    78,    91,   105,   120,   136,   153,   171,   190,   210,
+    231,   253,   276,   300,   325,   351,   378,   406,   435,   465,
+    496,   528,   561,   595,   630,   666,   703,   741,   780,   820,
+    861,   903,   946,   990,  1035,  1081,  1128,  1176,  1225,  1275,
+   1326,  1378,  1431,  1485,  1540,  1596,  1653,  1711,  1770,  1830,
+   1891,  1953,  2016,  2080,  2145,  2211,  2278,  2346,  2415,  2485,
+   2556,  2628,  2701,  2775,  2850,  2926,  3003,  3081,  3160,  3240,
+   3321,  3403,  3486,  3570,  3655,  3741,  3828,  3916,  4005,  4095,
+   4186,  4278,  4371,  4465,  4560,  4656,  4753,  4851,  4950,  5050,
+   5151,  5253,  5356,  5460,  5565,  5671,  5778,  5886,  5995,  6105,
+   6216,  6328,  6441,  6555,  6670,  6786,  6903,  7021,  7140,  7260,
+   7381,  7503,  7626,  7750,  7875,  8001,  8128,  8256,  8385,  8515,
+   8646,  8778,  8911,  9045,  9180,  9316,  9453,  9591,  9730,  9870,
+  10011, 10153, 10296, 10440, 10585, 10731, 10878, 11026, 11175, 11325,
+  11476, 11628, 11781, 11935, 12090, 12246, 12403, 12561, 12720, 12880,
+  13041, 13203, 13366, 13530, 13695, 13861, 14028, 14196, 14365, 14535,
+  14706, 14878, 15051, 15225, 15400, 15576, 15753, 15931, 16110, 16290,
+  16471, 16653, 16836, 17020, 17205, 17391, 17578, 17766, 17955, 18145,
+  18336, 18528, 18721, 18915, 19110, 19306, 19503, 19701, 19900, 20100,
+  20301, 20503, 20706, 20910, 21115, 21321, 21528, 21736, 21945, 22155,
+  22366, 22578, 22791, 23005, 23220, 23436, 23653, 23871, 24090, 24310,
+  24531, 24753, 24976, 25200, 25425, 25651, 25878, 26106, 26335, 26565,
+  26796, 27028, 27261, 27495, 27730, 27966, 28203, 28441, 28680, 28920,
+  29161, 29403, 29646, 29890, 30135, 30381, 30628, 30876, 31125, 31375,
+  31626, 31878, 32131, 32385, 32640, 32896
+};
+const size_t *quadratic_reprobes = _quadratic_reprobes;
+}
diff --git a/jellyfish/thread_exec.cc b/lib/thread_exec.cc
similarity index 77%
rename from jellyfish/thread_exec.cc
rename to lib/thread_exec.cc
index 265dc57..8c6e4de 100644
--- a/jellyfish/thread_exec.cc
+++ b/lib/thread_exec.cc
@@ -14,9 +14,9 @@
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "thread_exec.hpp"
+#include <jellyfish/thread_exec.hpp>
 
-void thread_exec::exec(int nb_threads) {
+void jellyfish::thread_exec::exec(int nb_threads) {
   struct thread_info empty = {0, 0, 0};
   infos.resize(nb_threads, empty);
 
@@ -25,19 +25,19 @@ void thread_exec::exec(int nb_threads) {
     infos[i].self = this;
     int err = pthread_create(&infos[i].thid, NULL, start_routine, &infos[i]);
     if(err)
-      eraise(Error) << "Can't create thread" << err::no;
+      throw Error(err::msg() << "Can't create thread: " << err::no);
   }
 }
 
-void thread_exec::join() {
+void jellyfish::thread_exec::join() {
   for(unsigned int i = 0; i < infos.size(); i++) {
     int err = pthread_join(infos[i].thid, NULL);
     if(err)
-      eraise(Error) << "Can't join thread '" << infos[i].thid << "'" << err::no;
+      throw Error(err::msg() << "Can't join thread '" << infos[i].thid << "': " << err::no);
   }
 }
 
-void *thread_exec::start_routine(void *_info) {
+void *jellyfish::thread_exec::start_routine(void *_info) {
   struct thread_info *info = (struct thread_info *)_info;
   info->self->start(info->id);
   return 0;
diff --git a/jellyfish/time.cc b/lib/time.cc
similarity index 100%
rename from jellyfish/time.cc
rename to lib/time.cc
diff --git a/local.mk b/local.mk
new file mode 100644
index 0000000..7002a50
--- /dev/null
+++ b/local.mk
@@ -0,0 +1,3 @@
+mer_counter: square_binary_matrix.o
+dump_stats: square_binary_matrix.o
+hash_merge: square_binary_matrix.o
diff --git a/ltmain.sh b/ltmain.sh
deleted file mode 100644
index 63ae69d..0000000
--- a/ltmain.sh
+++ /dev/null
@@ -1,9655 +0,0 @@
-
-# libtool (GNU libtool) 2.4.2
-# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions.  There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.4.2
-TIMESTAMP=""
-package_revision=1.3337
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
-
-
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
-
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
-
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=${PATH_SEPARATOR-:}
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
-
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
-}
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
-
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    $opt_debug
-
-    func_error "missing argument for $1."
-    exit_cmd=exit
-}
-
-
-# func_split_short_opt shortopt
-# Set func_split_short_opt_name and func_split_short_opt_arg shell
-# variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
-{
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
-
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
-
-
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
-{
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
-
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
-
-exit_cmd=:
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
-
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
-
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
-
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
-
-
-# func_lo2o object
-func_lo2o ()
-{
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
-
-
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
-
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
-
-
-
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
-
-
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
-{
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
-
-  # Validate options:
-
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
-
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
-
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
-
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
-    fi
-
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
-
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
-
-
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
-}
-
-
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_dirname_and_basename "$1" "" "."
-    func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_resolve_sysroot PATH
-# Replace a leading = in PATH with a sysroot.  Store the result into
-# func_resolve_sysroot_result
-func_resolve_sysroot ()
-{
-  func_resolve_sysroot_result=$1
-  case $func_resolve_sysroot_result in
-  =*)
-    func_stripname '=' '' "$func_resolve_sysroot_result"
-    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
-    ;;
-  esac
-}
-
-# func_replace_sysroot PATH
-# If PATH begins with the sysroot, replace it with = and
-# store the result into func_replace_sysroot_result.
-func_replace_sysroot ()
-{
-  case "$lt_sysroot:$1" in
-  ?*:"$lt_sysroot"*)
-    func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
-    ;;
-  *)
-    # Including no sysroot.
-    func_replace_sysroot_result=$1
-    ;;
-  esac
-}
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-	func_append_quoted CC_quoted "$arg"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_append_quoted CC_quoted "$arg"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-
-##################################################
-# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
-##################################################
-
-# func_convert_core_file_wine_to_w32 ARG
-# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
-# correctly configured wine environment available, with the winepath program
-# in $build's $PATH.
-#
-# ARG is the $build file name to be converted to w32 format.
-# Result is available in $func_convert_core_file_wine_to_w32_result, and will
-# be empty on error (or when ARG is empty)
-func_convert_core_file_wine_to_w32 ()
-{
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
-  if test -n "$1"; then
-    # Unfortunately, winepath does not exit with a non-zero error code, so we
-    # are forced to check the contents of stdout. On the other hand, if the
-    # command is not found, the shell will set an exit code of 127 and print
-    # *an error message* to stdout. So we must check for both error code of
-    # zero AND non-empty stdout, which explains the odd construction:
-    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
-      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
-    else
-      func_convert_core_file_wine_to_w32_result=
-    fi
-  fi
-}
-# end: func_convert_core_file_wine_to_w32
-
-
-# func_convert_core_path_wine_to_w32 ARG
-# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
-#
-# ARG is path to be converted from $build format to win32.
-# Result is available in $func_convert_core_path_wine_to_w32_result.
-# Unconvertible file (directory) names in ARG are skipped; if no directory names
-# are convertible, then the result may be empty.
-func_convert_core_path_wine_to_w32 ()
-{
-  $opt_debug
-  # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
-  if test -n "$1"; then
-    oldIFS=$IFS
-    IFS=:
-    for func_convert_core_path_wine_to_w32_f in $1; do
-      IFS=$oldIFS
-      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
-        if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
-        else
-          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
-        fi
-      fi
-    done
-    IFS=$oldIFS
-  fi
-}
-# end: func_convert_core_path_wine_to_w32
-
-
-# func_cygpath ARGS...
-# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
-# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
-# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
-# (2), returns the Cygwin file name or path in func_cygpath_result (input
-# file name or path is assumed to be in w32 format, as previously converted
-# from $build's *nix or MSYS format). In case (3), returns the w32 file name
-# or path in func_cygpath_result (input file name or path is assumed to be in
-# Cygwin format). Returns an empty string on error.
-#
-# ARGS are passed to cygpath, with the last one being the file name or path to
-# be converted.
-#
-# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
-# environment variable; do not put it in $PATH.
-func_cygpath ()
-{
-  $opt_debug
-  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
-    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
-    if test "$?" -ne 0; then
-      # on failure, ensure result is empty
-      func_cygpath_result=
-    fi
-  else
-    func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
-  fi
-}
-#end: func_cygpath
-
-
-# func_convert_core_msys_to_w32 ARG
-# Convert file name or path ARG from MSYS format to w32 format.  Return
-# result in func_convert_core_msys_to_w32_result.
-func_convert_core_msys_to_w32 ()
-{
-  $opt_debug
-  # awkward: cmd appends spaces to result
-  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-}
-#end: func_convert_core_msys_to_w32
-
-
-# func_convert_file_check ARG1 ARG2
-# Verify that ARG1 (a file name in $build format) was converted to $host
-# format in ARG2. Otherwise, emit an error message, but continue (resetting
-# func_to_host_file_result to ARG1).
-func_convert_file_check ()
-{
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
-    func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
-    func_error "Continuing, but uninstalled executables may not work."
-    # Fallback:
-    func_to_host_file_result="$1"
-  fi
-}
-# end func_convert_file_check
-
-
-# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
-# Verify that FROM_PATH (a path in $build format) was converted to $host
-# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
-# func_to_host_file_result to a simplistic fallback value (see below).
-func_convert_path_check ()
-{
-  $opt_debug
-  if test -z "$4" && test -n "$3"; then
-    func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
-    func_error "Continuing, but uninstalled executables may not work."
-    # Fallback.  This is a deliberately simplistic "conversion" and
-    # should not be "improved".  See libtool.info.
-    if test "x$1" != "x$2"; then
-      lt_replace_pathsep_chars="s|$1|$2|g"
-      func_to_host_path_result=`echo "$3" |
-        $SED -e "$lt_replace_pathsep_chars"`
-    else
-      func_to_host_path_result="$3"
-    fi
-  fi
-}
-# end func_convert_path_check
-
-
-# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
-# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
-# and appending REPL if ORIG matches BACKPAT.
-func_convert_path_front_back_pathsep ()
-{
-  $opt_debug
-  case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
-    ;;
-  esac
-  case $4 in
-  $2 ) func_append func_to_host_path_result "$3"
-    ;;
-  esac
-}
-# end func_convert_path_front_back_pathsep
-
-
-##################################################
-# $build to $host FILE NAME CONVERSION FUNCTIONS #
-##################################################
-# invoked via `$to_host_file_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# Result will be available in $func_to_host_file_result.
-
-
-# func_to_host_file ARG
-# Converts the file name ARG from $build format to $host format. Return result
-# in func_to_host_file_result.
-func_to_host_file ()
-{
-  $opt_debug
-  $to_host_file_cmd "$1"
-}
-# end func_to_host_file
-
-
-# func_to_tool_file ARG LAZY
-# converts the file name ARG from $build format to toolchain format. Return
-# result in func_to_tool_file_result.  If the conversion in use is listed
-# in (the comma separated) LAZY, no conversion takes place.
-func_to_tool_file ()
-{
-  $opt_debug
-  case ,$2, in
-    *,"$to_tool_file_cmd",*)
-      func_to_tool_file_result=$1
-      ;;
-    *)
-      $to_tool_file_cmd "$1"
-      func_to_tool_file_result=$func_to_host_file_result
-      ;;
-  esac
-}
-# end func_to_tool_file
-
-
-# func_convert_file_noop ARG
-# Copy ARG to func_to_host_file_result.
-func_convert_file_noop ()
-{
-  func_to_host_file_result="$1"
-}
-# end func_convert_file_noop
-
-
-# func_convert_file_msys_to_w32 ARG
-# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper.  Returns result in
-# func_to_host_file_result.
-func_convert_file_msys_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_w32
-
-
-# func_convert_file_cygwin_to_w32 ARG
-# Convert file name ARG from Cygwin to w32 format.  Returns result in
-# func_to_host_file_result.
-func_convert_file_cygwin_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
-    # LT_CYGPATH in this case.
-    func_to_host_file_result=`cygpath -m "$1"`
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_cygwin_to_w32
-
-
-# func_convert_file_nix_to_w32 ARG
-# Convert file name ARG from *nix to w32 format.  Requires a wine environment
-# and a working winepath. Returns result in func_to_host_file_result.
-func_convert_file_nix_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_w32
-
-
-# func_convert_file_msys_to_cygwin ARG
-# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_file_msys_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_msys_to_w32 "$1"
-    func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_cygwin
-
-
-# func_convert_file_nix_to_cygwin ARG
-# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
-# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
-# in func_to_host_file_result.
-func_convert_file_nix_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
-    func_convert_core_file_wine_to_w32 "$1"
-    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_cygwin
-
-
-#############################################
-# $build to $host PATH CONVERSION FUNCTIONS #
-#############################################
-# invoked via `$to_host_path_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# The result will be available in $func_to_host_path_result.
-#
-# Path separators are also converted from $build format to $host format.  If
-# ARG begins or ends with a path separator character, it is preserved (but
-# converted to $host format) on output.
-#
-# All path conversion functions are named using the following convention:
-#   file name conversion function    : func_convert_file_X_to_Y ()
-#   path conversion function         : func_convert_path_X_to_Y ()
-# where, for any given $build/$host combination the 'X_to_Y' value is the
-# same.  If conversion functions are added for new $build/$host combinations,
-# the two new functions must follow this pattern, or func_init_to_host_path_cmd
-# will break.
-
-
-# func_init_to_host_path_cmd
-# Ensures that function "pointer" variable $to_host_path_cmd is set to the
-# appropriate value, based on the value of $to_host_file_cmd.
-to_host_path_cmd=
-func_init_to_host_path_cmd ()
-{
-  $opt_debug
-  if test -z "$to_host_path_cmd"; then
-    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
-  fi
-}
-
-
-# func_to_host_path ARG
-# Converts the path ARG from $build format to $host format. Return result
-# in func_to_host_path_result.
-func_to_host_path ()
-{
-  $opt_debug
-  func_init_to_host_path_cmd
-  $to_host_path_cmd "$1"
-}
-# end func_to_host_path
-
-
-# func_convert_path_noop ARG
-# Copy ARG to func_to_host_path_result.
-func_convert_path_noop ()
-{
-  func_to_host_path_result="$1"
-}
-# end func_convert_path_noop
-
-
-# func_convert_path_msys_to_w32 ARG
-# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper.  Returns result in
-# func_to_host_path_result.
-func_convert_path_msys_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # Remove leading and trailing path separator characters from ARG.  MSYS
-    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
-    # and winepath ignores them completely.
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_msys_to_w32
-
-
-# func_convert_path_cygwin_to_w32 ARG
-# Convert path ARG from Cygwin to w32 format.  Returns result in
-# func_to_host_file_result.
-func_convert_path_cygwin_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_cygwin_to_w32
-
-
-# func_convert_path_nix_to_w32 ARG
-# Convert path ARG from *nix to w32 format.  Requires a wine environment and
-# a working winepath.  Returns result in func_to_host_file_result.
-func_convert_path_nix_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_nix_to_w32
-
-
-# func_convert_path_msys_to_cygwin ARG
-# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_path_msys_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
-    func_convert_path_check : : \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
-  fi
-}
-# end func_convert_path_msys_to_cygwin
-
-
-# func_convert_path_nix_to_cygwin ARG
-# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
-# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
-# func_to_host_file_result.
-func_convert_path_nix_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # Remove leading and trailing path separator characters from
-    # ARG. msys behavior is inconsistent here, cygpath turns them
-    # into '.;' and ';.', and winepath ignores them completely.
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
-    func_convert_path_check : : \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
-  fi
-}
-# end func_convert_path_nix_to_cygwin
-
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          func_append pie_flag " $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  func_append later " $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_append_quoted lastarg "$arg"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  func_append base_compile " $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_append_quoted base_compile "$lastarg"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      func_append removelist " $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    func_append removelist " $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
-    srcfile=$func_to_tool_file_result
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	func_append command " -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	func_append command " -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      func_append command "$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $opt_mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to build PIC objects only
-  -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for opt_mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for opt_mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $opt_dlopen; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	func_resolve_sysroot "$file"
-	file=$func_resolve_sysroot_result
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  func_append dir "/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_append_quoted args "$file"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libs=
-    libdirs=
-    admincmds=
-
-    for opt in "$nonopt" ${1+"$@"}
-    do
-      if test -d "$opt"; then
-	func_append libdirs " $opt"
-
-      elif test -f "$opt"; then
-	if func_lalib_unsafe_p "$opt"; then
-	  func_append libs " $opt"
-	else
-	  func_warning "\`$opt' is not a valid libtool archive"
-	fi
-
-      else
-	func_fatal_error "invalid argument \`$opt'"
-      fi
-    done
-
-    if test -n "$libs"; then
-      if test -n "$lt_sysroot"; then
-        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
-        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
-      else
-        sysroot_cmd=
-      fi
-
-      # Remove sysroot references
-      if $opt_dry_run; then
-        for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
-        done
-      else
-        tmpdir=`func_mktempdir`
-        for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
-	    > $tmpdir/tmp-la
-	  mv -f $tmpdir/tmp-la $lib
-	done
-        ${RM}r "$tmpdir"
-      fi
-    fi
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || func_append admincmds "
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      echo "----------------------------------------------------------------------"
-      echo "Libraries have been installed in:"
-      for libdir in $libdirs; do
-	$ECHO "   $libdir"
-      done
-      echo
-      echo "If you ever happen to want to link against installed libraries"
-      echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-      echo "flag during linking and do at least one of the following:"
-      if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-	echo "     during execution"
-      fi
-      if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-	echo "     during linking"
-      fi
-      if test -n "$hardcode_libdir_flag_spec"; then
-	libdir=LIBDIR
-	eval flag=\"$hardcode_libdir_flag_spec\"
-
-	$ECHO "   - use the \`$flag' linker flag"
-      fi
-      if test -n "$admincmds"; then
-	$ECHO "   - have your system administrator run these commands:$admincmds"
-      fi
-      if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-      fi
-      echo
-
-      echo "See any operating system documentation about shared libraries for"
-      case $host in
-	solaris2.[6789]|solaris2.1[0-9])
-	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	  echo "pages."
-	  ;;
-	*)
-	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
-	  ;;
-      esac
-      echo "----------------------------------------------------------------------"
-    fi
-    exit $EXIT_SUCCESS
-}
-
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    func_append install_prog "$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	func_append files " $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      func_append install_prog " $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      func_append install_shared_prog " $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	func_append install_shared_prog " -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	func_append staticlibs " $file"
-	;;
-
-      *.la)
-	func_resolve_sysroot "$file"
-	file=$func_resolve_sysroot_result
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) func_append current_libdirs " $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) func_append future_libdirs " $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	func_append dir "$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
-      tool_oldlib=$func_to_tool_file_result
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
-	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-          case $host in
-	    *cygwin* | *mingw* | *cegcc* )
-	      # if an import library, we need to obtain dlname
-	      if func_win32_import_lib_p "$dlprefile"; then
-	        func_tr_sh "$dlprefile"
-	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
-	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
-	          # Use subshell, to avoid clobbering current variable values
-	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
-	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
-	          else
-	            # no lafile. user explicitly requested -dlpreopen <import library>.
-	            $sharedlib_from_linklib_cmd "$dlprefile"
-	            dlprefile_dlbasename=$sharedlib_from_linklib_result
-	          fi
-	        fi
-	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
-	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
-	          else
-	            func_warning "Could not compute DLL name from $name"
-	            eval '$ECHO ": $name " >> "$nlist"'
-	          fi
-	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
-	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
-	        }
-	      else # not an import lib
-	        $opt_dry_run || {
-	          eval '$ECHO ": $name " >> "$nlist"'
-	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	        }
-	      fi
-	    ;;
-	    *)
-	      $opt_dry_run || {
-	        eval '$ECHO ": $name " >> "$nlist"'
-	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	      }
-	    ;;
-          esac
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) func_append symtab_cflags " $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-# func_cygming_dll_for_implib ARG
-#
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-# Invoked by eval'ing the libtool variable
-#    $sharedlib_from_linklib_cmd
-# Result is available in the variable
-#    $sharedlib_from_linklib_result
-func_cygming_dll_for_implib ()
-{
-  $opt_debug
-  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
-}
-
-# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
-#
-# The is the core of a fallback implementation of a
-# platform-specific function to extract the name of the
-# DLL associated with the specified import library LIBNAME.
-#
-# SECTION_NAME is either .idata$6 or .idata$7, depending
-# on the platform and compiler that created the implib.
-#
-# Echos the name of the DLL associated with the
-# specified import library.
-func_cygming_dll_for_implib_fallback_core ()
-{
-  $opt_debug
-  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
-  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
-    $SED '/^Contents of section '"$match_literal"':/{
-      # Place marker at beginning of archive member dllname section
-      s/.*/====MARK====/
-      p
-      d
-    }
-    # These lines can sometimes be longer than 43 characters, but
-    # are always uninteresting
-    /:[	 ]*file format pe[i]\{,1\}-/d
-    /^In archive [^:]*:/d
-    # Ensure marker is printed
-    /^====MARK====/p
-    # Remove all lines with less than 43 characters
-    /^.\{43\}/!d
-    # From remaining lines, remove first 43 characters
-    s/^.\{43\}//' |
-    $SED -n '
-      # Join marker and all lines until next marker into a single line
-      /^====MARK====/ b para
-      H
-      $ b para
-      b
-      :para
-      x
-      s/\n//g
-      # Remove the marker
-      s/^====MARK====//
-      # Remove trailing dots and whitespace
-      s/[\. \t]*$//
-      # Print
-      /./p' |
-    # we now have a list, one entry per line, of the stringified
-    # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
-    # a '.' (that is, objdump's representation of an unprintable
-    # character.) This should work for all archives with less than
-    # 0x302f exports -- but will fail for DLLs whose name actually
-    # begins with a literal '.' or a single character followed by
-    # a '.'.
-    #
-    # Of those that remain, print the first one.
-    $SED -e '/^\./d;/^.\./d;q'
-}
-
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
-# func_cygming_dll_for_implib_fallback ARG
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-#
-# This fallback implementation is for use when $DLLTOOL
-# does not support the --identify-strict option.
-# Invoked by eval'ing the libtool variable
-#    $sharedlib_from_linklib_cmd
-# Result is available in the variable
-#    $sharedlib_from_linklib_result
-func_cygming_dll_for_implib_fallback ()
-{
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
-    # binutils import library
-    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
-    # ms-generated import library
-    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
-  else
-    # unknown
-    sharedlib_from_linklib_result=""
-  fi
-}
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
-  lt_script_arg0=\$0
-  shift
-  for lt_opt
-  do
-    case \"\$lt_opt\" in
-    --lt-debug) lt_option_debug=1 ;;
-    --lt-dump-script)
-        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
-        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
-        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
-        cat \"\$lt_dump_D/\$lt_dump_F\"
-        exit 0
-      ;;
-    --lt-*)
-        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
-        exit 1
-      ;;
-    esac
-  done
-
-  # Print the debug banner immediately:
-  if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
-  fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
-  lt_dump_args_N=1;
-  for lt_arg
-  do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
-    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
-  done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
-  case $host in
-  # Backslashes separate directories on plain windows
-  *-*-mingw | *-*-os2* | *-cegcc*)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-    ;;
-
-  *)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-    ;;
-  esac
-  $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
-  case \" \$* \" in
-  *\\ --lt-*)
-    for lt_wr_arg
-    do
-      case \$lt_wr_arg in
-      --lt-*) ;;
-      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
-      esac
-      shift
-    done ;;
-  esac
-  func_exec_program_core \${1+\"\$@\"}
-}
-
-  # Parse options
-  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# fixup the dll searchpath if we need to.
-	#
-	# Fix the DLL searchpath if we need to.  Do this before prepending
-	# to shlibpath, because on Windows, both are PATH and uninstalled
-	# libraries must come first.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-      func_exec_program \${1+\"\$@\"}
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_path "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_path "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
-
-  /* very simple arg parsing; don't want to rely on getopt
-   * also, copy all non cwrapper options to newargz, except
-   * argz[0], which is handled differently
-   */
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-      if (strcmp (argv[i], debug_opt) == 0)
-	{
-          lt_debug = 1;
-          continue;
-	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal (__FILE__, __LINE__,
-		    "unrecognized %s option: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-EOF
-	    cat <<EOF
-  /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
-	    cat <<"EOF"
-  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (before symlink chase) at: %s\n",
-		  tmp_pathspec);
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (after symlink chase) at: %s\n",
-		  actual_cwrapper_path);
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(main) libtool target name: %s\n",
-		  target_name);
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
-     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
-     because on Windows, both *_VARNAMEs are PATH but uninstalled
-     libraries must come first. */
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-
-  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
-		  nonnull (lt_argv_zero));
-  for (i = 0; i < newargc; i++)
-    {
-      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
-		      i, nonnull (newargz[i]));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      lt_debugprintf (__FILE__, __LINE__,
-		      "(main) failed to launch target \"%s\": %s\n",
-		      lt_argv_zero, nonnull (strerror (errno)));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
-                  nonempty (wrapper));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-                              nonnull (strerror (errno)));
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-              nonnull (strerror (errno)));
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      lt_debugprintf (__FILE__, __LINE__,
-		      "checking path component for symlinks: %s\n",
-		      tmp_pathspec);
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  lt_fatal (__FILE__, __LINE__,
-		    "error accessing file \"%s\": %s",
-		    tmp_pathspec, nonnull (strerror (errno)));
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal (__FILE__, __LINE__,
-		"could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
-  va_list args;
-  if (lt_debug)
-    {
-      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
-      va_start (args, fmt);
-      (void) vfprintf (stderr, fmt, args);
-      va_end (args);
-    }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
-	       int line, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
-  va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
-  return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
-  return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_setenv) setting '%s' to '%s'\n",
-                  nonnull (name), nonnull (value));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-	      $SED -n -e '
-s/^\(.\{79\}\)\(..*\)/\1\
-\2/
-h
-s/\([\\"]\)/\\\1/g
-s/$/\\n/
-s/\([^\n]*\).*/  fputs ("\1", f);/p
-g
-D'
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      func_append dlfiles " $arg"
-	    else
-	      func_append dlprefiles " $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) func_append deplibs " $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      func_append moreargs " $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      func_append dlfiles " $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    func_append dlprefiles " $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) func_append rpath " $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) func_append xrpath " $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  func_append weak_libs " $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  func_append linker_flags " $qarg"
-	  func_append compiler_flags " $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  func_append compiler_flags " $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  func_append linker_flags " $qarg"
-	  func_append compiler_flags " $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname "-L" '' "$arg"
-	if test -z "$func_stripname_result"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	func_resolve_sysroot "$func_stripname_result"
-	dir=$func_resolve_sysroot_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "* | *" $arg "*)
-	  # Will only happen for absolute or sysroot arguments
-	  ;;
-	*)
-	  # Preserve sysroot, but never include relative directories
-	  case $dir in
-	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
-	    *) func_append deplibs " -L$dir" ;;
-	  esac
-	  func_append lib_search_path " $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) func_append dllsearchpath ":$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) func_append dllsearchpath ":$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    func_append deplibs " System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	func_append deplibs " $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot|--sysroot)
-	func_append compiler_flags " $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
-      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	func_append compiler_flags " $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) func_append new_inherited_linker_flags " $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	=*)
-	  func_stripname '=' '' "$dir"
-	  dir=$lt_sysroot$func_stripname_result
-	  ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) func_append xrpath " $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  func_append arg " $func_quote_for_eval_result"
-	  func_append compiler_flags " $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  func_append arg " $wl$func_quote_for_eval_result"
-	  func_append compiler_flags " $wl$func_quote_for_eval_result"
-	  func_append linker_flags " $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # Flags to be passed through unchanged, with rationale:
-      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
-      # -r[0-9][0-9]*        specify processor for the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
-      # +DA*, +DD*           enable 64-bit mode for the HP compiler
-      # -q*                  compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
-      # -F/path              path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
-      # @file                GCC response files
-      # -tp=*                Portland pgcc target processor selection
-      # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        func_append compiler_flags " $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	func_append objs " $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		func_append dlfiles " $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      func_append dlprefiles " $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	func_append deplibs " $arg"
-	func_append old_deplibs " $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  func_append dlfiles " $func_resolve_sysroot_result"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  func_append dlprefiles " $func_resolve_sysroot_result"
-	  prev=
-	else
-	  func_append deplibs " $func_resolve_sysroot_result"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    func_to_tool_file "$output_objdir/"
-    tool_output_objdir=$func_to_tool_file_result
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
-	case "$libs " in
-	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	esac
-      fi
-      func_append libs " $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
-	  esac
-	  func_append pre_post_deps " $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  func_resolve_sysroot "$lib"
-	  case $lib in
-	  *.la)	func_source "$func_resolve_sysroot_result" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) func_append deplibs " $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
-        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) func_append new_inherited_linker_flags " $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) func_append new_inherited_linker_flags " $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    func_append newlib_search_path " $func_resolve_sysroot_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    func_append newlib_search_path " $func_resolve_sysroot_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    dir=$func_resolve_sysroot_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) func_append xrpath " $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la)
-	  func_resolve_sysroot "$deplib"
-	  lib=$func_resolve_sysroot_result
-	  ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      func_append newdlprefiles " $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      func_append newdlfiles " $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && func_append dlfiles " $dlopen"
-	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    func_append convenience " $ladir/$objdir/$old_library"
-	    func_append old_convenience " $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
-	  linklib=$old_library
-	else
-	  for l in $old_library $library_names; do
-	    linklib="$l"
-	  done
-	fi
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    func_append dlprefiles " $lib $dependency_libs"
-	  else
-	    func_append newdlfiles " $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    func_append notinst_path " $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    func_append notinst_path " $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  case "$host" in
-	    # special handling for platforms with PE-DLLs.
-	    *cygwin* | *mingw* | *cegcc* )
-	      # Linker will automatically link against shared library if both
-	      # static and shared are present.  Therefore, ensure we extract
-	      # symbols from the import library if a shared library is present
-	      # (otherwise, the dlopen module name will be incorrect).  We do
-	      # this by putting the import library name into $newdlprefiles.
-	      # We recover the dlopen module name by 'saving' the la file
-	      # name in a special purpose variable, and (later) extracting the
-	      # dlname from the la file.
-	      if test -n "$dlname"; then
-	        func_tr_sh "$dir/$linklib"
-	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
-	        func_append newdlprefiles " $dir/$linklib"
-	      else
-	        func_append newdlprefiles " $dir/$old_library"
-	        # Keep a list of preopened convenience libraries to check
-	        # that they are being used correctly in the link pass.
-	        test -z "$libdir" && \
-	          func_append dlpreconveniencelibs " $dir/$old_library"
-	      fi
-	    ;;
-	    * )
-	      # Prefer using a static library (so that no silly _DYNAMIC symbols
-	      # are required to link).
-	      if test -n "$old_library"; then
-	        func_append newdlprefiles " $dir/$old_library"
-	        # Keep a list of preopened convenience libraries to check
-	        # that they are being used correctly in the link pass.
-	        test -z "$libdir" && \
-	          func_append dlpreconveniencelibs " $dir/$old_library"
-	      # Otherwise, use the dlname, so that lt_dlopen finds it.
-	      elif test -n "$dlname"; then
-	        func_append newdlprefiles " $dir/$dlname"
-	      else
-	        func_append newdlprefiles " $dir/$linklib"
-	      fi
-	    ;;
-	  esac
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  func_append newlib_search_path " $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         func_resolve_sysroot "$func_stripname_result"
-	         func_append newlib_search_path " $func_resolve_sysroot_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) func_append temp_rpath "$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) func_append compile_rpath " $absdir" ;;
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append finalize_rpath " $libdir" ;;
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      func_append notinst_deplibs " $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      func_append notinst_deplibs " $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) func_append compile_rpath " $absdir" ;;
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append finalize_rpath " $libdir" ;;
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      func_append add_dir " -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) func_append finalize_shlibpath "$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) func_append finalize_shlibpath "$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    func_append add_dir " -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) func_append xrpath " $temp_xrpath";;
-		   esac;;
-	      *) func_append temp_deplibs " $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  func_append newlib_search_path " $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    case $deplib in
-              -L*) func_stripname '-L' '' "$deplib"
-                   func_resolve_sysroot "$func_stripname_result";;
-              *) func_resolve_sysroot "$deplib" ;;
-            esac
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $func_resolve_sysroot_result "*)
-                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $func_resolve_sysroot_result"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_resolve_sysroot "$deplib"
-	        deplib=$func_resolve_sysroot_result
-	        func_dirname "$deplib" "" "."
-		dir=$func_dirname_result
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) func_append lib_search_path " $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) func_append tmp_libs " $deplib" ;;
-	      esac
-	      ;;
-	    *) func_append tmp_libs " $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  func_append tmp_libs " $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      func_append objs "$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  func_append libobjs " $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux) # correct to gnu/linux during the next big refactor
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$opt_mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       func_append removelist " $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	func_append oldlibs " $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  func_replace_sysroot "$libdir"
-	  func_append temp_xrpath " -R$func_replace_sysroot_result"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_rpath " $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) func_append dlfiles " $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) func_append dlprefiles " $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    func_append deplibs " System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      func_append deplibs " -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    func_append newdeplibs " $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    func_append newdeplibs " $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		func_append newdeplibs " $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      func_append newdeplibs " $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      func_append newdeplibs " $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		func_append newdeplibs " $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		if test -n "$file_magic_glob"; then
-		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
-		else
-		  libnameglob=$libname
-		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
-		    shopt -s nocaseglob
-		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
-		    $nocaseglob
-		  else
-		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
-		  fi
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			func_append newdeplibs " $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      func_append newdeplibs " $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      func_append newdeplibs " $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    func_append new_libs " -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) func_append new_libs " $deplib" ;;
-	  esac
-	  ;;
-	*) func_append new_libs " $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
-	# FIXME: should test the right _cmds variable.
-	case $archive_cmds in
-	  *\$LD\ *) wl= ;;
-        esac
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		func_replace_sysroot "$libdir"
-		libdir=$func_replace_sysroot_result
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		func_append dep_rpath " $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append perm_rpath " $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      func_append rpath "$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  func_append linknames " $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  func_append delfiles " $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
-	      # Take the normal branch if the nm_file_list_spec branch
-	      # doesn't work or if tool conversion is not needed.
-	      case $nm_file_list_spec~$to_tool_file_cmd in
-		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
-		  try_normal_branch=yes
-		  eval cmd=\"$cmd1\"
-		  func_len " $cmd"
-		  len=$func_len_result
-		  ;;
-		*)
-		  try_normal_branch=no
-		  ;;
-	      esac
-	      if test "$try_normal_branch" = yes \
-		 && { test "$len" -lt "$max_cmd_len" \
-		      || test "$max_cmd_len" -le -1; }
-	      then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      elif test -n "$nm_file_list_spec"; then
-		func_basename "$output"
-		output_la=$func_basename_result
-		save_libobjs=$libobjs
-		save_output=$output
-		output=${output_objdir}/${output_la}.nm
-		func_to_tool_file "$output"
-		libobjs=$nm_file_list_spec$func_to_tool_file_result
-		func_append delfiles " $output"
-		func_verbose "creating $NM input file list: $output"
-		for obj in $save_libobjs; do
-		  func_to_tool_file "$obj"
-		  $ECHO "$func_to_tool_file_result"
-		done > "$output"
-		eval cmd=\"$cmd1\"
-		func_show_eval "$cmd" 'exit $?'
-		output=$save_output
-		libobjs=$save_libobjs
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    func_append tmp_deplibs " $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    func_append generated " $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    func_append libobjs " $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  func_append linker_flags " $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      func_to_tool_file "$obj"
-	      $ECHO "$func_to_tool_file_result" >> $output
-	    done
-	    echo ')' >> $output
-	    func_append delfiles " $output"
-	    func_to_tool_file "$output"
-	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      func_to_tool_file "$obj"
-	      $ECHO "$func_to_tool_file_result" >> $output
-	    done
-	    func_append delfiles " $output"
-	    func_to_tool_file "$output"
-	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval concat_cmds=\"$reload_cmds\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      func_append delfiles " $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  func_append libobjs " $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    func_append new_libs " -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) func_append new_libs " $deplib" ;;
-	  esac
-	  ;;
-	*) func_append new_libs " $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      func_append compile_command " $compile_deplibs"
-      func_append finalize_command " $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_rpath " $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    func_append rpath " $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append perm_rpath " $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) func_append dllsearchpath ":$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) func_append dllsearchpath ":$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    func_append rpath " $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_perm_rpath " $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	if test -n "$postlink_cmds"; then
-	  func_to_tool_file "$output"
-	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	  func_execute_cmds "$postlink_cmds" 'exit $?'
-	fi
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    func_append rpath "$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    func_append rpath "$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-
-	if test -n "$postlink_cmds"; then
-	  func_to_tool_file "$output"
-	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	  func_execute_cmds "$postlink_cmds" 'exit $?'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      if test -n "$postlink_cmds"; then
-	func_to_tool_file "$output_objdir/$outputname"
-	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	func_execute_cmds "$postlink_cmds" 'exit $?'
-      fi
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	func_append generated " $gentop"
-
-	func_extract_archives $gentop $addlibs
-	func_append oldobjs " $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  func_append oldobjs " $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      func_append oldobjs " $gentop/$newobj"
-	      ;;
-	    *) func_append oldobjs " $obj" ;;
-	    esac
-	  done
-	fi
-	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
-	tool_oldlib=$func_to_tool_file_result
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	elif test -n "$archiver_list_spec"; then
-	  func_verbose "using command file archive linking..."
-	  for obj in $oldobjs
-	  do
-	    func_to_tool_file "$obj"
-	    $ECHO "$func_to_tool_file_result"
-	  done > $output_objdir/$libname.libcmd
-	  func_to_tool_file "$output_objdir/$libname.libcmd"
-	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      -L*)
-		func_stripname -L '' "$deplib"
-		func_replace_sysroot "$func_stripname_result"
-		func_append newdependency_libs " -L$func_replace_sysroot_result"
-		;;
-	      -R*)
-		func_stripname -R '' "$deplib"
-		func_replace_sysroot "$func_stripname_result"
-		func_append newdependency_libs " -R$func_replace_sysroot_result"
-		;;
-	      *) func_append newdependency_libs " $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      *) func_append newdlfiles " $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      func_append newdlfiles " $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      func_append newdlprefiles " $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
-      -*) func_append RM " $arg" ;;
-      *) func_append files " $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
-      else
-	odir="$dir/$objdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
-
-      # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
-	case " $rmdirs " in
-	  *" $odir "*) ;;
-	  *) func_append rmdirs " $odir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    func_append rmfiles " $odir/$n"
-	  done
-	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
-
-	  case "$opt_mode" in
-	  clean)
-	    case " $library_names " in
-	    *" $dlname "*) ;;
-	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    func_append rmfiles " $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    func_append rmfiles " $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$opt_mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    func_append rmfiles " $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      func_append rmfiles " $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      func_append rmfiles " $odir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$opt_mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/m4/.gitignore b/m4/.gitignore
new file mode 100644
index 0000000..5e7d273
--- /dev/null
+++ b/m4/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/m4/libtool.m4 b/m4/libtool.m4
deleted file mode 100644
index 56666f0..0000000
--- a/m4/libtool.m4
+++ /dev/null
@@ -1,7986 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
-dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_WITH_SYSROOT])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool at gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2011 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" \
-     || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_REPLACE_SHELLFNS
-
-   mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Go],			[_LT_LANG(GO)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-m4_ifndef([AC_PROG_GO], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-m4_defun([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC],     [Go compiler command])dnl
-AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
-  fi
-fi
-if test -z "$GOC"; then
-  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
-fi
-])#m4_defun
-])#m4_ifndef
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
-  [LT_LANG(GO)],
-  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
-      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES([TAG])
-# ---------------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
-                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
-# ----------------------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-# Store the results from the different compilers for each TAGNAME.
-# Allow to override them for all tags through lt_cv_aix_libpath.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
-  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
-  lt_aix_libpath_sed='[
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }]'
-  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi],[])
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
-  fi
-  ])
-  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
-fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_WITH_SYSROOT
-# ----------------
-AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
-AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
-[], [with_sysroot=no])
-
-dnl lt_sysroot will always be passed unquoted.  We quote it here
-dnl in case the user passed a directory name.
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   AC_MSG_RESULT([${with_sysroot}])
-   AC_MSG_ERROR([The sysroot must be an absolute path.])
-   ;;
-esac
-
- AC_MSG_RESULT([${lt_sysroot:-no}])
-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_PROG_AR
-# -----------
-m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
-
-AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
-  [lt_cv_ar_at_file=no
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
-     [echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
-      AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
-     ])
-  ])
-
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
-else
-  archiver_list_spec=$lt_cv_ar_at_file
-fi
-_LT_DECL([], [archiver_list_spec], [1],
-  [How to feed a file listing to the archiver])
-])# _LT_PROG_AR
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[_LT_PROG_AR
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[23]].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
-    fi
-    ;;
-  esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method = "file_magic"])
-_LT_DECL([], [file_magic_glob], [1],
-    [How to find potential files when deplibs_check_method = "file_magic"])
-_LT_DECL([], [want_nocaseglob], [1],
-    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-# --------------------------------
-# how to determine the name of the shared library
-# associated with a specific link library.
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-m4_require([_LT_DECL_DLLTOOL])
-AC_CACHE_CHECK([how to associate runtime and link libraries],
-lt_cv_sharedlib_from_linklib_cmd,
-[lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
-])
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
-    [Command to associate shared and link libraries])
-])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-
-
-# _LT_PATH_MANIFEST_TOOL
-# ----------------------
-# locate the manifest tool
-m4_defun([_LT_PATH_MANIFEST_TOOL],
-[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
-  [lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
-  fi
-  rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
-fi
-_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
-])# _LT_PATH_MANIFEST_TOOL
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT@&t at _DLSYM_CONST
-#else
-# define LT@&t at _DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-LT@&t at _DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
-  nm_file_list_spec='@'
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-_LT_DECL([], [nm_file_list_spec], [1],
-    [Specify filename containing input files for $NM])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	m4_if([$1], [GCJ], [],
-	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-        *Intel*\ [[CF]]*Compiler*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	  ;;
-	*Portland\ Group*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-AC_CACHE_CHECK([for $compiler option to produce PIC],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-      ;;
-    esac
-    ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	_LT_TAGVAR(always_export_symbols, $1)=yes
-	_LT_TAGVAR(file_list_spec, $1)='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	# FIXME: Should let the user specify the lib program.
-	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
-	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   AC_LINK_IFELSE(
-	     [AC_LANG_SOURCE(
-	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
-			      [C++], [[int foo (void) { return 0; }]],
-			      [Fortran 77], [[
-      subroutine foo
-      end]],
-			      [Fortran], [[
-      subroutine foo
-      end]])])],
-	      [lt_cv_irix_exported_symbol=yes],
-	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [postlink_cmds], [2],
-    [Commands necessary for finishing linking programs])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=yes
-	  _LT_TAGVAR(file_list_spec, $1)='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	  # Don't use ranlib
-	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=no
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_FUNC_STRIPNAME_CNF
-# ----------------------
-# func_stripname_cnf prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-#
-# This function is identical to the (non-XSI) version of func_stripname,
-# except this one can be used by m4 code that may be executed by configure,
-# rather than the libtool script.
-m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
-AC_REQUIRE([_LT_DECL_SED])
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
-])# _LT_FUNC_STRIPNAME_CNF
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() {
-}
-_LT_EOF
-])
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${F77-"f77"}
-  CFLAGS=$FFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${FC-"f95"}
-  CFLAGS=$FCFLAGS
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-CFLAGS=$GCJFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GOC-"gccgo"}
-CFLAGS=$GOFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-CFLAGS=
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_GO
-# ----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-# _LT_DECL_DLLTOOL
-# ----------------
-# Ensure DLLTOOL variable is set.
-m4_defun([_LT_DECL_DLLTOOL],
-[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
-AC_SUBST([DLLTOOL])
-])
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
-# _LT_PATH_CONVERSION_FUNCTIONS
-# -----------------------------
-# Determine which file name conversion functions should be used by
-# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
-# for certain cross-compile configurations and native mingw.
-m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_MSG_CHECKING([how to convert $build file names to $host format])
-AC_CACHE_VAL(lt_cv_to_host_file_cmd,
-[case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
-])
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
-_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
-         [0], [convert $build file names to $host format])dnl
-
-AC_MSG_CHECKING([how to convert $build file names to toolchain format])
-AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
-[#assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
-])
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
-_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
-         [0], [convert $build files to toolchain format])dnl
-])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
deleted file mode 100644
index 5d9acd8..0000000
--- a/m4/ltoptions.m4
+++ /dev/null
@@ -1,384 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
deleted file mode 100644
index 07a8602..0000000
--- a/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# @configure_input@
-
-# serial 3337 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/missing b/missing
deleted file mode 100755
index 86a8fc3..0000000
--- a/missing
+++ /dev/null
@@ -1,331 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2012-01-06.13; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake at gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/sub_commands/bc_main.cc b/sub_commands/bc_main.cc
new file mode 100644
index 0000000..20bdcf6
--- /dev/null
+++ b/sub_commands/bc_main.cc
@@ -0,0 +1,161 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <signal.h>
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <chrono>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/generator_manager.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <sub_commands/bc_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+using std::chrono::system_clock;
+using std::chrono::duration;
+using std::chrono::duration_cast;
+
+template<typename DtnType>
+inline double as_seconds(DtnType dtn) { return duration_cast<duration<double>>(dtn).count(); }
+
+static bc_main_cmdline args; // Command line switches and arguments
+typedef std::vector<const char*> file_vector;
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, jellyfish::mer_dna> mer_iterator;
+
+template<typename PathIterator>
+class mer_bloom_counter : public jellyfish::thread_exec {
+  int                                     nb_threads_;
+  mer_dna_bloom_counter&                  filter_;
+  jellyfish::stream_manager<PathIterator> streams_;
+  sequence_parser                         parser_;
+
+public:
+  mer_bloom_counter(int nb_threads, mer_dna_bloom_counter& filter,
+                    PathIterator file_begin, PathIterator file_end,
+                    PathIterator pipe_begin, PathIterator pipe_end,
+                    uint32_t concurent_files) :
+    filter_(filter),
+    streams_(file_begin, file_end, pipe_begin, pipe_end, concurent_files),
+    parser_(jellyfish::mer_dna::k(), streams_.nb_streams(), 3 * nb_threads, 4096, streams_)
+  { }
+
+  virtual void start(int thid) {
+    for(mer_iterator mers(parser_, args.canonical_flag) ; mers; ++mers) {
+      filter_.insert(*mers);
+    }
+  }
+};
+
+// If get a termination signal, kill the manager and then kill myself.
+static pid_t manager_pid = 0;
+static void signal_handler(int sig) {
+  if(manager_pid)
+    kill(manager_pid, SIGTERM);
+  signal(sig, SIG_DFL);
+  kill(getpid(), sig);
+  _exit(EXIT_FAILURE); // Should not be reached
+}
+
+int bc_main(int argc, char *argv[])
+{
+  auto start_time = system_clock::now();
+
+  jellyfish::file_header header;
+  header.fill_standard();
+  header.set_cmdline(argc, argv);
+
+  args.parse(argc, argv);
+  mer_dna::k(args.mer_len_arg);
+
+  std::unique_ptr<jellyfish::generator_manager> generator_manager;
+  if(args.generator_given) {
+    auto gm =
+      new jellyfish::generator_manager(args.generator_arg, args.Generators_arg,
+                                       args.shell_given ? args.shell_arg : (const char*)0);
+    generator_manager.reset(gm);
+    generator_manager->start();
+    manager_pid = generator_manager->pid();
+    struct sigaction act;
+    memset(&act, '\0', sizeof(act));
+    act.sa_handler = signal_handler;
+    assert(sigaction(SIGTERM, &act, 0) == 0);
+  }
+
+  header.canonical(args.canonical_flag);
+  std::ofstream output(args.output_arg);
+  if(!output.good())
+    err::die(err::msg() << "Can't open output file '" << args.output_arg << "'");
+
+  header.format("bloomcounter");
+  header.key_len(args.mer_len_arg * 2);
+  jellyfish::hash_pair<mer_dna> hash_fns;
+  header.matrix(hash_fns.m1, 1);
+  header.matrix(hash_fns.m2, 2);
+
+  mer_dna_bloom_counter filter(args.fpr_arg, args.size_arg, hash_fns);
+  header.size(filter.m());
+  header.nb_hashes(filter.k());
+  header.write(output);
+
+  auto after_init_time = system_clock::now();
+
+  // Iterators to the multi pipe paths. If no generator manager,
+  // generate an empty range.
+  auto pipes_begin = generator_manager.get() ? generator_manager->pipes().begin() : args.file_arg.end();
+  auto pipes_end = (bool)generator_manager ? generator_manager->pipes().end() : args.file_arg.end();
+
+  mer_bloom_counter<file_vector::const_iterator> counter(args.threads_arg, filter,
+                                                         args.file_arg.begin(), args.file_arg.end(),
+                                                         pipes_begin, pipes_end, args.Files_arg);
+  counter.exec_join(args.threads_arg);
+
+  // If we have a manager, wait for it
+  if(generator_manager) {
+    signal(SIGTERM, SIG_DFL);
+    manager_pid = 0;
+    if(!generator_manager->wait())
+      err::die("Some generator commands failed");
+    generator_manager.reset();
+  }
+
+  auto after_count_time = system_clock::now();
+
+  filter.write_bits(output);
+  output.close();
+
+  auto after_dump_time = system_clock::now();
+
+  if(args.timing_given) {
+    std::ofstream timing_file(args.timing_arg);
+    timing_file << "Init     " << as_seconds(after_init_time - start_time) << "\n"
+                << "Counting " << as_seconds(after_count_time - after_init_time) << "\n"
+                << "Writing  " << as_seconds(after_dump_time - after_count_time) << "\n";
+  }
+
+  return 0;
+}
diff --git a/sub_commands/bc_main_cmdline.yaggo b/sub_commands/bc_main_cmdline.yaggo
new file mode 100644
index 0000000..b32c798
--- /dev/null
+++ b/sub_commands/bc_main_cmdline.yaggo
@@ -0,0 +1,45 @@
+purpose "Create a bloom filter from the input k-mers"
+package "jellyfish bc"
+description "Here, a bloom filter is a data structure than can tell if
+a k-mer has been since 0 times, once, or at least twice. The data
+structure is very memory efficient but has some probability of error.
+
+After creating the bloom filter, it can be passed to the count
+subcommand to avoid counting most k-mers which occur only once."
+
+option("s", "size") {
+  description "Expected number of k-mers in input"
+  uint64; suffix; required }
+option("m", "mer-len") {
+  description "Length of mer"
+  uint32; required }
+option("f", "fpr") {
+  description "False positive rate"
+  double; default 0.001 }
+option("C", "canonical") {
+  description "Count both strand, canonical representation"
+  flag; off }
+option("t", "threads") {
+  description "Number of threads"
+  uint32; default 1 }
+option("output", "o") {
+  description "Output file"
+  c_string; default "mer_bloom_filter" }
+option("F", "Files") {
+  description "Number files open simultaneously"
+  uint32; default "1" }
+option("g", "generator") {
+  description "File of commands generating fast[aq]"
+  c_string; typestr "path" }
+option("G", "Generators") {
+  description "Number of generators run simultaneously"
+  uint32; default "1" }
+option("S", "shell") {
+  description "Shell used to run generator commands ($SHELL or /bin/sh)"
+  c_string }
+option("timing") {
+  description "Print timing information"
+  c_string; typestr "Timing file" }
+arg("file") {
+  description "Sequence file(s) in fasta or fastq format"
+  c_string; multiple; typestr "path" }
diff --git a/jellyfish/cite.cc b/sub_commands/cite_main.cc
similarity index 90%
rename from jellyfish/cite.cc
rename to sub_commands/cite_main.cc
index 087ab3a..06481a4 100644
--- a/jellyfish/cite.cc
+++ b/sub_commands/cite_main.cc
@@ -14,7 +14,7 @@
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-const char *cite = 
+const char *cite =
   "A fast, lock-free approach for efficient parallel counting of occurrences of k-mers\n"
   "Guillaume Marcais; Carl Kingsford\n"
   "Bioinformatics (2011) 27(6): 764-770 first published online January 7, 2011 doi:10.1093/bioinformatics/btr011\n";
@@ -23,7 +23,7 @@ const char *url =
   "http://www.cbcb.umd.edu/software/jellyfish\n"
   "http://bioinformatics.oxfordjournals.org/content/early/2011/01/07/bioinformatics.btr011";
 
-const char *bibtex = 
+const char *bibtex =
   "@article{Jellyfish2010,\n"
   "         author = {Mar\\c{c}ais, Guillaume and Kingsford, Carl},\n"
   "         title = {A fast, lock-free approach for efficient parallel counting of occurrences of k-mers},\n"
@@ -43,16 +43,17 @@ const char *bibtex =
 #include <jellyfish/err.hpp>
 #include <jellyfish/misc.hpp>
 #include <jellyfish/fstream_default.hpp>
+#include <sub_commands/cite_main_cmdline.hpp>
 
-#include <jellyfish/cite_cmdline.hpp>
+namespace err = jellyfish::err;
 
 int cite_main(int argc, char *argv[])
 {
-  cite_cmdline args(argc, argv);
+  cite_main_cmdline args(argc, argv);
 
   ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
   if(!out.good())
-    die << "Can't open output file '" << args.output_arg << "'" << err::no;
+    err::die(err::msg() << "Can't open output file '" << args.output_arg << "'");
 
   if(args.bibtex_flag) {
     out << bibtex << std::endl;
diff --git a/sub_commands/cite_main_cmdline.yaggo b/sub_commands/cite_main_cmdline.yaggo
new file mode 100644
index 0000000..3ede1c9
--- /dev/null
+++ b/sub_commands/cite_main_cmdline.yaggo
@@ -0,0 +1,12 @@
+purpose "How to cite Jellyfish's paper"
+package "jellyfish cite"
+description "Citation of paper"
+
+option("bibtex", "b") {
+  description "Bibtex format"
+  flag; off
+}
+option("output", "o") {
+  description "Output file"
+  c_string
+}
diff --git a/sub_commands/count_main.cc b/sub_commands/count_main.cc
new file mode 100644
index 0000000..cdfc7f4
--- /dev/null
+++ b/sub_commands/count_main.cc
@@ -0,0 +1,354 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <cstdlib>
+#include <unistd.h>
+#include <assert.h>
+#include <signal.h>
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include <map>
+#include <sstream>
+#include <memory>
+#include <chrono>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_qual_iterator.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/merge_files.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/generator_manager.hpp>
+#include <sub_commands/count_main_cmdline.hpp>
+
+static count_main_cmdline args; // Command line switches and arguments
+
+namespace err = jellyfish::err;
+
+using std::chrono::system_clock;
+using std::chrono::duration;
+using std::chrono::duration_cast;
+
+template<typename DtnType>
+inline double as_seconds(DtnType dtn) { return duration_cast<duration<double>>(dtn).count(); }
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+using jellyfish::mer_dna_bloom_filter;
+typedef std::vector<const char*> file_vector;
+
+// Types for parsing arbitrary sequence ignoring quality scores
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, mer_dna> mer_iterator;
+
+// Types for parsing reads with quality score. Interface match type
+// above.
+class sequence_qual_parser :
+  public jellyfish::whole_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> >
+{
+  typedef jellyfish::stream_manager<file_vector::const_iterator> StreamIterator;
+  typedef jellyfish::whole_sequence_parser<StreamIterator> super;
+public:
+  sequence_qual_parser(uint16_t mer_len, uint32_t max_producers, uint32_t size, size_t buf_size,
+                       StreamIterator& streams) :
+    super(size, 100, max_producers, streams)
+  { }
+};
+
+class mer_qual_iterator : public jellyfish::mer_qual_iterator<sequence_qual_parser, mer_dna> {
+  typedef jellyfish::mer_qual_iterator<sequence_qual_parser, mer_dna> super;
+public:
+  mer_qual_iterator(sequence_qual_parser& parser, bool canonical = false) :
+    super(parser, args.min_qual_char_arg[0], canonical)
+  { }
+};
+
+// k-mer filters. Organized in a linked list, interpreted as a &&
+// (logical and). I.e. all filter must return true for the result to
+// be true. By default, filter returns true.
+struct filter {
+  filter* prev_;
+  filter(filter* prev = 0) : prev_(prev) { }
+  virtual ~filter() { }
+  virtual bool operator()(const mer_dna& x) { return and_res(true, x); }
+  bool and_res(bool r, const mer_dna& x) const {
+    return r ? (prev_ ? (*prev_)(x) : true) : false;
+  }
+};
+
+struct filter_bc : public filter {
+  const mer_dna_bloom_counter& counter_;
+  filter_bc(const mer_dna_bloom_counter& counter, filter* prev = 0) :
+    filter(prev),
+    counter_(counter)
+  { }
+  bool operator()(const mer_dna& m) {
+    unsigned int c = counter_.check(m);
+    return and_res(c > 1, m);
+  }
+};
+
+struct filter_bf : public filter {
+  mer_dna_bloom_filter& bf_;
+  filter_bf(mer_dna_bloom_filter& bf, filter* prev = 0) :
+    filter(prev),
+    bf_(bf)
+  { }
+  bool operator()(const mer_dna& m) {
+    unsigned int c = bf_.insert(m);
+    return and_res(c > 0, m);
+  }
+};
+
+enum OPERATION { COUNT, PRIME, UPDATE };
+template<typename PathIterator, typename MerIteratorType, typename ParserType>
+class mer_counter_base : public jellyfish::thread_exec {
+  int                                     nb_threads_;
+  mer_hash&                               ary_;
+  jellyfish::stream_manager<PathIterator> streams_;
+  ParserType                              parser_;
+  filter*                                 filter_;
+  OPERATION                               op_;
+
+public:
+  mer_counter_base(int nb_threads, mer_hash& ary,
+                   PathIterator file_begin, PathIterator file_end,
+                   PathIterator pipe_begin, PathIterator pipe_end,
+                   uint32_t concurent_files,
+                   OPERATION op, filter* filter = new struct filter) :
+    ary_(ary),
+    streams_(file_begin, file_end, pipe_begin, pipe_end, concurent_files),
+    parser_(mer_dna::k(), streams_.nb_streams(), 3 * nb_threads, 4096, streams_),
+    filter_(filter),
+    op_(op)
+  { }
+
+  virtual void start(int thid) {
+    size_t count = 0;
+    MerIteratorType mers(parser_, args.canonical_flag);
+
+    switch(op_) {
+     case COUNT:
+      for( ; mers; ++mers) {
+        if((*filter_)(*mers))
+          ary_.add(*mers, 1);
+        ++count;
+      }
+      break;
+
+    case PRIME:
+      for( ; mers; ++mers) {
+        if((*filter_)(*mers))
+          ary_.set(*mers);
+        ++count;
+      }
+      break;
+
+    case UPDATE:
+      mer_dna tmp;
+      for( ; mers; ++mers) {
+        if((*filter_)(*mers))
+          ary_.update_add(*mers, 1, tmp);
+        ++count;
+      }
+      break;
+    }
+
+    ary_.done();
+  }
+};
+
+// Counter with and without quality value
+typedef mer_counter_base<file_vector::const_iterator, mer_iterator, sequence_parser> mer_counter;
+typedef mer_counter_base<file_vector::const_iterator, mer_qual_iterator, sequence_qual_parser> mer_qual_counter;
+
+mer_dna_bloom_counter* load_bloom_filter(const char* path) {
+  std::ifstream in(path, std::ios::in|std::ios::binary);
+  jellyfish::file_header header(in);
+  if(!in.good())
+    err::die(err::msg() << "Failed to parse bloom filter file '" << path << "'");
+  if(header.format() != "bloomcounter")
+    err::die(err::msg() << "Invalid format '" << header.format() << "'. Expected 'bloomcounter'");
+  if(header.key_len() != mer_dna::k() * 2)
+    err::die("Invalid mer length in bloom filter");
+  jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+  auto res = new mer_dna_bloom_counter(header.size(), header.nb_hashes(), in, fns);
+  if(!in.good())
+    err::die("Bloom filter file is truncated");
+  in.close();
+  return res;
+}
+
+// If get a termination signal, kill the manager and then kill myself.
+static pid_t manager_pid = 0;
+static void signal_handler(int sig) {
+  if(manager_pid)
+    kill(manager_pid, SIGTERM);
+  signal(sig, SIG_DFL);
+  kill(getpid(), sig);
+  _exit(EXIT_FAILURE); // Should not be reached
+}
+
+int count_main(int argc, char *argv[])
+{
+  auto start_time = system_clock::now();
+
+  jellyfish::file_header header;
+  header.fill_standard();
+  header.set_cmdline(argc, argv);
+
+  args.parse(argc, argv);
+
+  if(args.min_qual_char_given && args.min_qual_char_arg.size() != 1)
+    count_main_cmdline::error("[-Q, --min-qual-char] must be one character.");
+
+  mer_dna::k(args.mer_len_arg);
+
+  std::unique_ptr<jellyfish::generator_manager> generator_manager;
+  if(args.generator_given) {
+    auto gm =
+      new jellyfish::generator_manager(args.generator_arg, args.Generators_arg,
+                                       args.shell_given ? args.shell_arg : (const char*)0);
+    generator_manager.reset(gm);
+    generator_manager->start();
+    manager_pid = generator_manager->pid();
+    struct sigaction act;
+    memset(&act, '\0', sizeof(act));
+    act.sa_handler = signal_handler;
+    assert(sigaction(SIGTERM, &act, 0) == 0);
+  }
+
+  header.canonical(args.canonical_flag);
+  mer_hash ary(args.size_arg, args.mer_len_arg * 2, args.counter_len_arg, args.threads_arg, args.reprobes_arg);
+  if(args.disk_flag)
+    ary.do_size_doubling(false);
+
+  std::auto_ptr<jellyfish::dumper_t<mer_array> > dumper;
+  if(args.text_flag)
+    dumper.reset(new text_dumper(args.threads_arg, args.output_arg, &header));
+  else
+    dumper.reset(new binary_dumper(args.out_counter_len_arg, ary.key_len(), args.threads_arg, args.output_arg, &header));
+  ary.dumper(dumper.get());
+
+  auto after_init_time = system_clock::now();
+
+  OPERATION do_op = COUNT;
+  if(args.if_given) {
+    mer_counter counter(args.threads_arg, ary,
+                        args.if_arg.begin(), args.if_arg.end(),
+                        args.if_arg.end(), args.if_arg.end(), // no multi pipes
+                        args.Files_arg, PRIME);
+    counter.exec_join(args.threads_arg);
+    do_op = UPDATE;
+  }
+
+  // Iterators to the multi pipe paths. If no generator manager,
+  // generate an empty range.
+  auto pipes_begin = generator_manager.get() ? generator_manager->pipes().begin() : args.file_arg.end();
+  auto pipes_end = (bool)generator_manager ? generator_manager->pipes().end() : args.file_arg.end();
+
+  // Bloom counter read from file to filter out low frequency
+  // k-mers. Two pass algorithm.
+  std::unique_ptr<filter> mer_filter(new filter);
+  std::unique_ptr<mer_dna_bloom_counter> bc;
+  if(args.bc_given) {
+    bc.reset(load_bloom_filter(args.bc_arg));
+    mer_filter.reset(new filter_bc(*bc));
+  }
+
+  // Bloom filter to filter out low frequency k-mers. One pass
+  // algorithm.
+  std::unique_ptr<mer_dna_bloom_filter> bf;
+  if(args.bf_size_given) {
+    bf.reset(new mer_dna_bloom_filter(args.bf_fp_arg, args.bf_size_arg));
+    mer_filter.reset(new filter_bf(*bf));
+  }
+
+  if(args.min_qual_char_given) {
+    mer_qual_counter counter(args.threads_arg, ary,
+                             args.file_arg.begin(), args.file_arg.end(),
+                             pipes_begin, pipes_end,
+                             args.Files_arg,
+                             do_op, mer_filter.get());
+    counter.exec_join(args.threads_arg);
+  } else {
+    mer_counter counter(args.threads_arg, ary,
+                        args.file_arg.begin(), args.file_arg.end(),
+                        pipes_begin, pipes_end,
+                        args.Files_arg,
+                        do_op, mer_filter.get());
+    counter.exec_join(args.threads_arg);
+  }
+
+  // If we have a manager, wait for it
+  if(generator_manager) {
+    signal(SIGTERM, SIG_DFL);
+    manager_pid = 0;
+    if(!generator_manager->wait())
+      err::die("Some generator commands failed");
+    generator_manager.reset();
+  }
+
+  auto after_count_time = system_clock::now();
+
+  // If no intermediate files, dump directly into output file. If not, will do a round of merging
+  if(!args.no_write_flag) {
+    if(dumper->nb_files() == 0) {
+      dumper->one_file(true);
+      if(args.lower_count_given)
+        dumper->min(args.lower_count_arg);
+      if(args.upper_count_given)
+        dumper->max(args.upper_count_arg);
+      dumper->dump(ary.ary());
+    } else {
+      dumper->dump(ary.ary());
+      if(!args.no_merge_flag) {
+        std::vector<const char*> files = dumper->file_names_cstr();
+        uint64_t min = args.lower_count_given ? args.lower_count_arg : 0;
+        uint64_t max = args.upper_count_given ? args.upper_count_arg : std::numeric_limits<uint64_t>::max();
+        try {
+          merge_files(files, args.output_arg, header, min, max);
+        } catch(MergeError e) {
+          err::die(err::msg() << e.what());
+        }
+        if(!args.no_unlink_flag) {
+          for(int i =0; i < dumper->nb_files(); ++i)
+            unlink(files[i]);
+        }
+      } // if(!args.no_merge_flag
+    } // if(!args.no_merge_flag
+  }
+
+  auto after_dump_time = system_clock::now();
+
+  if(args.timing_given) {
+    std::ofstream timing_file(args.timing_arg);
+    timing_file << "Init     " << as_seconds(after_init_time - start_time) << "\n"
+                << "Counting " << as_seconds(after_count_time - after_init_time) << "\n"
+                << "Writing  " << as_seconds(after_dump_time - after_count_time) << "\n";
+  }
+
+  return 0;
+}
diff --git a/sub_commands/count_main_cmdline.yaggo b/sub_commands/count_main_cmdline.yaggo
new file mode 100644
index 0000000..5803194
--- /dev/null
+++ b/sub_commands/count_main_cmdline.yaggo
@@ -0,0 +1,102 @@
+purpose "Count k-mers in fasta or fastq files"
+package "jellyfish count"
+
+option("mer-len", "m") {
+  description "Length of mer"
+  uint32; required }
+option("size", "s") {
+  description "Initial hash size"
+  uint64; suffix; required }
+option("threads", "t") {
+  description "Number of threads"
+  uint32; default "1" }
+option("F", "Files") {
+  description "Number files open simultaneously"
+  uint32; default "1" }
+option("g", "generator") {
+  description "File of commands generating fast[aq]"
+  c_string; typestr "path" }
+option("G", "Generators") {
+  description "Number of generators run simultaneously"
+  uint32; default "1" }
+option("S", "shell") {
+  description "Shell used to run generator commands ($SHELL or /bin/sh)"
+  c_string }
+option("output", "o") {
+  description "Output file"
+  c_string; default "mer_counts.jf" }
+option("counter-len", "c") {
+  description "Length bits of counting field"
+  uint32; default "7"; typestr "Length in bits" }
+option("out-counter-len") {
+  description "Length in bytes of counter field in output"
+  uint32; default "4"; typestr "Length in bytes" }
+option("C", "canonical") {
+  description "Count both strand, canonical representation"
+  flag; off }
+option("bc") {
+  description "Bloom counter to filter out singleton mers"
+  c_string; typestr "peath";  }
+option("bf-size") {
+  description "Use bloom filter to count high-frequency mers"
+  uint64; suffix; conflict "bc" }
+option("bf-fp") {
+  description "False positive rate of bloom filter"
+  double; default 0.01 }
+option("if") {
+  description "Count only k-mers in this files"
+  c_string; typestr "path"; multiple }
+option("Q", "min-qual-char") {
+  description "Any base with quality below this character is changed to N"
+  string }
+option("reprobes", "p") {
+  description "Maximum number of reprobes"
+  uint32; default "126" }
+option("text") {
+  description "Dump in text format"
+  off }
+option("disk") {
+  description "Disk operation. Do not do size doubling"
+  off }
+option("no-merge") {
+  description "Do not merge files intermediary files"
+  off; hidden }
+option("no-unlink") {
+  description "Do not unlink intermediary files after automatic merging"
+  off; hidden }
+# option("raw", "r") {
+#   description "Write raw database"
+#   flag; off }
+# option("both") {
+#   description "Write sorted list and raw database"
+#   flag; off; hidden }
+# option("quality-start") {
+#   description "Starting ASCII for quality values"
+#   uint32; default "64" }
+# option("min-quality") {
+#   description "Minimum quality. A base with lesser quality becomes an N"
+#   uint32; default "0" }
+option("lower-count", "L") {
+  description "Don't output k-mer with count < lower-count"
+  uint64 }
+option("upper-count", "U") {
+  description "Don't output k-mer with count > upper-count"
+  uint64 }
+# option("invalid-char") {
+#   description "How to treat invalid characters. The char is changed to a N."
+#   enum "warn", "ignore", "error" }
+# option("matrix") {
+#   description "Hash function binary matrix"
+#   string; typestr "Matrix file" }
+option("timing") {
+  description "Print timing information"
+  c_string; typestr "Timing file" }
+# option("stats") {
+#   description "Print stats"
+#   c_string; typestr "Stats file" }
+option("no-write") {
+  description "Don't write database"
+  flag; off; hidden }
+arg("file") {
+  description "Sequence file(s) in fasta or fastq format"
+  c_string; multiple; typestr "path" }
diff --git a/sub_commands/dump_main.cc b/sub_commands/dump_main.cc
new file mode 100644
index 0000000..4acf3da
--- /dev/null
+++ b/sub_commands/dump_main.cc
@@ -0,0 +1,88 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+#include <limits>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/dump_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+static dump_main_cmdline args; // Command line switches and arguments
+
+template<typename iterator>
+void dump(iterator& it, std::ostream &out,
+          uint64_t lower_count, uint64_t upper_count) {
+  if(args.column_flag) {
+    char spacer = args.tab_flag ? '\t' : ' ';
+    while(it.next()) {
+      if(it.val() < lower_count || it.val() > upper_count)
+        continue;
+      out << it.key() << spacer << it.val() << "\n";
+    }
+  } else {
+    while(it.next()) {
+      if(it.val() < lower_count || it.val() > upper_count)
+        continue;
+      out << ">" << it.val() << "\n" << it.key() << "\n";
+    }
+  }
+}
+
+int dump_main(int argc, char *argv[])
+{
+  args.parse(argc, argv);
+  std::ios::sync_with_stdio(false); // No sync with stdio -> faster
+
+  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+  if(!out.good())
+    err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+  std::ifstream is(args.db_arg);
+  if(!is.good())
+    err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+  jellyfish::file_header header;
+  header.read(is);
+  jellyfish::mer_dna::k(header.key_len() / 2);
+
+  if(!args.lower_count_given)
+    args.lower_count_arg = 0;
+  if(!args.upper_count_given)
+    args.upper_count_arg = std::numeric_limits<uint64_t>::max();
+
+  if(!header.format().compare(binary_dumper::format)) {
+    binary_reader reader(is, &header);
+    dump(reader, out, args.lower_count_arg, args.upper_count_arg);
+  } else if(!header.format().compare(text_dumper::format)) {
+    text_reader reader(is, &header);
+    dump(reader, out, args.lower_count_arg, args.upper_count_arg);
+  } else {
+    err::die(err::msg() << "Unknown format '" << header.format() << "'");
+  }
+
+  out.close();
+
+  return 0;
+}
diff --git a/sub_commands/dump_main_cmdline.yaggo b/sub_commands/dump_main_cmdline.yaggo
new file mode 100644
index 0000000..3882698
--- /dev/null
+++ b/sub_commands/dump_main_cmdline.yaggo
@@ -0,0 +1,24 @@
+purpose "Dump k-mer counts"
+package "jellyfish dump"
+description "By default, dump in a fasta format where the header is the count and
+the sequence is the sequence of the k-mer. The column format is a 2
+column output: k-mer count."
+
+option("column", "c") {
+  description "Column format"
+  flag; off }
+option("tab", "t") {
+  description "Tab separator"
+  flag; off }
+option("lower-count", "L") {
+  description "Don't output k-mer with count < lower-count"
+  uint64; }
+option("upper-count", "U") {
+  description "Don't output k-mer with count > upper-count"
+  uint64 }
+option("output", "o") {
+  description "Output file"
+  c_string }
+arg("db") {
+  description "Jellyfish database"
+  c_string; typestr "path" }
diff --git a/sub_commands/histo_main.cc b/sub_commands/histo_main.cc
new file mode 100644
index 0000000..b971841
--- /dev/null
+++ b/sub_commands/histo_main.cc
@@ -0,0 +1,90 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/histo_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+template<typename reader_type>
+void compute_histo(reader_type& reader, const uint64_t base, const uint64_t ceil,
+                   uint64_t* histo, const uint64_t nb_buckets, const uint64_t inc) {
+  while(reader.next()) {
+    if(reader.val() < base)
+      ++histo[0];
+    else if(reader.val() > ceil)
+      ++histo[nb_buckets - 1];
+    else
+      ++histo[(reader.val() - base) / inc];
+  }
+}
+
+
+int histo_main(int argc, char *argv[])
+{
+  histo_main_cmdline args(argc, argv);
+
+  std::ifstream is(args.db_arg);
+  if(!is.good())
+    err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+  jellyfish::file_header header;
+  header.read(is);
+  jellyfish::mer_dna::k(header.key_len() / 2);
+
+  if(args.high_arg < args.low_arg)
+    histo_main_cmdline::error("High count value must be >= to low count value");
+  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+  if(!out.good())
+    err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+  const uint64_t base = args.increment_arg >= args.low_arg ? 0 : args.low_arg - args.increment_arg;
+  const uint64_t ceil = args.high_arg + args.increment_arg;
+  const uint64_t inc  = args.increment_arg;
+
+  const uint64_t nb_buckets  = (ceil + inc - base) / inc;
+  uint64_t*      histo       = new uint64_t[nb_buckets];
+  memset(histo, '\0', sizeof(uint64_t) * nb_buckets);
+
+  if(!header.format().compare(binary_dumper::format)) {
+    binary_reader reader(is, &header);
+    compute_histo(reader, base, ceil, histo, nb_buckets, inc);
+  } else if(!header.format().compare(text_dumper::format)) {
+    text_reader reader(is, &header);
+    compute_histo(reader, base, ceil, histo, nb_buckets, inc);
+  } else {
+    err::die(err::msg() << "Unknown format '" << header.format() << "'");
+  }
+
+  for(uint64_t i = 0, col = base; i < nb_buckets; ++i, col += inc)
+    if(histo[i] > 0 || args.full_flag)
+      out << col << " " << histo[i] << "\n";
+
+  delete [] histo;
+  out.close();
+
+  return 0;
+}
diff --git a/sub_commands/histo_main_cmdline.yaggo b/sub_commands/histo_main_cmdline.yaggo
new file mode 100644
index 0000000..49a2e73
--- /dev/null
+++ b/sub_commands/histo_main_cmdline.yaggo
@@ -0,0 +1,38 @@
+purpose "Create an histogram of k-mer occurrences"
+package "jellyfish histo"
+description "Create an histogram with the number of k-mers having a given
+count. In bucket 'i' are tallied the k-mers which have a count 'c'
+satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are
+labeled by the low end point (low+i*inc).
+
+The last bucket in the output behaves as a catchall: it tallies all
+k-mers with a count greater or equal to the low end point of this
+bucket."
+
+option("low", "l") {
+  description "Low count value of histogram"
+  uint64; default "1" }
+option("high", "h") {
+  description "High count value of histogram"
+  uint64; default "10000" }
+option("increment", "i") {
+  description "Increment value for buckets"
+  uint64; default "1" }
+option("threads", "t") {
+  description "Number of threads"
+  uint32; default "1" }
+option("full", "f") {
+  description "Full histo. Don't skip count 0."
+  flag; off }
+option("output", "o") {
+  description "Output file"
+  c_string }
+option("buffer-size", "s") {
+  description "Length in bytes of input buffer"
+  uint64; default "10000000"; suffix; hidden; typestr "Buffer length" }
+option("verbose", "v") {
+  description "Output information"
+  flag; off }
+arg("db") {
+  description "Jellyfish database"
+  c_string; typestr "path" }
diff --git a/sub_commands/info_main.cc b/sub_commands/info_main.cc
new file mode 100644
index 0000000..d6cd43e
--- /dev/null
+++ b/sub_commands/info_main.cc
@@ -0,0 +1,54 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/misc.hpp>
+#include <sub_commands/info_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+static info_main_cmdline args;
+
+std::string get_command(const jellyfish::generic_file_header& h) {
+  std::string cmd(h["exe_path"]);
+  std::vector<std::string> cmdline = h.cmdline();
+  for(auto it = cmdline.cbegin(); it != cmdline.cend(); ++it)
+    (cmd += " ") += jellyfish::quote_arg(*it);
+
+  return cmd;
+}
+
+std::string get_where(const jellyfish::generic_file_header& h) {
+  std::string res(jellyfish::quote_arg(h["hostname"]));
+  if(!res.empty())
+    res += ":";
+  res += jellyfish::quote_arg(h["pwd"]);
+  return res;
+}
+
+int info_main(int argc, char *argv[]) {
+  args.parse(argc, argv);
+
+  std::ifstream file(args.file_arg);
+  if(!file.good())
+    err::die(err::msg() << "Can't open '" << args.file_arg << "'");
+
+  jellyfish::file_header header;
+  header.read(file);
+
+  if(args.skip_flag)
+    std::cout << file.rdbuf();
+  else if(args.json_flag)
+    std::cout << header;
+  else if(args.cmd_flag)
+    std::cout << get_command(header) << "\n";
+  else
+    std::cout << "command: " << get_command(header) << "\n"
+              << "where: " << get_where(header) << "\n"
+              << "when: " << header["time"] << "\n"
+              << "canonical: " << (header.canonical() ? "yes" : "no") << "\n";
+
+  return 0;
+}
diff --git a/sub_commands/info_main_cmdline.yaggo b/sub_commands/info_main_cmdline.yaggo
new file mode 100644
index 0000000..34d98cf
--- /dev/null
+++ b/sub_commands/info_main_cmdline.yaggo
@@ -0,0 +1,23 @@
+purpose "Display information about a jellyfish file"
+package "jellyfish info"
+
+description <<EOS
+This command shows some information about how this jellyfish output
+file was created. Without any argument, it displays the command line
+used, when and where it was run.
+EOS
+
+option("s", "skip") {
+  description "Skip header and dump remainder of file"
+  off }
+option("j", "json") {
+  description "Dump full header in JSON format"
+  off 
+  conflict "skip" }
+option("c", "cmd") {
+  description "Display only the command line"
+  off
+  conflict "skip", "json" }
+arg("file") {
+  description "Input file in jellyfish format"
+  c_string; typestr "path" }
diff --git a/jellyfish/jellyfish.cc b/sub_commands/jellyfish.cc
similarity index 91%
rename from jellyfish/jellyfish.cc
rename to sub_commands/jellyfish.cc
index 932f514..53549fd 100644
--- a/jellyfish/jellyfish.cc
+++ b/sub_commands/jellyfish.cc
@@ -23,15 +23,18 @@
 typedef int (main_func_t)(int argc, char *argv[]);
 
 main_func_t count_main;
+main_func_t bc_main;
+main_func_t info_main;
 main_func_t stats_main;
 main_func_t merge_main;
 main_func_t histo_main;
 main_func_t query_main;
 main_func_t dump_main;
 main_func_t cite_main;
-main_func_t dump_fastq_main;
-main_func_t histo_fastq_main;
-main_func_t hash_fastq_merge_main;
+main_func_t mem_main;
+// main_func_t dump_fastq_main;
+// main_func_t histo_fastq_main;
+// main_func_t hash_fastq_merge_main;
 main_func_t sos;
 main_func_t version;
 main_func_t jf_main;
@@ -43,15 +46,18 @@ struct cmd_func {
 };
 cmd_func cmd_list[] = {
   {"count",             &count_main},
+  {"bc",                &bc_main},
+  {"info",              &info_main},
   {"stats",             &stats_main},
   {"histo",             &histo_main},
   {"dump",              &dump_main},
   {"merge",             &merge_main},
   {"query",             &query_main},
   {"cite",              &cite_main},
-  {"qhisto",            &histo_fastq_main},
-  {"qdump",             &dump_fastq_main},
-  {"qmerge",            &hash_fastq_merge_main},
+  {"mem",               &mem_main},
+  // {"qhisto",            &histo_fastq_main},
+  // {"qdump",             &dump_fastq_main},
+  // {"qmerge",            &hash_fastq_merge_main},
   {"jf",                &jf_main},
 
   /* help in all its form. Must be first non-command */
diff --git a/sub_commands/mem_main.cc b/sub_commands/mem_main.cc
new file mode 100644
index 0000000..07c7ae3
--- /dev/null
+++ b/sub_commands/mem_main.cc
@@ -0,0 +1,54 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <string>
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/large_hash_array.hpp>
+#include <sub_commands/mem_main_cmdline.hpp>
+
+static const char* suffixes = "kMGTPE";
+
+template<uint64_t U>
+std::string add_suffix(uint64_t x) {
+  const int max_i = strlen(suffixes);
+  int       i     = 0;
+  while(x >= U && i <= max_i) {
+    x /= U;
+    ++i;
+  }
+  std::ostringstream res;
+  res << x;
+  if(i > 0)
+    res << suffixes[i - 1];
+  return res.str();
+}
+
+int mem_main(int argc, char *argv[]) {
+  mem_main_cmdline args(argc, argv);
+  jellyfish::large_hash::array<jellyfish::mer_dna>::usage_info usage(args.mer_len_arg * 2, args.counter_len_arg, args.reprobes_arg);
+
+  if(args.size_given) {
+    uint64_t val = usage.mem(args.size_arg);
+    std::cout << val << " (" << add_suffix<1024>(val) << ")\n";
+  } else {
+    uint64_t val = usage.size(args.mem_arg);
+    std::cout << val << " (" << add_suffix<1000>(val) << ")\n";
+  }
+
+  return 0;
+}
diff --git a/sub_commands/mem_main_cmdline.yaggo b/sub_commands/mem_main_cmdline.yaggo
new file mode 100644
index 0000000..e4f5447
--- /dev/null
+++ b/sub_commands/mem_main_cmdline.yaggo
@@ -0,0 +1,123 @@
+purpose "Give memory usage information"
+package "jellyfish mem"
+
+description <<EOS
+The mem subcommand gives some information about the memory usage of
+Jellyfish when counting mers. If one replace 'count' by 'mem' in the
+command line, it displays the amount of memory needed. All the
+switches of the count subcommand are supported, although only the
+meaningful one for computing the memory usage are used.
+
+If the '--size' (-s) switch is omitted and the --mem switch is passed
+with an amount of memory in bytes, then the largest size that fit in
+that amount of memory is returned.
+
+The memory usage information only takes into account the hash to store
+the k-mers, not various buffers (e.g. in parsing the input files). But
+typically those will be small in comparison to the hash.
+EOS
+
+option("mer-len", "m") {
+  description "Length of mer"
+  uint32; required }
+option("size", "s") {
+  description "Initial hash size"
+  uint64; suffix }
+option("counter-len", "c") {
+  description "Length bits of counting field"
+  uint32; default "7"; typestr "Length in bits" }
+option("reprobes", "p") {
+  description "Maximum number of reprobes"
+  uint32; default "126" }
+option("mem") {
+  description "Return maximum size to fit within that memory"
+  uint64; suffix; conflict "size" }
+
+
+option("threads", "t") {
+  description "Ignored switch"
+  uint32; hidden }
+option("F", "Files") {
+  description "Ignored switch"
+  uint32; hidden }
+option("g", "generator") {
+  description "Ignored switch"
+  c_string; typestr "path"; hidden }
+option("G", "Generators") {
+  description "Ignored switch"
+  uint32; hidden }
+option("S", "shell") {
+  description "Ignored switch"
+  c_string; hidden }
+option("output", "o") {
+  description "Ignored switch"
+  c_string; hidden }
+option("out-counter-len") {
+  description "Ignored switch"
+  uint32; hidden }
+option("C", "canonical") {
+  description "Ignored switch"
+  flag; off; hidden }
+option("bc") {
+  description "Ignored switch"
+  c_string; typestr "peath";  }
+option("bf-size") {
+  description "Ignored switch"
+  uint64; suffix; conflict "bc"; hidden }
+option("bf-fp") {
+  description "Ignored switch"
+  double; default 0.01; hidden }
+option("if") {
+  description "Ignored switch"
+  c_string; typestr "path"; multiple; hidden }
+option("Q", "min-qual-char") {
+  description "Ignored switch"
+  string; hidden }
+option("text") {
+  description "Ignored switch"
+  off; hidden }
+option("disk") {
+  description "Ignored switch"
+  off; hidden }
+option("no-merge") {
+  description "Ignored switch"
+  off; hidden; hidden }
+option("no-unlink") {
+  description "Ignored switch"
+  off; hidden }
+# option("raw", "r") {
+#   description "Ignored switch" "Write raw database"
+#   flag; off }
+# option("both") {
+#   description "Ignored switch" "Write sorted list and raw database"
+#   flag; off; hidden }
+# option("quality-start") {
+#   description "Ignored switch" "Starting ASCII for quality values"
+#   uint32; default "64" }
+# option("min-quality") {
+#   description "Ignored switch" "Minimum quality. A base with lesser quality becomes an N"
+#   uint32; default "0" }
+option("lower-count", "L") {
+  description "Ignored switch"
+  uint64; hidden }
+option("upper-count", "U") {
+  description "Ignored switch"
+  uint64; hidden }
+# option("invalid-char") {
+#   description "Ignored switch" "How to treat invalid characters. The char is changed to a N."
+#   enum "warn", "ignore", "error" }
+# option("matrix") {
+#   description "Ignored switch" "Hash function binary matrix"
+#   string; typestr "Matrix file" }
+option("timing") {
+  description "Ignored switch"
+  c_string; typestr "Timing file"; hidden }
+# option("stats") {
+#   description "Ignored switch" "Print stats"
+#   c_string; typestr "Stats file" }
+option("no-write") {
+  description "Ignored switch"
+  flag; off; hidden }
+arg("file") {
+  description "Ignored switch"
+  c_string; multiple; typestr "path" }
diff --git a/jellyfish/parse_read.cc b/sub_commands/merge_main.cc
similarity index 50%
rename from jellyfish/parse_read.cc
rename to sub_commands/merge_main.cc
index cb040d7..eae3d84 100644
--- a/jellyfish/parse_read.cc
+++ b/sub_commands/merge_main.cc
@@ -14,27 +14,28 @@
     along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include <jellyfish/parse_read.hpp>
-
-void jellyfish::parse_read::fill() {
-  read_parser::reads_t *new_seq = write_next();
-  
-  while(new_seq) {
-    new_seq->file = fparser;
-    bool input_eof = !fparser->next_reads(new_seq);
-    if(new_seq->nb_reads > 0) {
-      new_seq->link();
-      write_release(new_seq);
-      new_seq = write_next();
-    }
-    if(input_eof) {
-      fparser->unlink();
-      if(++current_file == files.end()) {
-        close();
-        break;
-      }
-      fparser = read_parser::new_parser(*current_file);
-      fparser->link();
-    }
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/merge_files.hpp>
+
+#include <sub_commands/merge_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+int merge_main(int argc, char *argv[])
+{
+  jellyfish::file_header out_header;
+  out_header.fill_standard();
+  out_header.set_cmdline(argc, argv);
+
+  merge_main_cmdline args(argc, argv);
+  uint64_t min = args.lower_count_given ? args.lower_count_arg : 0;
+  uint64_t max = args.upper_count_given ? args.upper_count_arg : std::numeric_limits<uint64_t>::max();
+
+  try {
+    merge_files(args.input_arg, args.output_arg, out_header, min, max);
+  } catch(MergeError e) {
+    err::die(err::msg() << e.what());
   }
+
+  return 0;
 }
diff --git a/sub_commands/merge_main_cmdline.yaggo b/sub_commands/merge_main_cmdline.yaggo
new file mode 100644
index 0000000..0633b97
--- /dev/null
+++ b/sub_commands/merge_main_cmdline.yaggo
@@ -0,0 +1,15 @@
+purpose "Merge jellyfish databases"
+package "jellyfish merge"
+
+option("output", "o") {
+  description "Output file"
+  c_string; default "mer_counts_merged.jf" }
+option("lower-count", "L") {
+  description "Don't output k-mer with count < lower-count"
+  uint64 }
+option("upper-count", "U") {
+  description "Don't output k-mer with count > upper-count"
+  uint64 }
+arg("input") {
+  description "Jellyfish hash"
+  c_string; multiple; at_least 2 }
diff --git a/sub_commands/query_main.cc b/sub_commands/query_main.cc
new file mode 100644
index 0000000..bde99f3
--- /dev/null
+++ b/sub_commands/query_main.cc
@@ -0,0 +1,123 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/query_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef std::vector<const char*> file_vector;
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, mer_dna> mer_iterator;
+
+static query_main_cmdline args;
+
+// mer_dna_bloom_counter query_load_bloom_filter(const char* path) {
+//   return res;
+// }
+
+template<typename PathIterator, typename Database>
+void query_from_sequence(PathIterator file_begin, PathIterator file_end, const Database& db,
+                         std::ostream& out, bool canonical) {
+  jellyfish::stream_manager<PathIterator> streams(file_begin, file_end);
+  sequence_parser parser(mer_dna::k(), 1, 3, 4096, streams);
+  for(mer_iterator mers(parser, canonical); mers; ++mers)
+    out << *mers << " " << db.check(*mers) << "\n";
+}
+
+template<typename Database>
+void query_from_cmdline(std::vector<const char*> mers, const Database& db, std::ostream& out,
+                        bool canonical) {
+  mer_dna m;
+  for(auto it = mers.cbegin(); it != mers.cend(); ++it) {
+    try {
+      m = *it;
+      if(canonical)
+        m.canonicalize();
+      out << m << " " << db.check(m) << "\n";
+    } catch(std::length_error e) {
+      std::cerr << "Invalid mer '" << *it << "'\n";
+    }
+  }
+}
+
+template<typename Database>
+void query_from_stdin(const Database& db, std::ostream& out, bool canonical) {
+  std::string buffer;
+  mer_dna     m;
+
+  while(getline(std::cin, buffer)) {
+    try {
+      m = buffer;
+      if(canonical)
+        m.canonicalize();
+      out << db.check(m) << std::endl;  // a flush is need for interactive use
+    } catch(std::length_error e) {
+      std::cerr << "Invalid mer '" << buffer << "'" << std::endl;
+    }
+  }
+}
+
+int query_main(int argc, char *argv[])
+{
+  args.parse(argc, argv);
+
+  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+  if(!out.good())
+    err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+  std::ifstream in(args.file_arg, std::ios::in|std::ios::binary);
+  jellyfish::file_header header(in);
+  if(!in.good())
+    err::die(err::msg() << "Failed to parse header of file '" << args.file_arg << "'");
+  mer_dna::k(header.key_len() / 2);
+  if(header.format() == "bloomcounter") {
+    jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+    mer_dna_bloom_counter filter(header.size(), header.nb_hashes(), in, fns);
+    if(!in.good())
+      err::die("Bloom filter file is truncated");
+    in.close();
+    query_from_sequence(args.sequence_arg.begin(), args.sequence_arg.end(), filter, out, header.canonical());
+    query_from_cmdline(args.mers_arg, filter, out, header.canonical());
+    if(args.interactive_flag)  query_from_stdin(filter, out, header.canonical());
+  } else if(header.format() == binary_dumper::format) {
+    jellyfish::mapped_file binary_map(args.file_arg);
+    if(!args.no_load_flag &&
+       (args.load_flag || (args.sequence_arg.begin() != args.sequence_arg.end()) || (args.mers_arg.size() > 100)))
+      binary_map.load();
+    binary_query bq(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+                               header.size() - 1, binary_map.length() - header.offset());
+    query_from_sequence(args.sequence_arg.begin(), args.sequence_arg.end(), bq, out, header.canonical());
+    query_from_cmdline(args.mers_arg, bq, out, header.canonical());
+    if(args.interactive_flag)  query_from_stdin(bq, out, header.canonical());
+  } else {
+    err::die(err::msg() << "Unsupported format '" << header.format() << "'. Must be a bloom counter or binary list.");
+  }
+
+  return 0;
+}
diff --git a/sub_commands/query_main_cmdline.yaggo b/sub_commands/query_main_cmdline.yaggo
new file mode 100644
index 0000000..d210a8d
--- /dev/null
+++ b/sub_commands/query_main_cmdline.yaggo
@@ -0,0 +1,24 @@
+purpose "Query a Jellyfish database"
+package "jellyfish query"
+
+option("s", "sequence") {
+  description "Output counts for all mers in sequence"
+  c_string; typestr "path"; multiple }
+option("o", "output") {
+  description "Output file (stdout)"
+  c_string; typestr "path" }
+option("i", "interactive") {
+  description "Interactive, queries from stdin"
+  flag; off }
+option("l", "load") {
+  description "Force pre-loading of database file into memory"
+  off }
+option("L", "no-load") {
+  description "Disable pre-loading of database file into memory"
+  off }
+arg("file") {
+  description "Jellyfish database"
+  c_string; typestr "path" }
+arg("mers") {
+  description "mers to query"
+  c_string; multiple }
diff --git a/sub_commands/stats_main.cc b/sub_commands/stats_main.cc
new file mode 100644
index 0000000..7512473
--- /dev/null
+++ b/sub_commands/stats_main.cc
@@ -0,0 +1,83 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/stats_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+template<typename reader_type>
+void compute_stats(reader_type& reader, uint64_t low, uint64_t high,
+                   uint64_t& uniq, uint64_t& distinct, uint64_t& total,
+                   uint64_t& max) {
+  uniq = distinct = total = max = 0;
+
+  while(reader.next()) {
+    if(reader.val() < low || reader.val() > high) continue;
+    uniq  += reader.val() == 1;
+    total += reader.val();
+    max    = std::max(max, reader.val());
+    ++distinct;
+  }
+}
+
+
+int stats_main(int argc, char *argv[])
+{
+  stats_main_cmdline args(argc, argv);
+
+  std::ifstream is(args.db_arg);
+  if(!is.good())
+    err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+  jellyfish::file_header header;
+  header.read(is);
+  jellyfish::mer_dna::k(header.key_len() / 2);
+
+  ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+  if(!out.good())
+    err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+  if(!args.upper_count_given)
+    args.upper_count_arg = std::numeric_limits<uint64_t>::max();
+  uint64_t uniq = 0, distinct = 0, total = 0, max = 0;
+  if(!header.format().compare(binary_dumper::format)) {
+    binary_reader reader(is, &header);
+    compute_stats(reader, args.lower_count_arg, args.upper_count_arg, uniq, distinct, total, max);
+  } else if(!header.format().compare(text_dumper::format)) {
+    text_reader reader(is, &header);
+    compute_stats(reader, args.lower_count_arg, args.upper_count_arg, uniq, distinct, total, max);
+  } else {
+    err::die(err::msg() << "Unknown format '" << header.format() << "'");
+  }
+
+  out << "Unique:    " << uniq << "\n"
+      << "Distinct:  " << distinct << "\n"
+      << "Total:     " << total << "\n"
+      << "Max_count: " << max << "\n";
+  out.close();
+
+  return 0;
+}
diff --git a/sub_commands/stats_main_cmdline.yaggo b/sub_commands/stats_main_cmdline.yaggo
new file mode 100644
index 0000000..4b93124
--- /dev/null
+++ b/sub_commands/stats_main_cmdline.yaggo
@@ -0,0 +1,28 @@
+purpose "Statistics"
+package "jellyfish stats"
+description "Display some statistics about the k-mers in the hash:
+
+Unique:    Number of k-mers which occur only once.
+Distinct:  Number of k-mers, not counting multiplicity.
+Total:     Number of k-mers, including multiplicity.
+Max_count: Maximum number of occurrence of a k-mer.
+"
+
+option("recompute", "r") {
+  description "Recompute"
+  flag; off; hidden }
+option("lower-count", "L") {
+  description "Don't consider k-mer with count < lower-count"
+  uint64; default 0 }
+option("upper-count", "U") {
+  description "Don't consider k-mer with count > upper-count (2^64)"
+  uint64 }
+option("verbose", "v") {
+  description "Verbose"
+  flag; off }
+option("output", "o") {
+  description "Output file"
+  c_string }
+arg("db") {
+  description "Jellyfish database"
+  c_string; typestr "path" }
diff --git a/swig/Readme.md b/swig/Readme.md
new file mode 100644
index 0000000..ee297af
--- /dev/null
+++ b/swig/Readme.md
@@ -0,0 +1,154 @@
+What is it?
+===========
+
+Bindings of the Jellyfish library to various scripting languages
+(Python, Ruby and Perl currently). This allows to query the Jellyfish
+output files and use the Jellyfish hash within these scripting
+languages, which is much more convenient than in C++, although
+somewhat slower.
+
+Installation
+============
+
+Requirements
+------------
+
+In the following, it is assumed that Jellyfish has been properly
+installed and is visible to the 'pkg-config' tool. The following
+command:
+
+```Shell
+pkg-config --exists jellyfish-2.0 && echo yes
+```
+
+Must print 'yes'. If not, see the README in the Jellyfish on how to
+install and, if necessary, setup the 'PKG\_CONFIG\_PATH' variable.
+
+The [swig](http://www.swig.org/) software package must be
+installed. All the testing is done with version 3.x. Version 2.x MAY
+work, but is not tested.
+
+Python
+------
+
+The following was tested with Python version 3.3.3. To install:
+
+```Shell
+python setup.py build
+sudo python setup.py install
+```
+
+Ruby
+----
+
+The following was tested with Ruby version 1.9.3. To install:
+
+```Shell
+ruby extconf.rb
+make
+sudo make install
+```
+
+Perl
+----
+
+The following was tested with Perl version 5.18.1. The Perl headers
+may not compile properly with recent version of g++. It compiles
+properly with g++ version 4.4. Hence, you may need to pass something
+like 'CC=g++-4.4' to the 'make' command for it to compile.
+
+```Shell
+perl Makefile.PL
+make
+sudo make install
+```
+
+Examples
+========
+
+Some simplified examples on how to use the Jellyfish binding.
+
+jellyfish dump
+--------------
+
+The following is roughly equivalent to the dump subcommand. It dumps
+in text format the content of a Jellyfish database.
+
+----
+##### Python
+```Python
+import jellyfish
+
+mf = jellyfish.ReadMerFile(sys.argv[1])
+for mer, count in mf:
+    print(mer, " ", count)
+```
+
+----
+##### Ruby
+```Ruby
+require 'jellyfish'
+
+mf = Jellyfish::ReadMerFile.new ARGV[0]
+mf.each { |mer, count|
+    puts("#{mer} #{count}")
+}
+```
+
+----
+##### Perl
+```Perl
+use jellyfish;
+
+my $mf = jellyfish::ReadMerFile->new($ARGV[0]);
+while($mf->next_mer) {
+    print($mf->mer, " ", $mf->count, "\n");
+}
+```
+----
+
+jellyfish query
+---------------
+
+The following is roughly equivalent to the command query
+subcommand. For every mer passed on the command line, it prints its
+count in the Jellyfish database, where the mer is in canonical form.
+
+----
+##### Python
+```Python
+import jellyfish
+
+qf = jellyfish.QueryMerFile(sys.argv.[1])
+for m in sys.argv[2:]:
+    mer = jellyfish.MerDNA(m)
+    mer.canonicalize()
+    print(mer, " ", qf[mer])
+```
+
+----
+##### Ruby
+```Ruby
+require 'jellyfish'
+
+qf = Jellyfish::QueryMerFile(ARGV.shift)
+ARGV.each { |m|
+    mer = Jellyfish::MerDNA.new(m)
+    mer.canonicalize!
+    puts("#{mer} #{qf[mer]}")
+}
+```
+
+----
+##### Perl
+```Perl
+use jellyfish;
+
+my $qf = jellyfish::QueryMerFile->new(shift(@ARGV));
+foreach my $m (@ARGV) {
+  my $mer = Jellyfish::MerDNA->new($m);
+  $mer->canonicalize;
+  print($mer, " ", $qf->get($mer), "\n");
+}
+```
+----
diff --git a/swig/Tuprules.tup b/swig/Tuprules.tup
new file mode 100644
index 0000000..d85099b
--- /dev/null
+++ b/swig/Tuprules.tup
@@ -0,0 +1,120 @@
+# Default rules
+!cc     = |> ^ CC    %f^ $(CC) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CFLAGS) $(CFLAGS_%B) @(CFLAGS) -c -o %o %f |> %B.o
+!cxx    = |> ^ CXX   %f^ $(CXX) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_%B) @(CXXFLAGS) -c -o %o %f |> %B.o
+!ld     = |> ^ LD    %o^ $(CC) $(T_LDFLAGS) $(LDFLAGS) $(LDFLAGS_%O) $(LOADLIBES) $(LDLIBS) %f -o %o |>
+!lxxd   = |> ^ LXX   %o^ $(CXX) $(T_LDFLAGS) $(LDFLAGS) $(LDFLAGS_%o) @(LDFLAGS) %f $(LOADLIBES) $(LDLIBS) $(LDLIBS_%o) -o %o |>
+!cld    = |> ^ CLD   %o^ $(CC) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CFLAGS) $(CFLAGS_%B) @(CFLAGS) %f -o %o |>
+!cxxld  = |> ^ CXXLD %o^ $(CXX) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_%B) @(CXXFLAGS) $(LDFLAGS) $(LDFLAGS_%o) @(LDFLAGS) %f $(LOADLIBES) $(LDLIBS) $(LDLIBS_%o) -o %o |> %B
+!ar     = |> ^ AR    %o^ $(AR) sruv $(ARFLAGS) $(ARFLAGS_%O) @(ARFLAGS) %o %f |>
+!yaggo  = |> ^ YAGGO %f^ $(YAGGO) %f |> %B.hpp
+!swigxx = |> ^ SWIG  %f^ $(SWIG) -c++ $(SWIGFLAGS) $(SWIGFLAGS_%B) -o %o %f |> %B.cxx
+
+# Default variables
+ifdef CC
+  CC = @(CC)
+else
+  CC = gcc
+endif
+
+ifdef CXX
+  CXX = @(CXX)
+else
+  CXX = g++
+endif
+
+ifdef AR
+  AR = @(AR)
+else
+  AR = ar
+endif
+
+ifdef YAGGO
+  YAGGO = @(YAGGO)
+else
+  YAGGO = yaggo
+endif
+
+ifdef SWIG
+  SWIG = @(SWIG)
+else
+  SWIG = swig
+endif
+
+ifdef PYTHON
+  PYTHON = @(PYTHON)
+else
+  PYTHON = python
+endif
+
+ifdef RUBY
+  RUBY = @(RUBY)
+else
+  RUBY = ruby
+endif
+
+ifdef PERL
+  PERL = @(PERL)
+else
+  PERL = perl
+endif
+
+ifdef JELLYFISH
+  JELLYFISH = @(JELLYFISH)
+else
+  JELLYFISH = jellyfish
+endif
+
+CXXFLAGS = -Wall -std=c++0x
+ifdef JELLYFISH_CFLAGS
+  JELLYFISH_CFLAGS = @(JELLYFISH_CFLAGS)
+else
+  JELLYFISH_CFLAGS = `pkg-config --cflags jellyfish-2.0`
+endif
+
+ifdef JELLYFISH_LIBS
+  JELLYFISH_LIBS = @(JELLYFISH_LIBS)
+else
+  JELLYFISH_LIBS = `pkg-config --libs jellyfish-2.0` 
+endif
+
+ifdef JELLYFISH_RPATH
+  JELLYFISH_RPATH = @(JELLYFISH_RPATH)
+else
+  JELLYFISH_RPATH = `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`
+endif
+
+ifdef RUBY_CFLAGS
+  RUBY_CFLAGS = @(RUBY_CFLAGS)
+else
+  RUBY_CFLAGS = `pkg-config --cflags ruby-1.9`
+endif
+
+ifdef RUBY_LIBS
+  RUBY_LIBS = @(RUBY_LIBS)
+else
+  RUBY_LIBS = `pkg-config --libs ruby-1.9`
+endif
+
+ifdef PYTHON_CFLAGS
+  PYTHON_CFLAGS = @(PYTHON_CFLAGS)
+else
+  PYTHON_CFLAGS = `pkg-config --cflags python3`
+endif
+
+ifdef PYTHON_LIBS
+  PYTHON_LIBS = @(PYTHON_LIBS)
+else
+  PYTHON_LIBS = `pkg-config --libs python3`
+endif
+
+ifdef PERL_CFLAGS
+  PERL_CFLAGS = @(PERL_CFLAGS)
+else
+  PERL_CFLAGS = `perl -MConfig -e 'print("-I$Config{archlibexp}/CORE")'`
+endif
+
+ifdef PERL_LIBS
+  PERL_LIBS = @(PERL_LIBS)
+else
+  PERL_LIBS = `perl -MConfig -e 'print($Config{ccdlflags})'`
+endif
diff --git a/swig/hash_counter.i b/swig/hash_counter.i
new file mode 100644
index 0000000..097990a
--- /dev/null
+++ b/swig/hash_counter.i
@@ -0,0 +1,56 @@
+/*********************************************************************/
+/* Proxy class for hash counter: auto size doubling hash on mer_dna. */
+/*********************************************************************/
+%{
+  class HashCounter : public jellyfish::cooperative::hash_counter<jellyfish::mer_dna> {
+    typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> super;
+  public:
+    HashCounter(size_t size, unsigned int val_len, unsigned int nb_threads = 1) : \
+    super(size, jellyfish::mer_dna::k() * 2, val_len, nb_threads)
+      { }
+
+    bool add(const MerDNA& m, const int& x) {
+      bool res;
+      size_t id;
+      super::add(m, x, &res, &id);
+      return res;
+    }
+
+  };
+%}
+
+// Typemaps to return nil/undef/None if the mer asked for is not in
+// the hash
+%typemap(in, numinputs=0) std::pair<bool, uint64_t>* COUNT (std::pair<bool, uint64_t> tmp) {
+  $1 = &tmp;
+ }
+%typemap(argout) std::pair<bool, uint64_t>* COUNT {
+  if(($1)->first) {
+    SWIG_Object o = SWIG_From(unsigned long)(($1)->second);
+    %append_output(o);
+  } else {
+    %append_output(VOID_Object);
+  }
+ }
+
+class HashCounter {
+public:
+  HashCounter(size_t size, unsigned int val_len, unsigned int nb_threads = 1);
+  size_t size() const;
+  unsigned int val_len() const;
+  //  unsigned int nb_threads() const;
+
+  bool add(const MerDNA& m, const int& x);
+  bool update_add(const MerDNA&, const int&);
+
+  %extend {
+    void get(const MerDNA& m, std::pair<bool, uint64_t>* COUNT) const {
+      COUNT->first = $self->ary()->get_val_for_key(m, &COUNT->second);
+    }
+#ifndef SWIGPERL
+    void __getitem__(const MerDNA& m, std::pair<bool, uint64_t>* COUNT) const {
+      COUNT->first = $self->ary()->get_val_for_key(m, &COUNT->second);
+    }
+#endif
+  }
+};
diff --git a/swig/hash_set.i b/swig/hash_set.i
new file mode 100644
index 0000000..72ccf57
--- /dev/null
+++ b/swig/hash_set.i
@@ -0,0 +1,35 @@
+/*********************************************************************/
+/* Proxy class for hash counter: auto size doubling hash on mer_dna. */
+/*********************************************************************/
+%{
+  class HashSet : public jellyfish::cooperative::hash_counter<jellyfish::mer_dna> {
+    typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> super;
+  public:
+    HashSet(size_t size, unsigned int nb_threads = 1) : \
+    super(size, jellyfish::mer_dna::k() * 2, 0, nb_threads)
+      { }
+
+    bool add(const MerDNA& m) {
+      bool res;
+      size_t id;
+      super::set(m, &res, &id);
+      return res;
+    }
+  };
+%}
+
+class HashSet {
+public:
+  HashSet(size_t size, unsigned int nb_threads = 1);
+  size_t size() const;
+  //  unsigned int nb_threads() const;
+
+  bool add(const MerDNA& m);
+
+  %extend {
+    bool get(const MerDNA& m) const { return $self->ary()->has_key(m); }
+#ifndef SWIGPERL
+    bool __getitem__(const MerDNA& m) const { return $self->ary()->has_key(m); }
+#endif
+  }
+};
diff --git a/swig/jellyfish.i b/swig/jellyfish.i
new file mode 100644
index 0000000..90a446b
--- /dev/null
+++ b/swig/jellyfish.i
@@ -0,0 +1,28 @@
+%module(docstring="Jellyfish binding") jellyfish
+%naturalvar; // Use const reference instead of pointers
+%include "std_string.i"
+%include "exception.i"
+%include "std_except.i"
+%include "typemaps.i"
+%feature("autodoc", "2");
+
+%{
+#ifdef SWIGPYTHON
+#define SWIG_FILE_WITH_INIT
+#endif
+
+#include <fstream>
+#include <stdexcept>
+#undef die
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/jellyfish.hpp>
+#undef die
+%}
+
+%include "mer_dna.i"
+%include "mer_file.i"
+%include "hash_counter.i"
+%include "hash_set.i"
diff --git a/swig/mer_dna.i b/swig/mer_dna.i
new file mode 100644
index 0000000..0e6827d
--- /dev/null
+++ b/swig/mer_dna.i
@@ -0,0 +1,99 @@
+/**********************************/
+/* MerDNA proxy class for mer_dna */
+/**********************************/
+%{
+  class MerDNA : public jellyfish::mer_dna {
+  public:
+    MerDNA() = default;
+    MerDNA(const char* s) : jellyfish::mer_dna(s) { }
+    MerDNA(const MerDNA& m) : jellyfish::mer_dna(m) { }
+    MerDNA& operator=(const jellyfish::mer_dna& m) { *static_cast<jellyfish::mer_dna*>(this) = m; return *this; }
+  };
+%}
+
+#ifdef SWIGRUBY
+%bang MerDNA::randomize();
+%bang MerDNA::canonicalize();
+%bang MerDNA::reverse_complement();
+%bang MerDNA::polyA();
+%bang MerDNA::polyC();
+%bang MerDNA::polyG();
+%bang MerDNA::polyT();
+// %predicate MerDNA::is_homopolymer(); // Does not work???
+%rename("MerDNA::homopolymer?") MerDNA::is_homopolymer();
+%rename("MerDNA::complement") MerDNA::get_reverse_complement();
+%rename("MerDNA::canonical") MerDNA::get_canonical();
+#endif
+
+
+%feature("autodoc", "Class representing a mer. All the mers have the same length, which must be set BEFORE instantiating any mers with jellyfish::MerDNA::k(int)");
+class MerDNA {
+public:
+  MerDNA();
+  MerDNA(const char*);
+  MerDNA(const MerDNA&);
+
+  %feature("autodoc", "Get the length of the k-mers");
+  static unsigned int k();
+  %feature("autodoc", "Set the length of the k-mers");
+  static unsigned int k(unsigned int);
+
+  %feature("autodoc", "Change the mer to a homopolymer of A");
+  void polyA();
+  %feature("autodoc", "Change the mer to a homopolymer of C");
+  void polyC();
+  %feature("autodoc", "Change the mer to a homopolymer of G");
+  void polyG();
+  %feature("autodoc", "Change the mer to a homopolymer of T");
+  void polyT();
+  %feature("autodoc", "Change the mer to a random one");
+  void randomize();
+  %feature("autodoc", "Check if the mer is a homopolymer");
+  bool is_homopolymer() const;
+
+  %feature("autodoc", "Shift a base to the left and the leftmost base is return . \"ACGT\", shift_left('A') becomes \"CGTA\" and 'A' is returned");
+  char shift_left(char);
+  %feature("autodoc", "Shift a base to the right and the rightmost base is return . \"ACGT\", shift_right('A') becomes \"AACG\" and 'T' is returned");
+  char shift_right(char);
+
+  %feature("autodoc", "Change the mer to its canonical representation");
+  void canonicalize();
+  %feature("autodoc", "Change the mer to its reverse complement");
+  void reverse_complement();
+  %feature("autodoc", "Return canonical representation of the mer");
+  MerDNA get_canonical() const;
+  %feature("autodoc", "Return the reverse complement of the mer");
+  MerDNA get_reverse_complement() const;
+
+  %feature("autodoc", "Equality between mers");
+  bool operator==(const MerDNA&) const;
+  %feature("autodoc", "Lexicographic less-than");
+  bool operator<(const MerDNA&) const;
+  %feature("autodoc", "Lexicographic greater-than");
+  bool operator>(const MerDNA&) const;
+
+
+  %extend{
+    %feature("autodoc", "Duplicate the mer");
+    MerDNA dup() const { return MerDNA(*self); }
+    %feature("autodoc", "Return string representation of the mer");
+    std::string __str__() { return self->to_str(); }
+    %feature("autodoc", "Set the mer from a string");
+    void set(const char* s) throw(std::length_error) { *static_cast<jellyfish::mer_dna*>(self) = s; }
+
+#ifdef SWIGPERL
+    char get_base(unsigned int i) { return (char)self->base(i); }
+    void set_base(unsigned int i, char b) { self->base(i) = b; }
+#else
+    %feature("autodoc", "Get base i (0 <= i < k)");
+    char __getitem__(unsigned int i) { return (char)self->base(i); }
+    %feature("autodoc", "Set base i (0 <= i < k)");
+    void __setitem__(unsigned int i, char b) { self->base(i) = b; }
+    //    MerDNA __neg__() const { return self->get_reverse_complement(); }
+    %feature("autodoc", "Shift a base to the left and return the mer");
+    MerDNA& __lshift__(char b) { self->shift_left(b); return *self; }
+    %feature("autodoc", "Shift a base to the right and return the mer");
+    MerDNA& __rshift__(char b) { self->shift_right(b); return *self; }
+#endif
+  }
+};
diff --git a/swig/mer_file.i b/swig/mer_file.i
new file mode 100644
index 0000000..130695a
--- /dev/null
+++ b/swig/mer_file.i
@@ -0,0 +1,191 @@
+/******************************/
+/* Query output of jellyfish. */
+/******************************/
+%{
+  class QueryMerFile {
+    std::unique_ptr<jellyfish::mer_dna_bloom_filter> bf;
+    jellyfish::mapped_file                           binary_map;
+    std::unique_ptr<binary_query>                    jf;
+
+  public:
+    QueryMerFile(const char* path) throw(std::runtime_error) {
+      std::ifstream in(path);
+      if(!in.good())
+        throw std::runtime_error(std::string("Can't open file '") + path + "'");
+      jellyfish::file_header header(in);
+      jellyfish::mer_dna::k(header.key_len() / 2);
+      if(header.format() == "bloomcounter") {
+        jellyfish::hash_pair<jellyfish::mer_dna> fns(header.matrix(1), header.matrix(2));
+        bf.reset(new jellyfish::mer_dna_bloom_filter(header.size(), header.nb_hashes(), in, fns));
+        if(!in.good())
+          throw std::runtime_error("Bloom filter file is truncated");
+      } else if(header.format() == "binary/sorted") {
+        binary_map.map(path);
+        jf.reset(new binary_query(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+                                  header.size() - 1, binary_map.length() - header.offset()));
+      } else {
+        throw std::runtime_error(std::string("Unsupported format '") + header.format() + "'");
+      }
+    }
+
+#ifdef SWIGPERL
+    unsigned int get(const MerDNA& m) { return jf ? jf->check(m) : bf->check(m); }
+#else
+    unsigned int __getitem__(const MerDNA& m) { return jf ? jf->check(m) : bf->check(m); }
+#endif
+  };
+%}
+
+%feature("autodoc", "Give random access to a Jellyfish database. Given a mer, it returns the count associated with that mer");
+class QueryMerFile {
+ public:
+  %feature("autodoc", "Open the jellyfish database");
+  QueryMerFile(const char* path) throw(std::runtime_error);
+
+  %feature("autodoc", "Get the count for the mer m");
+#ifdef SWIGPERL
+  unsigned int get(const MerDNA& m);
+#else
+  unsigned int __getitem__(const MerDNA& m);
+#endif
+};
+
+
+/****************************/
+/* Read output of jellyfish */
+/****************************/
+#ifdef SWIGRUBY
+%mixin ReadMerFile "Enumerable";
+#endif
+
+#ifdef SWIGPYTHON
+// For python iteratable, throw StopIteration if at end of iterator
+%exception __next__ {
+  $action;
+  if(!result.first) {
+    PyErr_SetString(PyExc_StopIteration, "Done");
+    SWIG_fail;
+  }
+ }
+%exception next {
+  $action;
+  if(!result.first) {
+    PyErr_SetString(PyExc_StopIteration, "Done");
+    SWIG_fail;
+  }
+ }
+%typemap(out) std::pair<const MerDNA*, uint64_t> {
+  SWIG_Object m = SWIG_NewPointerObj(const_cast<MerDNA*>(($1).first), SWIGTYPE_p_MerDNA, 0);
+  SWIG_Object c = SWIG_From(unsigned long)(($1).second);
+  %append_output(m);
+  %append_output(c);
+ }
+#endif
+
+#ifdef SWIGPERL
+// For perl, return an empty array at end of iterator
+%typemap(out) std::pair<const MerDNA*, uint64_t> {
+  if(($1).first) {
+    SWIG_Object m = SWIG_NewPointerObj(const_cast<MerDNA*>(($1).first), SWIGTYPE_p_MerDNA, 0);
+    SWIG_Object c = SWIG_From(unsigned long)(($1).second);
+    %append_output(m);
+    %append_output(c);
+  }
+ }
+#endif
+
+%{
+  class ReadMerFile {
+    std::ifstream                  in;
+    std::unique_ptr<binary_reader> binary;
+    std::unique_ptr<text_reader>   text;
+
+    std::pair<const MerDNA*, uint64_t> next_mer__() {
+      std::pair<const MerDNA*, uint64_t> res((const MerDNA*)0, 0);
+      if(next_mer()) {
+        res.first  = mer();
+        res.second = count();
+      }
+      return res;
+    }
+
+  public:
+    ReadMerFile(const char* path) throw(std::runtime_error) :
+      in(path)
+    {
+      if(!in.good())
+        throw std::runtime_error(std::string("Can't open file '") + path + "'");
+      jellyfish::file_header header(in);
+      jellyfish::mer_dna::k(header.key_len() / 2);
+      if(header.format() == binary_dumper::format)
+        binary.reset(new binary_reader(in, &header));
+      else if(header.format() == text_dumper::format)
+        text.reset(new text_reader(in, &header));
+      else
+        throw std::runtime_error(std::string("Unsupported format '") + header.format() + "'");
+    }
+
+    bool next_mer() {
+      if(binary) {
+        if(binary->next()) return true;
+        binary.reset();
+      } else if(text) {
+        if(text->next()) return true;
+        text.reset();
+      }
+      return false;
+    }
+
+    const MerDNA* mer() const { return static_cast<const MerDNA*>(binary ? &binary->key() : &text->key()); }
+    unsigned long count() const { return binary ? binary->val() : text->val(); }
+
+#ifdef SWIGRUBY
+    void each() {
+      if(!rb_block_given_p()) return;
+      while(next_mer()) {
+        auto m = SWIG_NewPointerObj(const_cast<MerDNA*>(mer()), SWIGTYPE_p_MerDNA, 0);
+        auto c = SWIG_From_unsigned_SS_long(count());
+        rb_yield(rb_ary_new3(2, m, c));
+      }
+    }
+#endif
+
+#ifdef SWIGPERL
+    std::pair<const MerDNA*, uint64_t> each() { return next_mer__(); }
+#endif
+
+#ifdef SWIGPYTHON
+    ReadMerFile* __iter__() { return this; }
+    std::pair<const MerDNA*, uint64_t> __next__() { return next_mer__(); }
+    std::pair<const MerDNA*, uint64_t> next() { return next_mer__(); }
+#endif
+  };
+%}
+
+%feature("autodoc", "Read a Jellyfish database sequentially");
+class ReadMerFile {
+ public:
+  %feature("autodoc", "Open the jellyfish database");
+  ReadMerFile(const char* path) throw(std::runtime_error);
+  %feature("autodoc", "Move to the next mer in the file. Returns false if no mers left, true otherwise");
+  bool next_mer();
+  %feature("autodoc", "Returns current mer");
+  const MerDNA* mer() const;
+  %feature("autodoc", "Returns the count of the current mer");
+  unsigned long count() const;
+
+  %feature("autodoc", "Iterate through all the mers in the file, passing two values: a mer and its count");
+#ifdef SWIGRUBY
+  void each();
+#endif
+
+#ifdef SWIGPERL
+  std::pair<const MerDNA*, uint64_t> each();
+#endif
+
+#ifdef SWIGPYTHON
+  ReadMerFile* __iter__();
+  std::pair<const MerDNA*, uint64_t> __next__();
+  std::pair<const MerDNA*, uint64_t> next() { return __next__(); }
+#endif
+  };
diff --git a/swig/perl5/Makefile.PL b/swig/perl5/Makefile.PL
new file mode 100644
index 0000000..f8461f9
--- /dev/null
+++ b/swig/perl5/Makefile.PL
@@ -0,0 +1,20 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use ExtUtils::MakeMaker;
+
+mkdir('lib');
+system('swig', '-c++', '-perl5', '-o', 'jellyfish_wrap.cxx', '../jellyfish.i');
+
+my $jf_cflags = `pkg-config --cflags jellyfish-2.0`;
+my $jf_libs   = `pkg-config --libs jellyfish-2.0`;
+my $jf_rpath  = `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`;
+
+WriteMakefile(NAME      => 'jellyfish',
+              CC        => 'g++-4.4',
+              LD        => 'g++-4.4',
+              CCFLAGS   => "-std=c++0x $jf_cflags",
+              LIBS      => "$jf_libs",
+              OBJECT    => 'jellyfish_wrap.o',
+              VERSION   => '0.0.1');
diff --git a/swig/perl5/Tupfile b/swig/perl5/Tupfile
new file mode 100644
index 0000000..85a8948
--- /dev/null
+++ b/swig/perl5/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -perl5
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(PERL_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(PERL_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx | jellyfish.pm <jf>
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> jellyfish.so <jf>
+
+TESTS = t/test_mer_file.t t/test_hash_counter.t
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> $(PERL) -I. %f ../tests > %o 2>&1 |> %B
diff --git a/swig/perl5/t/test_hash_counter.t b/swig/perl5/t/test_hash_counter.t
new file mode 100644
index 0000000..1f5579c
--- /dev/null
+++ b/swig/perl5/t/test_hash_counter.t
@@ -0,0 +1,44 @@
+use strict;
+use warnings;
+use Test::More;
+use jellyfish;
+
+require_ok('jellyfish');
+my $data = shift(@ARGV);
+
+jellyfish::MerDNA::k(100);
+my $hash = jellyfish::HashCounter->new(1024, 5);
+
+# Check info
+ok(100 == jellyfish::MerDNA::k, "mer_dna k");
+ok(1024 == $hash->size, "Hash size");
+ok(5 == $hash->val_len, "Hash value length");
+
+# Test adding mers
+{
+  my $mer  = jellyfish::MerDNA->new;
+  my $good = 1;
+  for(my $i = 0; $i < 1000; $i++) {
+    $mer->randomize();
+    my $val = int(rand(1000));
+    $good &&= $hash->add($mer, $val) or
+        (ok($good, "Adding to new mer") || last);
+    if($i % 3 > 0) {
+      my $nval = int(rand(1000));
+      $val += $nval;
+      if($i % 3 == 1) {
+        $good &&= !$hash->add($mer, $nval) or
+            (ok($good, "Adding to existing mer") || last);
+      } else {
+        $good &&= $hash->update_add($mer, $nval) or
+            (ok($good, "Updating existing mer") || last);
+      }
+    }
+    $good &&= $val == $hash->get($mer) or
+        (ok($good, "Value in hash") || last);
+
+  }
+  ok($good, "Adding mer to hash");
+}
+
+done_testing;
diff --git a/swig/perl5/t/test_mer_file.t b/swig/perl5/t/test_mer_file.t
new file mode 100644
index 0000000..2403545
--- /dev/null
+++ b/swig/perl5/t/test_mer_file.t
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use Test::More;
+
+require_ok('jellyfish');
+my $data = shift(@ARGV);
+
+# Compare histo
+{
+  my $rf = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+  my @histo;
+  $histo[$rf->count]++ while($rf->next_mer);
+
+  open(my $io, "<", $data . "/sequence.histo");
+  my @jf_histo;
+  while(<$io>) {
+    my ($freq, $count) = split;
+    $jf_histo[$freq] = $count;
+  }
+  
+  is_deeply(\@histo, \@jf_histo, "Histogram");
+}
+
+# Compare dump
+{
+  my $rf = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+  my $equal = open(my $io, "<", $data . "/sequence.dump");
+  while(<$io>) {
+    my ($mer, $count) = split;
+    $equal &&= $rf->next_mer;
+    $equal &&= ($mer eq $rf->mer);
+    $equal &&= ($count == $rf->count);
+    last unless $equal;
+  }
+  $equal &&= !$rf->next_mer;
+  ok($equal, "Dump");
+}
+
+# Query
+{
+  my $rf   = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+  my $qf   = jellyfish::QueryMerFile->new($data . "/sequence.jf");
+  my $good = 1;
+  while(my ($mer, $count) = $rf->each) {
+    $good &&= $count == $qf->get($mer) or
+        (ok($good, "Query mer") || last);
+  }
+  ok($good, "Query identical to read");
+}
+
+done_testing;
diff --git a/swig/python/Tupfile b/swig/python/Tupfile
new file mode 100644
index 0000000..dd75133
--- /dev/null
+++ b/swig/python/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -python
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(PYTHON_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(PYTHON_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx | jellyfish.py <jf>
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> _jellyfish.so <jf>
+
+TESTS = test_mer_file.py test_hash_counter.py
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> PYTHONPATH=.:$PYTHONPATH $(PYTHON) -B %f ../tests > %o 2>&1 |> %B
diff --git a/swig/python/setup.py b/swig/python/setup.py
new file mode 100644
index 0000000..1611889
--- /dev/null
+++ b/swig/python/setup.py
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+
+import os
+import re
+from distutils.core import setup, Extension
+
+# Don't use Extension support for swig, it is more annoying than
+# anything!  (1)It does not support very well having the .i in a
+# different directory. (2)It runs swig every single time, even if it
+# ran successfully before. So (3)doing first build, then install as
+# root rebuilds the modules as root.
+swig_time = os.path.getmtime('../jellyfish.i')
+older = True
+try:
+    older = os.path.getmtime('jellyfish_wrap.cxx') < swig_time or os.path.getmtime('jellyfish.py') < swig_time
+except FileNotFoundError:
+    older = True
+
+if older:
+    print("Running swig: swig -c++ -python -o jellyfish_wrap.cxx ../jellyfish.i")
+    os.system("swig -c++ -python -o jellyfish_wrap.cxx ../jellyfish.i")
+
+jf_include = [re.sub(r'-I', '', x) for x in os.popen("pkg-config --cflags-only-I jellyfish-2.0").read().rstrip().split()]
+jf_cflags  = os.popen("pkg-config --cflags-only-other").read().rstrip().split()
+
+jf_libs    = [re.sub(r'-l', '', x) for x in os.popen("pkg-config --libs-only-l jellyfish-2.0").read().rstrip().split()]
+jf_libdir  = [re.sub(r'-L', '', x) for x in os.popen("pkg-config --libs-only-L jellyfish-2.0").read().rstrip().split()]
+jf_rpath   = [re.sub(r'^', '-Wl,-rpath,', x) for x in jf_libdir]
+jf_ldflags = os.popen("pkg-config --libs-only-other jellyfish-2.0").read().rstrip().split()
+
+
+jellyfish_module = Extension('_jellyfish',
+                             sources = ['jellyfish_wrap.cxx'],
+                             include_dirs = jf_include,
+                             libraries = jf_libs,
+                             library_dirs = jf_libdir,
+                             extra_compile_args = ["-std=c++0x"] + jf_cflags,
+                             extra_link_args = jf_ldflags + jf_rpath,
+                             language = "c++")
+setup(name = 'jellyfish',
+      version = '0.0.1',
+      author = 'Guillaume Marcais',
+      description = 'Access to jellyfish k-mer counting',
+      ext_modules = [jellyfish_module],
+      py_modules = ["jellyfish"])
diff --git a/swig/python/test_hash_counter.py b/swig/python/test_hash_counter.py
new file mode 100644
index 0000000..8632d6d
--- /dev/null
+++ b/swig/python/test_hash_counter.py
@@ -0,0 +1,39 @@
+import unittest
+import sys
+import random
+import jellyfish
+
+class TestHashCounter(unittest.TestCase):
+    def setUp(self):
+        jellyfish.MerDNA.k(100)
+        self.hash = jellyfish.HashCounter(1024, 5)
+
+    def test_info(self):
+        self.assertEqual(100, jellyfish.MerDNA.k())
+        self.assertEqual(1024, self.hash.size())
+        self.assertEqual(5, self.hash.val_len())
+
+    def test_add(self):
+        mer  = jellyfish.MerDNA()
+        good = True
+        for i in range(1000):
+            mer.randomize()
+            val = random.randrange(1000)
+            good = good and self.hash.add(mer, val)
+            if not good: break
+            if i % 3 > 0:
+                nval = random.randrange(1000)
+                val  = val + nval
+                if i % 3 == 1:
+                    good = good and (not self.hash.add(mer, nval))
+                else:
+                    good = good and self.hash.update_add(mer, nval)
+            if not good: break
+            good = good and (val == self.hash.get(mer)) and (val == self.hash[mer])
+            if not good: break
+        self.assertTrue(good)
+
+
+if __name__ == '__main__':
+    data = sys.argv.pop(1)
+    unittest.main()
diff --git a/swig/python/test_mer_file.py b/swig/python/test_mer_file.py
new file mode 100644
index 0000000..34a8cf6
--- /dev/null
+++ b/swig/python/test_mer_file.py
@@ -0,0 +1,57 @@
+import jellyfish
+import unittest
+import sys
+import os
+from collections import Counter
+
+class TestMerFile(unittest.TestCase):
+    def setUp(self):
+        self.mf = jellyfish.ReadMerFile(os.path.join(data, "sequence.jf"))
+
+    def test_histo(self):
+        histo = Counter()
+        while self.mf.next_mer():
+            histo[self.mf.count()] += 1
+
+        jf_histo = Counter()
+        with open(os.path.join(data, "sequence.histo")) as f:
+            for line in f:
+                num, count = [int(n) for n in line.split()]
+                self.assertEqual(count, histo[num])
+
+    def test_dump(self):
+        good = True
+        with open(os.path.join(data, "sequence.dump")) as f:
+            for line in f:
+                good = good and self.mf.next_mer()
+                if not good: break
+                a = line.split()
+                good = good and a[0] == str(self.mf.mer()) and int(a[1]) == self.mf.count()
+                if not good: break
+        self.assertTrue(good)
+
+    def test_iter(self):
+        good = True
+        with open(os.path.join(data, "sequence.dump")) as f:
+            for mer, count in self.mf:
+                line = f.readline()
+                good = good and line
+                if not good: break
+                fmer, fcount = line.split()
+                good = good and fmer == str(mer) and int(fcount) == count
+                if not good: break
+            self.assertTrue(good)
+            line = f.readline()
+            self.assertTrue(not line)
+
+    def test_query(self):
+        good = True
+        qf   = jellyfish.QueryMerFile(os.path.join(data, "sequence.jf"))
+        for mer, count in self.mf:
+            good = good and count == qf[mer]
+            if not good: break
+        self.assertTrue(good)
+
+if __name__ == '__main__':
+    data = sys.argv.pop(1)
+    unittest.main()
diff --git a/swig/ruby/Tupfile b/swig/ruby/Tupfile
new file mode 100644
index 0000000..c4ebb0d
--- /dev/null
+++ b/swig/ruby/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -ruby
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(RUBY_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(RUBY_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> jellyfish.so <jf>
+
+TESTS = test_mer_file.rb test_hash_counter.rb
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> $(RUBY) -I. %f ../tests > %o |> %B
diff --git a/swig/ruby/extconf.rb b/swig/ruby/extconf.rb
new file mode 100644
index 0000000..ea4aa2e
--- /dev/null
+++ b/swig/ruby/extconf.rb
@@ -0,0 +1,12 @@
+#! /usr/bin/env ruby
+
+require 'mkmf'
+
+swig = find_executable('swig')
+system(swig, '-c++', '-ruby', '-o', 'jellyfish_wrap.cxx', '../jellyfish.i')
+
+$defs << `pkg-config --cflags jellyfish-2.0`.chomp << '-std=c++0x'
+$libs << `pkg-config --libs jellyfish-2.0`.chomp
+$libs << `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`.chomp
+
+create_makefile('jellyfish')
diff --git a/swig/ruby/test_hash_counter.rb b/swig/ruby/test_hash_counter.rb
new file mode 100644
index 0000000..6845d9d
--- /dev/null
+++ b/swig/ruby/test_hash_counter.rb
@@ -0,0 +1,42 @@
+require 'minitest/autorun'
+require 'jellyfish'
+
+class TestHashCounter < MiniTest::Unit::TestCase
+  def setup
+    Jellyfish::MerDNA::k(100)
+    @hash = Jellyfish::HashCounter.new(1024, 5)
+  end
+
+  def test_info
+    assert_equal(100, Jellyfish::MerDNA::k)
+    assert_equal(1024, @hash.size)
+    assert_equal(5, @hash.val_len)
+#    assert_equal(1, @hash.nb_threads)
+  end
+
+  def test_add
+    mer = Jellyfish::MerDNA.new
+
+    1000.times { |i|
+      mer.randomize!
+      val = rand(1000)
+      assert(@hash.add(mer, val))
+      if i % 3 > 0
+        nval = rand(1000)
+        val += nval
+        if i % 3 == 1
+          assert(!@hash.add(mer, nval))
+        else
+          assert(@hash.update_add(mer, nval))
+        end
+      end
+      assert_equal(val, @hash.get(mer))
+      assert_equal(val, @hash[mer])
+    }
+
+    mer.randomize!
+    assert_nil(@hash.get(mer))
+    assert_nil(@hash[mer])
+    assert(!@hash.update_add(mer, 1))
+  end
+end
diff --git a/swig/ruby/test_mer_file.rb b/swig/ruby/test_mer_file.rb
new file mode 100644
index 0000000..92dc60c
--- /dev/null
+++ b/swig/ruby/test_mer_file.rb
@@ -0,0 +1,57 @@
+require 'minitest/autorun'
+require 'jellyfish'
+
+$data = ARGV.shift
+
+class TestMerFile < MiniTest::Unit::TestCase
+  def setup
+    @mf = Jellyfish::ReadMerFile.new(File.join($data, "sequence.jf"))
+  end
+
+  def test_histo
+    histo = []
+    histo[@mf.count] = (histo[@mf.count] || 0) + 1 while @mf.next_mer
+
+    jf_histo = []
+    open(File.join($data, "sequence.histo")) { |f|
+      f.lines.each { |l|
+        freq, count = l.split.map {|x| x.to_i }
+        jf_histo[freq] = count
+      }
+    }
+    
+    assert_equal jf_histo, histo
+  end
+
+  def test_each
+    open(File.join($data, "sequence.dump")) { |f|
+      @mf.each { |m, c|
+        l = f.readline
+        assert l
+        fm, fc = l.split
+        assert_equal fm, m.to_s
+        assert_equal fc.to_i, c
+      }
+      assert_raises(EOFError) { f.readline }
+    }
+  end
+
+  def test_dump
+    open(File.join($data, "sequence.dump")) { |f|
+      f.lines.each { |l|
+        mer, count = l.split
+        assert @mf.next_mer
+        assert_equal(mer, @mf.mer.to_s)
+        assert_equal(count.to_i, @mf.count)
+      }
+    }
+    assert !@mf.next_mer
+  end
+
+  def test_query
+    query = Jellyfish::QueryMerFile.new(File.join($data, "sequence.jf"))
+    @mf.each { |m, c|
+      assert_equal c, query[m]
+    }
+  end
+end
diff --git a/swig/tests/Tupfile b/swig/tests/Tupfile
new file mode 100644
index 0000000..6c717ee
--- /dev/null
+++ b/swig/tests/Tupfile
@@ -0,0 +1,6 @@
+include_rules
+
+: |> (echo ">read"; head -c 1000000 /dev/urandom | ruby -e 'b="ACGT"; STDIN.bytes.each { |x| 4.times { |i| print(b[(x >> (2*i)) & 3]) } }') > %o |> sequence.fasta
+: sequence.fasta |> $(JELLYFISH) count -m 10 -s 10M -t 10 -C -o %o %f |> sequence.jf <seq>
+: sequence.jf |> $(JELLYFISH) histo %f > %o |> sequence.histo <seq>
+: sequence.jf |> $(JELLYFISH) dump -c %f > %o |> sequence.dump <seq>
diff --git a/tests/big.sh b/tests/big.sh
index 5e5f1f7..5d983f0 100644
--- a/tests/big.sh
+++ b/tests/big.sh
@@ -8,23 +8,22 @@ if [ -z "$BIG" ]; then
     exit 77
 fi
 
-sort > ${pref}.md5sum <<EOF 
+sort -k2,2 > ${pref}.md5sum <<EOF 
 f52abd3e2a7cc5089cc8f32cb607c4c5 ${pref}_16.histo
-eac5dafa9db7af2c5202dec8c6c33d00 ${pref}_16.stats
 EOF
 
     # $JF count -m 31 -s 4000000000 -o ${pref}_31 -c 4 -p 253 -C -r -t $nCPUs --timing ${pref}_31.timing \
     # seq30g.fa && \
     # $JF histo ${pref}_31_0 > ${pref}_31.histo && \
 
-echo "Generate 30 Gigs of sequence and count k-mers on it" && \
-    ([ -f seq30g.fa ] || ${DIR}/generate_sequence -v -o seq30g -r 1000 -s 1602176487 30000000000) && \
-    $JF count -m 16 -s 4000000000 -o ${pref}_16 -c 4 -p 253 -C --out-counter-len 2 \
-    -t $nCPUs --timing ${pref}_16.timing --stats ${pref}_16.stats $JFPARAM seq30g.fa && \
-    $JF histo ${pref}_16_0 > ${pref}_16.histo && \
+echo "Count k-mers on big data set" && \
+    ([ -f seq30g.fa ] || ${DIR}/generate_sequence -v -o seq30g -r 1000 -s 1602176487 30000000000) &&
+    $JF count -m 16 -s 4000000000 -o ${pref}_16.jf -c 4 -p 253 -C --out-counter-len 2 \
+    -t $nCPUs $JFPARAM seq30g.fa && \
+    $JF histo ${pref}_16.jf > ${pref}_16.histo && \
     check ${pref}.md5sum
 RET=$?
 
-echo "16-mer timing"; cat ${pref}_16.timing
+# echo "16-mer timing"; cat ${pref}_16.timing
 
 exit $RET
diff --git a/tests/bloom_counter.sh b/tests/bloom_counter.sh
new file mode 100644
index 0000000..4244e48
--- /dev/null
+++ b/tests/bloom_counter.sh
@@ -0,0 +1,47 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+9251799dd5dbd3f617124aa2ff72112a ${pref}.histo
+9251799dd5dbd3f617124aa2ff72112a ${pref}_filtered.histo
+EOF
+
+cat > ${pref}_commands <<EOF
+gunzip -c seq1m_0.fa.gz
+gunzip -c seq1m_0.fa.gz
+EOF
+$JF bc -t $nCPUs -o ${pref}.bc -s 1M -C -m 40 --timing ${pref}.timing -g ${pref}_commands -G 2
+# Counting without filtering
+$JF count -t $nCPUs -o ${pref}.jf -s 2M -C -m 40 seq1m_0.fa
+# Filtereing should not do anything here: all mers are loaded twice in the bc
+$JF count -t $nCPUs -o ${pref}_filtered.jf --bc ${pref}.bc -s 2M -C -m 40 seq1m_0.fa
+
+$JF bc -t $nCPUs -o ${pref}_none.bc -s 2M -C -m 40 seq1m_0.fa seq1m_1.fa seq1m_1.fa
+$JF count -t $nCPUs -o ${pref}_none.jf --bc ${pref}_none.bc -s 1M -C -m 40 seq1m_0.fa
+$JF histo ${pref}_none.jf > ${pref}_none.histo
+
+$JF histo ${pref}.jf > ${pref}.histo
+$JF histo ${pref}_filtered.jf > ${pref}_filtered.histo
+
+TOTAL=$(cut -d\  -f2 ${pref}.histo)
+COLLISION=$(cut -d\  -f2 ${pref}_none.histo)
+# FPR is 1 in 1000. Should not get more than 1/500 collisions.
+[ $((TOTAL / 500 > COLLISION)) = 1 ] || {
+    echo >&2 "Too many collisions"
+    false
+}
+
+QUERY_TOT=$($JF query -s seq1m_0.fa ${pref}.bc | grep -c ' 2$')
+[ $QUERY_TOT = $TOTAL ] || {
+    echo >&2 "Queried count 2 mers should be all mers"
+    false
+}
+QUERY_COL=$($JF query -s seq1m_0.fa ${pref}_none.bc | grep -c ' 2$')
+[ $QUERY_COL = $COLLISION ] || {
+    echo >&2 "Queried count 2 mers should equal collisions"
+    false
+}
+
+check ${pref}.md5sum
diff --git a/tests/bloom_filter.sh b/tests/bloom_filter.sh
new file mode 100644
index 0000000..035a6a7
--- /dev/null
+++ b/tests/bloom_filter.sh
@@ -0,0 +1,23 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+# sort -k2,2 > ${pref}.md5sum <<EOF
+# EOF
+
+$JF count --bf-size 10M --bf-fp 0.001 -t $nCPUs -o ${pref}_10m.jf -s 1M -m 40 seq10m.fa
+$JF histo ${pref}_10m.jf > ${pref}_10m.histo
+COLLISIONS=$(cut -d\  -f2 ${pref}_10m.histo | paste -sd+ - | bc)
+[ $((COLLISIONS > 10000)) = 0 ] || {
+    echo >& "Too many collisions"
+    false
+}
+
+$JF count --bf-size 3M --bf-fp 0.001 -t $nCPUs -o ${pref}_3m.jf -s 1M -m 40 seq1m_0.fa seq1m_1.fa seq1m_0.fa seq1m_2.fa
+$JF histo ${pref}_3m.jf > ${pref}_3m.histo
+COLLISIONS=$(cut -d\  -f2 ${pref}_3m.histo | paste -sd+ - | bc)
+[ $((COLLISIONS - 1000000 > 20000)) = 0 ] || {
+    echo >& "Too many collisions"
+    false
+}
diff --git a/tests/compat.sh.in b/tests/compat.sh.in
index ee924d5..29bf812 100644
--- a/tests/compat.sh.in
+++ b/tests/compat.sh.in
@@ -3,14 +3,17 @@ if [ -z "$nCPUs" ]; then
 fi
 pref=$(basename $0 .sh)
 DIR=../bin
-JF=$DIR/jellyfish
+JF="$DIR/jellyfish"
+[ -n "$VALGRIND" ] && JF="valgrind $JF"
 
 check () {
-    cut -d\  -f 2 $1 | xargs @MD5@ | sed -e 's/ \*//' | sort | diff -w $1 -
+    cut -d\  -f 2 $1 | xargs @MD5@ | sort -k2,2 | diff -w $DIFFFLAGS $1 -
 }
 
+
 if [ -n "$DEBUG" ]; then
     set -x;
+    DIFFFLAGS="-y"
 fi
 
 set -e
diff --git a/tests/from_stream.sh b/tests/from_stream.sh
index ac8a5a1..5d3163a 100644
--- a/tests/from_stream.sh
+++ b/tests/from_stream.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF 
+sort -k2,2 > ${pref}.md5sum <<EOF 
 4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
 7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
 c3233e107bb6b42d0c979707f156264c ${pref}.query
diff --git a/tests/from_stream_fastq.sh b/tests/from_stream_fastq.sh
index c8843be..b1321f3 100644
--- a/tests/from_stream_fastq.sh
+++ b/tests/from_stream_fastq.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF 
+sort -k2,2 > ${pref}.md5sum <<EOF 
 c448e173e5e18264ed00fad0008d5340 ${pref}.histo
 EOF
 
diff --git a/tests/generate_sequence.sh b/tests/generate_sequence.sh
index 75fead3..0ff6785 100755
--- a/tests/generate_sequence.sh
+++ b/tests/generate_sequence.sh
@@ -5,3 +5,9 @@ cd tests
 
 ${DIR}/generate_sequence -v -o seq10m -m 10 -m 22 -s 3141592653 10000000
 ${DIR}/generate_sequence -v -o seq1m -s 1040104553 1000000 1000000 1000000 1000000 1000000
+
+for i in 0 1 2 3 4; do
+    gzip -c seq1m_$i.fa > seq1m_$i.fa.gz
+done
+
+${DIR}/generate_sequence -v -q -o seq10m -s 1473540700 10000000
diff --git a/tests/large_key.sh b/tests/large_key.sh
new file mode 100644
index 0000000..c00f1d6
--- /dev/null
+++ b/tests/large_key.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2M_ordered
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2k_ordered
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2k_disk_ordered
+EOF
+
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2M.jf -s 2M -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2M.jf | cut -d\  -f 1 | sort > ${pref}_m100_2M_ordered
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2k.jf -s 2k -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2k.jf | cut -d\  -f 1 | sort > ${pref}_m100_2k_ordered
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2k_disk.jf -s 2k --disk -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2k_disk.jf | cut -d\  -f 1 | sort > ${pref}_m100_2k_disk_ordered
+check ${pref}.md5sum
diff --git a/tests/merge.sh b/tests/merge.sh
index b2aa346..86c6e49 100644
--- a/tests/merge.sh
+++ b/tests/merge.sh
@@ -3,16 +3,28 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
-c448e173e5e18264ed00fad0008d5340 ${pref}_quake.histo
+sort -k2,2 > ${pref}.md5sum <<EOF
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s16m.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_automerge_m40_s1m.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s1m_merged.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s1m_text.histo
 EOF
-echo "Counting mers and merging" && \
-    $JF count --quake --matrix seq10m_matrix_19 -m 19 -t $nCPUs \
-    -o ${pref}_quake -s 3000000 --timing ${pref}_quake.timing seq10m.fq && \
-    $JF qmerge -s 10000000 -m 19 -o ${pref}_quake_merged ${pref}_quake_[012] && \
-    $JF qhisto -f -h 3 -i 0.01 -l 0 ${pref}_quake_merged_0 > ${pref}_quake.histo && \
-    check ${pref}.md5sum
-RET=$?
-
-echo "Qmer timing"; cat ${pref}_quake.timing 2>/dev/null
-exit $RET
+
+FILES="seq1m_0.fa seq1m_1.fa seq1m_0.fa seq1m_2.fa seq1m_2.fa"
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s16m.jf -s 4M -C -m 40
+$JF histo ${pref}_m40_s16m.jf > ${pref}_m40_s16m.histo
+
+ls | grep "^${pref}_m40_s1m[0-9].*" | xargs rm -f
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s1m -s 1M --disk --no-merge -C -m 40
+$JF merge -o ${pref}_m40_s1m_merged.jf ${pref}_m40_s1m[0-9]*
+ls | grep "^${pref}_m40_s1m[0-9].*" | xargs rm -f
+
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_automerge_m40_s1m.jf -s 1M --disk -C -m 40
+
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s1m_text.jf -s 1M --text --disk -C -m 40
+
+$JF histo ${pref}_automerge_m40_s1m.jf > ${pref}_automerge_m40_s1m.histo
+$JF histo ${pref}_m40_s1m_merged.jf > ${pref}_m40_s1m_merged.histo
+$JF histo ${pref}_m40_s1m_text.jf > ${pref}_m40_s1m_text.histo
+
+check ${pref}.md5sum
diff --git a/tests/min_qual.sh b/tests/min_qual.sh
index ffc0120..024a9ee 100644
--- a/tests/min_qual.sh
+++ b/tests/min_qual.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 7f78bc16dedc972fc253bf1378e01561 ${pref}.histo
 EOF
 
diff --git a/tests/multi_file.sh b/tests/multi_file.sh
index b1fe022..cdff3c7 100644
--- a/tests/multi_file.sh
+++ b/tests/multi_file.sh
@@ -3,16 +3,40 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
-0e2705617b44144daedc5f9e35ba7b93 ${pref}.stats
+sort -k2,2 > ${pref}.md5sum <<EOF
+d93b7678037814c256d1d9120a0e6422 ${pref}_m15_s2M.histo
+d93b7678037814c256d1d9120a0e6422 ${pref}_m15_s2M_zip.histo
 EOF
-echo "Counting 22-mers on ${nCPUs} CPU" &&      \
-    $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs \
-    -o $pref -s 5000000 --timing ${pref}.timing seq1m_*.fa && \
-    $JF stats ${pref}_0 > ${pref}.stats && \
-    check ${pref}.md5sum
-RET=$?
-
-# [ -z "$NODEL" ] && \
-#     rm -f ${pref}_* ${pref}.md5sum ${pref}.timing ${pref}.stats
-exit $RET
+
+# Count multiple files with many readers
+$JF count -t $nCPUs -F 4 -o ${pref}_m15_s2M.jf -s 2M -C -m 15 seq1m_0.fa seq1m_1.fa seq1m_2.fa seq10m.fa seq1m_3.fa seq1m_4.fa
+$JF histo ${pref}_m15_s2M.jf > ${pref}_m15_s2M.histo
+
+cat > ${pref}_gunzip_cmds <<EOF
+
+  
+  # Empty lines and comments just for fun
+
+EOF
+find . -name 'seq1m_*.fa.gz' | xargs -n 1 echo gunzip -c >> ${pref}_gunzip_cmds
+$JF count -t $nCPUs -g ${pref}_gunzip_cmds -G 2 -C -m 15 -s 2M -o ${pref}_m15_s2M_zip.jf seq10m.fa
+$JF histo ${pref}_m15_s2M_zip.jf > ${pref}_m15_s2M_zip.histo
+
+# Test failure of generator
+echo false > ${pref}_fail_cmds
+STATUS=
+$JF count -t $nCPUs -g ${pref}_fail_cmds -G 2 -C -m 15 -s 2M -o ${pref}_fail.jf || STATUS=$?
+if [ -z "$STATUS" ]; then
+    echo >&2 "Jellyfish did not report failure in generator command"
+    false
+fi
+
+# Test failure to open file
+STATUS=
+$JF count -t $nCPUs -C -m 15 -s 2M -o ${pref}_fail.jf non_existent_sequence.fa || STATUS=$?
+if [ -z "$STATUS" ]; then
+    echo >&2 "Jellyfish did not report failure in opening a file"
+    false
+fi
+
+check ${pref}.md5sum
diff --git a/tests/multi_file_fastq.sh b/tests/multi_file_fastq.sh
index 8b44334..dc7546d 100644
--- a/tests/multi_file_fastq.sh
+++ b/tests/multi_file_fastq.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 8ebb01305cbb36754ef060c1e37d6e4d ${pref}.histo
 EOF
 echo "Counting 22-mers on ${nCPUs} CPU" &&      \
diff --git a/tests/parallel_direct_indexing.sh b/tests/parallel_direct_indexing.sh
index ef7e046..f067ec7 100755
--- a/tests/parallel_direct_indexing.sh
+++ b/tests/parallel_direct_indexing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 dcbb23c4a74a923c37a3b059f6a6d89a ${pref}_0
 7b7419dea9e3917c2e27b7a7a35f64ca ${pref}.histo
 7b7419dea9e3917c2e27b7a7a35f64ca ${pref}_S.histo
diff --git a/tests/parallel_fastq_direct_indexing.sh b/tests/parallel_fastq_direct_indexing.sh
index d69aae5..b18b840 100644
--- a/tests/parallel_fastq_direct_indexing.sh
+++ b/tests/parallel_fastq_direct_indexing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 8bfdd1b137b73ebfed05d0496bbddd0c ${pref}.histo
 9418b1a2e05a2526a81ae9b1200ed5df ${pref}_Q.histo
 768e261fc7d7ede192f4a0eeae6e839f ${pref}_LU.histo
diff --git a/tests/parallel_fastq_hashing.sh b/tests/parallel_fastq_hashing.sh
index e01b6fd..d069acf 100644
--- a/tests/parallel_fastq_hashing.sh
+++ b/tests/parallel_fastq_hashing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 c448e173e5e18264ed00fad0008d5340 ${pref}.histo
 554c9c76fb1f54f2c7526dd1af5aa252 ${pref}_lines.dump
 174c7b3873c8aaa5ffee36d5d405bbce ${pref}.stats
diff --git a/tests/parallel_fastq_sequence_hashing.sh b/tests/parallel_fastq_sequence_hashing.sh
index ed37a4c..0b1f838 100644
--- a/tests/parallel_fastq_sequence_hashing.sh
+++ b/tests/parallel_fastq_sequence_hashing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 8a0fe8ee1293f341fbde69e670beb74c ${pref}.histo
 EOF
 echo "Counting 22-mers, fastq format, no quality, on ${nCPUs} CPU" && \
diff --git a/tests/parallel_hashing.sh b/tests/parallel_hashing.sh
index 6ff008f..6d3ab20 100755
--- a/tests/parallel_hashing.sh
+++ b/tests/parallel_hashing.sh
@@ -3,39 +3,80 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF 
-4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
-7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
-c3233e107bb6b42d0c979707f156264c ${pref}.query
-dbe881e4649406321d0e481da08eab5c ${pref}_L.dump
-dbe881e4649406321d0e481da08eab5c ${pref}.dump
-dbe881e4649406321d0e481da08eab5c ${pref}_stream.dump
-77054a9564aaf59fb330dfa6af92b428 ${pref}_all.dump
-77054a9564aaf59fb330dfa6af92b428 ${pref}_S_all.dump
-a210906960cf36c09eecad62a4c04973 ${pref}.stats
+sort -k2,2 > ${pref}.md5sum <<EOF 
+864c0b0826854bdc72a85d170549b64b ${pref}_m15_s2M.histo
+864c0b0826854bdc72a85d170549b64b ${pref}_m15_s16M.histo
+41fd8408dde0ea14bec7425b1a877140 ${pref}_m15.stats
+376761a6e273b57b3428c14e3b536edf ${pref}_binary.dump
+376761a6e273b57b3428c14e3b536edf ${pref}_text.dump
+9251799dd5dbd3f617124aa2ff72112a ${pref}_binary.histo
+c30cba4fe2886cea4abb27f5c30ea35e ${pref}_binary.stats
+9251799dd5dbd3f617124aa2ff72112a ${pref}_text.histo
+c30cba4fe2886cea4abb27f5c30ea35e ${pref}_text.stats
+94625cd2d59e278f08421a673eb0926a ${pref}_m15_s2M_L2_U3.histo
+94625cd2d59e278f08421a673eb0926a ${pref}_m15_s2M_L2_U3_automerge.histo
+45fb383344e0fb0b7540718339be4c03 ${pref}_query_one_count
 EOF
-echo "Counting 22-mers on ${nCPUs} CPU"
+
+# Count with in memory hash doubling
+$JF count -t $nCPUs -o ${pref}_m15_s2M.jf -s 2M -C -m 15 seq10m.fa
+$JF histo ${pref}_m15_s2M.jf > ${pref}_m15_s2M.histo
+$JF stats ${pref}_m15_s2M.jf > ${pref}_m15.stats
+
+# Count without size doubling
+$JF count -t $nCPUs -o ${pref}_m15_s16M.jf -s 16M -C -m 15 seq10m.fa
+$JF histo ${pref}_m15_s16M.jf > ${pref}_m15_s16M.histo
+
+# Count large merges in binary and text. Should agree
+$JF count -m 40 -t $nCPUs -o ${pref}_text.jf -s 2M --text seq1m_0.fa
+$JF count -m 40 -t $nCPUs -o ${pref}_binary.jf -s 2M seq1m_0.fa
+$JF histo ${pref}_text.jf > ${pref}_text.histo
+$JF stats ${pref}_text.jf > ${pref}_text.stats
+$JF histo ${pref}_binary.jf > ${pref}_binary.histo
+$JF stats ${pref}_binary.jf > ${pref}_binary.stats
+$JF dump -c ${pref}_text.jf | sort > ${pref}_text.dump
+$JF dump -c ${pref}_binary.jf | sort > ${pref}_binary.dump
+
+# Check the lower and upper count without merging
+$JF count -t $nCPUs -o ${pref}_m15_s2M_L2_U3.jf -s 2M -C -m 15 -L2 -U3 seq10m.fa
+$JF histo ${pref}_m15_s2M_L2_U3.jf > ${pref}_m15_s2M_L2_U3.histo
+
+# Check the lower and upper count limits with merging
+$JF count -t $nCPUs -o ${pref}_m15_s2M_L2_U3_automerge.jf -s 2M -C -m 15 -L2 -U3 --disk seq10m.fa
+$JF histo ${pref}_m15_s2M_L2_U3_automerge.jf > ${pref}_m15_s2M_L2_U3_automerge.histo
+
+# Check query
+$JF query ${pref}_binary.jf -s seq1m_0.fa    | grep ' 1$' | wc -l | sed -e 's/ //g' > ${pref}_query_one_count
+# $JF query ${pref}_binary.jf -s seq1m_0.fa -C | grep ' 1$' | wc -l | sed -e 's/ //g' > ${pref}_query_canonical_one_count
+
+# $JF count -m 40 -t $nCPUs -o ${pref}_text -s 2M --text seq1m_0.fa
+# $JF info -s ${pref}_text0 | sort >  ${pref}_text0_dump
+
+# $JF count -m 40 -t $nCPUs -o ${pref}_bin -s 2M seq1m_0.fa
+# $JF dump -c ${pref}_bin0 | sort > ${pref}_bin0_dump
+
+# $JF histo ${pref}_bin0 > ${pref}.histo
 
 # Count all k-mers
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o $pref \
-    -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa
-# Output only counts >= 2
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o ${pref}_L \
-    -s 10000000 --timing ${pref}.timing -L 2 seq10m.fa
-# Stream output
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o /dev/fd/1 -O \
-    -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa | \
-    cat > ${pref}_S
-
-$JF histo -f ${pref}_0 > ${pref}.histo
-$JF dump -c ${pref}_L_0 > ${pref}_L.dump
-$JF dump -c -L 2 ${pref}_0 > ${pref}.dump
-cat ${pref}_0 | $JF dump -c -L 2 /dev/fd/0 > ${pref}_stream.dump
-echo "GCCATTTCGATTAAAGAATGAT TAGGCATGCAACGCTTCCCTTT" | $JF query ${pref}_0 > ${pref}.query
-$JF dump -c ${pref}_0 > ${pref}_all.dump
-$JF dump -c ${pref}_S > ${pref}_S_all.dump
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o $pref \
+#     -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa
+# # Output only counts >= 2
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o ${pref}_L \
+#     -s 10000000 --timing ${pref}.timing -L 2 seq10m.fa
+# # Stream output
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o /dev/fd/1 -O \
+#     -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa | \
+#     cat > ${pref}_S
+
+# $JF histo -f ${pref}_0 > ${pref}.histo
+# $JF dump -c ${pref}_L_0 > ${pref}_L.dump
+# $JF dump -c -L 2 ${pref}_0 > ${pref}.dump
+# cat ${pref}_0 | $JF dump -c -L 2 /dev/fd/0 > ${pref}_stream.dump
+# echo "GCCATTTCGATTAAAGAATGAT TAGGCATGCAACGCTTCCCTTT" | $JF query ${pref}_0 > ${pref}.query
+# $JF dump -c ${pref}_0 > ${pref}_all.dump
+# $JF dump -c ${pref}_S > ${pref}_S_all.dump
 
 check ${pref}.md5sum
 
-cat ${pref}.timing
+# cat ${pref}.timing
 
diff --git a/tests/parsers.sh b/tests/parsers.sh
index f41dbc6..043845a 100644
--- a/tests/parsers.sh
+++ b/tests/parsers.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF 
+sort -k2,2 > ${pref}.md5sum <<EOF 
 EOF
 
 echo "Test double fifo" &&
diff --git a/tests/quality_filter.sh b/tests/quality_filter.sh
new file mode 100644
index 0000000..3144eb3
--- /dev/null
+++ b/tests/quality_filter.sh
@@ -0,0 +1,25 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+46c5d23c3560cf908fea997fff8abc1c ${pref}.histo
+46c5d23c3560cf908fea997fff8abc1c ${pref}_q at .histo
+d41d8cd98f00b204e9800998ecf8427e ${pref}_qi.histo
+4faa0517f41d7dc808ec0b930fe0d88e ${pref}_qC.histo
+EOF
+
+count_histo () {
+    PREFIX=$1
+    shift
+    $JF count -t $nCPUs -o $PREFIX.jf -s 10M -C -m 15 seq10m.fq "$@"
+    $JF histo $PREFIX.jf > $PREFIX.histo
+}
+
+count_histo ${pref}
+count_histo ${pref}_q@ -Q '@'
+count_histo ${pref}_qi -Q 'i'
+count_histo ${pref}_qC -Q 'C'
+
+check ${pref}.md5sum
diff --git a/tests/raw_hash.sh b/tests/raw_hash.sh
index d93e18c..0a1e4b8 100644
--- a/tests/raw_hash.sh
+++ b/tests/raw_hash.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 5c5d07dfb4e3de89b7fe4c72c714b921 ${pref}.stats
 dbe881e4649406321d0e481da08eab5c ${pref}_L.dump
 c3233e107bb6b42d0c979707f156264c ${pref}.query
diff --git a/tests/serial_direct_indexing.sh b/tests/serial_direct_indexing.sh
index d813a16..b67230a 100755
--- a/tests/serial_direct_indexing.sh
+++ b/tests/serial_direct_indexing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 dcbb23c4a74a923c37a3b059f6a6d89a ${pref}_0
 EOF
 echo "Counting 10-mers on 1 CPU" && \
diff --git a/tests/serial_hashing.sh b/tests/serial_hashing.sh
index fc35d92..6eabf7f 100755
--- a/tests/serial_hashing.sh
+++ b/tests/serial_hashing.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
 7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
 EOF
diff --git a/tests/small.sh b/tests/small.sh
index 28bea2a..b4dc487 100755
--- a/tests/small.sh
+++ b/tests/small.sh
@@ -3,7 +3,7 @@
 cd tests
 . ./compat.sh
 
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
 bbceae352707eaa945ce2057137f3a7a ${pref}.histo
 c697577f78593fef303b5fcaad86e336 ${pref}.stats
 EOF
diff --git a/tests/subset_hashing.sh b/tests/subset_hashing.sh
new file mode 100644
index 0000000..092d4a8
--- /dev/null
+++ b/tests/subset_hashing.sh
@@ -0,0 +1,19 @@
+#! /bin/sh
+
+cd tests/
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+bd7a5f6ba000b282cd79cb9f342e7ede ${pref}_m35_s2M_if.histo
+8eb6d4a50aeba178e4847c2da71dbb70 ${pref}_m10_s2M_if.histo
+EOF
+
+# Partial count (in _0 and _2) with 35-mers
+$JF count -t $nCPUs -o ${pref}_m35_s2M_if.jf -s 2M -C -m 35 --if seq1m_0.fa --if seq1m_2.fa seq1m_1.fa seq1m_0.fa seq1m_3.fa seq1m_2.fa
+$JF histo ${pref}_m35_s2M_if.jf > ${pref}_m35_s2M_if.histo
+
+# Idem with 10-mers
+$JF count -t $nCPUs -o ${pref}_m10_s2M_if.jf -s 6M -C -m 10 --if seq1m_0.fa --if seq1m_2.fa seq1m_1.fa seq1m_0.fa seq1m_3.fa seq1m_2.fa
+$JF histo ${pref}_m10_s2M_if.jf > ${pref}_m10_s2M_if.histo
+
+check ${pref}.md5sum
diff --git a/unit_tests/Makefile b/unit_tests/Makefile
new file mode 100644
index 0000000..7906558
--- /dev/null
+++ b/unit_tests/Makefile
@@ -0,0 +1,82 @@
+# SYNOPSIS:
+#
+#   make [all]  - makes everything.
+#   make TARGET - makes the given target.
+#   make clean  - removes all files generated by make.
+
+# Points to the root of Google Test, relative to where this file is.
+# Remember to tweak this if you move this file.
+GTEST_DIR = gtest-1.4.0
+
+# Where to find user code.
+UPDIR = $(realpath ..)
+USER_DIR = $(UPDIR)
+
+VPATH = $(USER_DIR)
+
+CC = g++
+# Flags passed to the preprocessor.
+CPPFLAGS += -I. -I$(GTEST_DIR) -I$(GTEST_DIR)/include $(patsubst %,-I%,$(USER_DIR)) -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -DHAVE_SSE
+
+# Flags passed to the C++ compiler.
+# For profiling -fprofile-arcs -ftest-coverage -O0
+# TODO: remove lax-vector-conversions
+CXXFLAGS += -g -Wall -Wextra -Werror -DSSE -march=native -msse -msse2 -O3
+
+LDFLAGS = -lpthread -lrt -lm
+
+# All tests produced by this Makefile.  Remember to add new tests you
+# created to the list.
+#TESTS = test_large_block test_mutex test_cond test_packed_key_value_array test_square_binary_matrix test_misc test_offsets_key_value
+TESTS = test_offsets_key_value
+SOURCES = $(patsubst %,%.cc,$(TESTS))
+
+# All Google Test headers.  Usually you shouldn't change this
+# definition.
+GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
+                $(GTEST_DIR)/include/gtest/internal/*.h
+
+# House-keeping build targets.
+
+%.d: %.cc
+	$(CC) -M -MM -MG -MP $(CPPFLAGS) $< > $@.tmp
+	sed -e 's/$*.o/& $@/g' $@.tmp > $@ && rm $@.tmp
+
+all : $(TESTS)
+
+run: all
+	@for i in $(TESTS); do ./$$i; done
+
+clean :
+	rm -f $(TESTS) gtest.a gtest_main.a *.o
+
+$(TESTS): gtest_main.a
+
+# Some extra dependencies
+test_packed_key_value_array: storage.o
+
+test_square_binary_matrix: square_binary_matrix.o
+
+# Builds gtest.a and gtest_main.a.
+
+# Usually you shouldn't tweak such internal variables, indicated by a
+# trailing _.
+GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
+
+# For simplicity and to avoid depending on Google Test's
+# implementation details, the dependencies specified below are
+# conservative and not optimized.  This is fine as Google Test
+# compiles fast and for ordinary users its source rarely changes.
+gtest-all.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest-all.cc
+
+gtest_main.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest_main.cc
+
+gtest.a : gtest-all.o
+	$(AR) $(ARFLAGS) $@ $^
+
+gtest_main.a : gtest-all.o gtest_main.o
+	$(AR) $(ARFLAGS) $@ $^
+
+include $(SOURCES:.cc=.d)
diff --git a/unit_tests/gtest/gtest.h b/unit_tests/gtest/gtest.h
new file mode 100644
index 0000000..4f3804f
--- /dev/null
+++ b/unit_tests/gtest/gtest.h
@@ -0,0 +1,20061 @@
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-death-test.h b/unit_tests/gtest/include/gtest/gtest-death-test.h
deleted file mode 100644
index a27883f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-death-test.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for death tests.  It is
-// #included by gtest.h so a user doesn't need to include this
-// directly.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-
-#include "gtest/internal/gtest-death-test-internal.h"
-
-namespace testing {
-
-// This flag controls the style of death tests.  Valid values are "threadsafe",
-// meaning that the death test child process will re-execute the test binary
-// from the start, running only a single death test, or "fast",
-// meaning that the child process will execute the test logic immediately
-// after forking.
-GTEST_DECLARE_string_(death_test_style);
-
-#if GTEST_HAS_DEATH_TEST
-
-// The following macros are useful for writing death tests.
-
-// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
-// executed:
-//
-//   1. It generates a warning if there is more than one active
-//   thread.  This is because it's safe to fork() or clone() only
-//   when there is a single thread.
-//
-//   2. The parent process clone()s a sub-process and runs the death
-//   test in it; the sub-process exits with code 0 at the end of the
-//   death test, if it hasn't exited already.
-//
-//   3. The parent process waits for the sub-process to terminate.
-//
-//   4. The parent process checks the exit code and error message of
-//   the sub-process.
-//
-// Examples:
-//
-//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
-//   for (int i = 0; i < 5; i++) {
-//     EXPECT_DEATH(server.ProcessRequest(i),
-//                  "Invalid request .* in ProcessRequest()")
-//         << "Failed to die on request " << i);
-//   }
-//
-//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
-//
-//   bool KilledBySIGHUP(int exit_code) {
-//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
-//   }
-//
-//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
-//
-// On the regular expressions used in death tests:
-//
-//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
-//   which uses the POSIX extended regex syntax.
-//
-//   On other platforms (e.g. Windows), we only support a simple regex
-//   syntax implemented as part of Google Test.  This limited
-//   implementation should be enough most of the time when writing
-//   death tests; though it lacks many features you can find in PCRE
-//   or POSIX extended regex syntax.  For example, we don't support
-//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
-//   repetition count ("x{5,7}"), among others.
-//
-//   Below is the syntax that we do support.  We chose it to be a
-//   subset of both PCRE and POSIX extended regex, so it's easy to
-//   learn wherever you come from.  In the following: 'A' denotes a
-//   literal character, period (.), or a single \\ escape sequence;
-//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
-//   natural numbers.
-//
-//     c     matches any literal character c
-//     \\d   matches any decimal digit
-//     \\D   matches any character that's not a decimal digit
-//     \\f   matches \f
-//     \\n   matches \n
-//     \\r   matches \r
-//     \\s   matches any ASCII whitespace, including \n
-//     \\S   matches any character that's not a whitespace
-//     \\t   matches \t
-//     \\v   matches \v
-//     \\w   matches any letter, _, or decimal digit
-//     \\W   matches any character that \\w doesn't match
-//     \\c   matches any literal character c, which must be a punctuation
-//     .     matches any single character except \n
-//     A?    matches 0 or 1 occurrences of A
-//     A*    matches 0 or many occurrences of A
-//     A+    matches 1 or many occurrences of A
-//     ^     matches the beginning of a string (not that of each line)
-//     $     matches the end of a string (not that of each line)
-//     xy    matches x followed by y
-//
-//   If you accidentally use PCRE or POSIX extended regex features
-//   not implemented by us, you will get a run-time failure.  In that
-//   case, please try to rewrite your regular expression within the
-//   above syntax.
-//
-//   This implementation is *not* meant to be as highly tuned or robust
-//   as a compiled regex library, but should perform well enough for a
-//   death test, which already incurs significant overhead by launching
-//   a child process.
-//
-// Known caveats:
-//
-//   A "threadsafe" style death test obtains the path to the test
-//   program from argv[0] and re-executes it in the sub-process.  For
-//   simplicity, the current implementation doesn't search the PATH
-//   when launching the sub-process.  This means that the user must
-//   invoke the test program via a path that contains at least one
-//   path separator (e.g. path/to/foo_test and
-//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
-//   is rarely a problem as people usually don't put the test binary
-//   directory in PATH.
-//
-// TODO(wan at google.com): make thread-safe death tests search the PATH.
-
-// Asserts that a given statement causes the program to exit, with an
-// integer exit status that satisfies predicate, and emitting error output
-// that matches regex.
-# define ASSERT_EXIT(statement, predicate, regex) \
-    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
-
-// Like ASSERT_EXIT, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_EXIT(statement, predicate, regex) \
-    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
-
-// Asserts that a given statement causes the program to exit, either by
-// explicitly exiting with a nonzero exit code or being killed by a
-// signal, and emitting error output that matches regex.
-# define ASSERT_DEATH(statement, regex) \
-    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Like ASSERT_DEATH, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_DEATH(statement, regex) \
-    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
-
-// Tests that an exit code describes a normal exit with a given exit code.
-class GTEST_API_ ExitedWithCode {
- public:
-  explicit ExitedWithCode(int exit_code);
-  bool operator()(int exit_status) const;
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ExitedWithCode& other);
-
-  const int exit_code_;
-};
-
-# if !GTEST_OS_WINDOWS
-// Tests that an exit code describes an exit due to termination by a
-// given signal.
-class GTEST_API_ KilledBySignal {
- public:
-  explicit KilledBySignal(int signum);
-  bool operator()(int exit_status) const;
- private:
-  const int signum_;
-};
-# endif  // !GTEST_OS_WINDOWS
-
-// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
-// The death testing framework causes this to have interesting semantics,
-// since the sideeffects of the call are only visible in opt mode, and not
-// in debug mode.
-//
-// In practice, this can be used to test functions that utilize the
-// LOG(DFATAL) macro using the following style:
-//
-// int DieInDebugOr12(int* sideeffect) {
-//   if (sideeffect) {
-//     *sideeffect = 12;
-//   }
-//   LOG(DFATAL) << "death";
-//   return 12;
-// }
-//
-// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
-//   int sideeffect = 0;
-//   // Only asserts in dbg.
-//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
-//
-// #ifdef NDEBUG
-//   // opt-mode has sideeffect visible.
-//   EXPECT_EQ(12, sideeffect);
-// #else
-//   // dbg-mode no visible sideeffect.
-//   EXPECT_EQ(0, sideeffect);
-// #endif
-// }
-//
-// This will assert that DieInDebugReturn12InOpt() crashes in debug
-// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
-// appropriate fallback value (12 in this case) in opt mode. If you
-// need to test that a function has appropriate side-effects in opt
-// mode, include assertions against the side-effects.  A general
-// pattern for this is:
-//
-// EXPECT_DEBUG_DEATH({
-//   // Side-effects here will have an effect after this statement in
-//   // opt mode, but none in debug mode.
-//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
-// }, "death");
-//
-# ifdef NDEBUG
-
-#  define EXPECT_DEBUG_DEATH(statement, regex) \
-  do { statement; } while (::testing::internal::AlwaysFalse())
-
-#  define ASSERT_DEBUG_DEATH(statement, regex) \
-  do { statement; } while (::testing::internal::AlwaysFalse())
-
-# else
-
-#  define EXPECT_DEBUG_DEATH(statement, regex) \
-  EXPECT_DEATH(statement, regex)
-
-#  define ASSERT_DEBUG_DEATH(statement, regex) \
-  ASSERT_DEATH(statement, regex)
-
-# endif  // NDEBUG for EXPECT_DEBUG_DEATH
-#endif  // GTEST_HAS_DEATH_TEST
-
-// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
-// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
-// death tests are supported; otherwise they just issue a warning.  This is
-// useful when you are combining death test assertions with normal test
-// assertions in one test.
-#if GTEST_HAS_DEATH_TEST
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
-    EXPECT_DEATH(statement, regex)
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
-    ASSERT_DEATH(statement, regex)
-#else
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
-    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
-    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
-#endif
-
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-message.h b/unit_tests/gtest/include/gtest/gtest-message.h
deleted file mode 100644
index 9b7142f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-message.h
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the Message class.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
-// program!
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-
-#include <limits>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// The Message class works like an ostream repeater.
-//
-// Typical usage:
-//
-//   1. You stream a bunch of values to a Message object.
-//      It will remember the text in a stringstream.
-//   2. Then you stream the Message object to an ostream.
-//      This causes the text in the Message to be streamed
-//      to the ostream.
-//
-// For example;
-//
-//   testing::Message foo;
-//   foo << 1 << " != " << 2;
-//   std::cout << foo;
-//
-// will print "1 != 2".
-//
-// Message is not intended to be inherited from.  In particular, its
-// destructor is not virtual.
-//
-// Note that stringstream behaves differently in gcc and in MSVC.  You
-// can stream a NULL char pointer to it in the former, but not in the
-// latter (it causes an access violation if you do).  The Message
-// class hides this difference by treating a NULL char pointer as
-// "(null)".
-class GTEST_API_ Message {
- private:
-  // The type of basic IO manipulators (endl, ends, and flush) for
-  // narrow streams.
-  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
-
- public:
-  // Constructs an empty Message.
-  // We allocate the stringstream separately because otherwise each use of
-  // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
-  // stack frame leading to huge stack frames in some cases; gcc does not reuse
-  // the stack space.
-  Message() : ss_(new ::std::stringstream) {
-    // By default, we want there to be enough precision when printing
-    // a double to a Message.
-    *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
-  }
-
-  // Copy constructor.
-  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
-    *ss_ << msg.GetString();
-  }
-
-  // Constructs a Message from a C-string.
-  explicit Message(const char* str) : ss_(new ::std::stringstream) {
-    *ss_ << str;
-  }
-
-#if GTEST_OS_SYMBIAN
-  // Streams a value (either a pointer or not) to this object.
-  template <typename T>
-  inline Message& operator <<(const T& value) {
-    StreamHelper(typename internal::is_pointer<T>::type(), value);
-    return *this;
-  }
-#else
-  // Streams a non-pointer value to this object.
-  template <typename T>
-  inline Message& operator <<(const T& val) {
-    ::GTestStreamToHelper(ss_.get(), val);
-    return *this;
-  }
-
-  // Streams a pointer value to this object.
-  //
-  // This function is an overload of the previous one.  When you
-  // stream a pointer to a Message, this definition will be used as it
-  // is more specialized.  (The C++ Standard, section
-  // [temp.func.order].)  If you stream a non-pointer, then the
-  // previous definition will be used.
-  //
-  // The reason for this overload is that streaming a NULL pointer to
-  // ostream is undefined behavior.  Depending on the compiler, you
-  // may get "0", "(nil)", "(null)", or an access violation.  To
-  // ensure consistent result across compilers, we always treat NULL
-  // as "(null)".
-  template <typename T>
-  inline Message& operator <<(T* const& pointer) {  // NOLINT
-    if (pointer == NULL) {
-      *ss_ << "(null)";
-    } else {
-      ::GTestStreamToHelper(ss_.get(), pointer);
-    }
-    return *this;
-  }
-#endif  // GTEST_OS_SYMBIAN
-
-  // Since the basic IO manipulators are overloaded for both narrow
-  // and wide streams, we have to provide this specialized definition
-  // of operator <<, even though its body is the same as the
-  // templatized version above.  Without this definition, streaming
-  // endl or other basic IO manipulators to Message will confuse the
-  // compiler.
-  Message& operator <<(BasicNarrowIoManip val) {
-    *ss_ << val;
-    return *this;
-  }
-
-  // Instead of 1/0, we want to see true/false for bool values.
-  Message& operator <<(bool b) {
-    return *this << (b ? "true" : "false");
-  }
-
-  // These two overloads allow streaming a wide C string to a Message
-  // using the UTF-8 encoding.
-  Message& operator <<(const wchar_t* wide_c_str) {
-    return *this << internal::String::ShowWideCString(wide_c_str);
-  }
-  Message& operator <<(wchar_t* wide_c_str) {
-    return *this << internal::String::ShowWideCString(wide_c_str);
-  }
-
-#if GTEST_HAS_STD_WSTRING
-  // Converts the given wide string to a narrow string using the UTF-8
-  // encoding, and streams the result to this Message object.
-  Message& operator <<(const ::std::wstring& wstr);
-#endif  // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-  // Converts the given wide string to a narrow string using the UTF-8
-  // encoding, and streams the result to this Message object.
-  Message& operator <<(const ::wstring& wstr);
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-  // Gets the text streamed to this object so far as a String.
-  // Each '\0' character in the buffer is replaced with "\\0".
-  //
-  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-  internal::String GetString() const {
-    return internal::StringStreamToString(ss_.get());
-  }
-
- private:
-
-#if GTEST_OS_SYMBIAN
-  // These are needed as the Nokia Symbian Compiler cannot decide between
-  // const T& and const T* in a function template. The Nokia compiler _can_
-  // decide between class template specializations for T and T*, so a
-  // tr1::type_traits-like is_pointer works, and we can overload on that.
-  template <typename T>
-  inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
-    if (pointer == NULL) {
-      *ss_ << "(null)";
-    } else {
-      ::GTestStreamToHelper(ss_.get(), pointer);
-    }
-  }
-  template <typename T>
-  inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
-    ::GTestStreamToHelper(ss_.get(), value);
-  }
-#endif  // GTEST_OS_SYMBIAN
-
-  // We'll hold the text streamed to this object here.
-  const internal::scoped_ptr< ::std::stringstream> ss_;
-
-  // We declare (but don't implement) this to prevent the compiler
-  // from implementing the assignment operator.
-  void operator=(const Message&);
-};
-
-// Streams a Message to an ostream.
-inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
-  return os << sb.GetString();
-}
-
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-param-test.h b/unit_tests/gtest/include/gtest/gtest-param-test.h
deleted file mode 100644
index 6407cfd..0000000
--- a/unit_tests/gtest/include/gtest/gtest-param-test.h
+++ /dev/null
@@ -1,1421 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py gtest-param-test.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: vladl at google.com (Vlad Losev)
-//
-// Macros and functions for implementing parameterized tests
-// in Google C++ Testing Framework (Google Test)
-//
-// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
-//
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-
-
-// Value-parameterized tests allow you to test your code with different
-// parameters without writing multiple copies of the same test.
-//
-// Here is how you use value-parameterized tests:
-
-#if 0
-
-// To write value-parameterized tests, first you should define a fixture
-// class. It is usually derived from testing::TestWithParam<T> (see below for
-// another inheritance scheme that's sometimes useful in more complicated
-// class hierarchies), where the type of your parameter values.
-// TestWithParam<T> is itself derived from testing::Test. T can be any
-// copyable type. If it's a raw pointer, you are responsible for managing the
-// lifespan of the pointed values.
-
-class FooTest : public ::testing::TestWithParam<const char*> {
-  // You can implement all the usual class fixture members here.
-};
-
-// Then, use the TEST_P macro to define as many parameterized tests
-// for this fixture as you want. The _P suffix is for "parameterized"
-// or "pattern", whichever you prefer to think.
-
-TEST_P(FooTest, DoesBlah) {
-  // Inside a test, access the test parameter with the GetParam() method
-  // of the TestWithParam<T> class:
-  EXPECT_TRUE(foo.Blah(GetParam()));
-  ...
-}
-
-TEST_P(FooTest, HasBlahBlah) {
-  ...
-}
-
-// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
-// case with any set of parameters you want. Google Test defines a number
-// of functions for generating test parameters. They return what we call
-// (surprise!) parameter generators. Here is a  summary of them, which
-// are all in the testing namespace:
-//
-//
-//  Range(begin, end [, step]) - Yields values {begin, begin+step,
-//                               begin+step+step, ...}. The values do not
-//                               include end. step defaults to 1.
-//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
-//  ValuesIn(container)        - Yields values from a C-style array, an STL
-//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
-//  Bool()                     - Yields sequence {false, true}.
-//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
-//                               for the math savvy) of the values generated
-//                               by the N generators.
-//
-// For more details, see comments at the definitions of these functions below
-// in this file.
-//
-// The following statement will instantiate tests from the FooTest test case
-// each with parameter values "meeny", "miny", and "moe".
-
-INSTANTIATE_TEST_CASE_P(InstantiationName,
-                        FooTest,
-                        Values("meeny", "miny", "moe"));
-
-// To distinguish different instances of the pattern, (yes, you
-// can instantiate it more then once) the first argument to the
-// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
-// actual test case name. Remember to pick unique prefixes for different
-// instantiations. The tests from the instantiation above will have
-// these names:
-//
-//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
-//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
-//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
-//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
-//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
-//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
-//
-// You can use these names in --gtest_filter.
-//
-// This statement will instantiate all tests from FooTest again, each
-// with parameter values "cat" and "dog":
-
-const char* pets[] = {"cat", "dog"};
-INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
-
-// The tests from the instantiation above will have these names:
-//
-//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
-//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
-//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
-//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
-//
-// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
-// in the given test case, whether their definitions come before or
-// AFTER the INSTANTIATE_TEST_CASE_P statement.
-//
-// Please also note that generator expressions (including parameters to the
-// generators) are evaluated in InitGoogleTest(), after main() has started.
-// This allows the user on one hand, to adjust generator parameters in order
-// to dynamically determine a set of tests to run and on the other hand,
-// give the user a chance to inspect the generated tests with Google Test
-// reflection API before RUN_ALL_TESTS() is executed.
-//
-// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
-// for more examples.
-//
-// In the future, we plan to publish the API for defining new parameter
-// generators. But for now this interface remains part of the internal
-// implementation and is subject to change.
-//
-//
-// A parameterized test fixture must be derived from testing::Test and from
-// testing::WithParamInterface<T>, where T is the type of the parameter
-// values. Inheriting from TestWithParam<T> satisfies that requirement because
-// TestWithParam<T> inherits from both Test and WithParamInterface. In more
-// complicated hierarchies, however, it is occasionally useful to inherit
-// separately from Test and WithParamInterface. For example:
-
-class BaseTest : public ::testing::Test {
-  // You can inherit all the usual members for a non-parameterized test
-  // fixture here.
-};
-
-class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
-  // The usual test fixture members go here too.
-};
-
-TEST_F(BaseTest, HasFoo) {
-  // This is an ordinary non-parameterized test.
-}
-
-TEST_P(DerivedTest, DoesBlah) {
-  // GetParam works just the same here as if you inherit from TestWithParam.
-  EXPECT_TRUE(foo.Blah(GetParam()));
-}
-
-#endif  // 0
-
-#include "gtest/internal/gtest-port.h"
-
-#if !GTEST_OS_SYMBIAN
-# include <utility>
-#endif
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*.  Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-param-util-generated.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Functions producing parameter generators.
-//
-// Google Test uses these generators to produce parameters for value-
-// parameterized tests. When a parameterized test case is instantiated
-// with a particular generator, Google Test creates and runs tests
-// for each element in the sequence produced by the generator.
-//
-// In the following sample, tests from test case FooTest are instantiated
-// each three times with parameter values 3, 5, and 8:
-//
-// class FooTest : public TestWithParam<int> { ... };
-//
-// TEST_P(FooTest, TestThis) {
-// }
-// TEST_P(FooTest, TestThat) {
-// }
-// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
-//
-
-// Range() returns generators providing sequences of values in a range.
-//
-// Synopsis:
-// Range(start, end)
-//   - returns a generator producing a sequence of values {start, start+1,
-//     start+2, ..., }.
-// Range(start, end, step)
-//   - returns a generator producing a sequence of values {start, start+step,
-//     start+step+step, ..., }.
-// Notes:
-//   * The generated sequences never include end. For example, Range(1, 5)
-//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
-//     returns a generator producing {1, 3, 5, 7}.
-//   * start and end must have the same type. That type may be any integral or
-//     floating-point type or a user defined type satisfying these conditions:
-//     * It must be assignable (have operator=() defined).
-//     * It must have operator+() (operator+(int-compatible type) for
-//       two-operand version).
-//     * It must have operator<() defined.
-//     Elements in the resulting sequences will also have that type.
-//   * Condition start < end must be satisfied in order for resulting sequences
-//     to contain any elements.
-//
-template <typename T, typename IncrementT>
-internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
-  return internal::ParamGenerator<T>(
-      new internal::RangeGenerator<T, IncrementT>(start, end, step));
-}
-
-template <typename T>
-internal::ParamGenerator<T> Range(T start, T end) {
-  return Range(start, end, 1);
-}
-
-// ValuesIn() function allows generation of tests with parameters coming from
-// a container.
-//
-// Synopsis:
-// ValuesIn(const T (&array)[N])
-//   - returns a generator producing sequences with elements from
-//     a C-style array.
-// ValuesIn(const Container& container)
-//   - returns a generator producing sequences with elements from
-//     an STL-style container.
-// ValuesIn(Iterator begin, Iterator end)
-//   - returns a generator producing sequences with elements from
-//     a range [begin, end) defined by a pair of STL-style iterators. These
-//     iterators can also be plain C pointers.
-//
-// Please note that ValuesIn copies the values from the containers
-// passed in and keeps them to generate tests in RUN_ALL_TESTS().
-//
-// Examples:
-//
-// This instantiates tests from test case StringTest
-// each with C-string values of "foo", "bar", and "baz":
-//
-// const char* strings[] = {"foo", "bar", "baz"};
-// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
-//
-// This instantiates tests from test case StlStringTest
-// each with STL strings with values "a" and "b":
-//
-// ::std::vector< ::std::string> GetParameterStrings() {
-//   ::std::vector< ::std::string> v;
-//   v.push_back("a");
-//   v.push_back("b");
-//   return v;
-// }
-//
-// INSTANTIATE_TEST_CASE_P(CharSequence,
-//                         StlStringTest,
-//                         ValuesIn(GetParameterStrings()));
-//
-//
-// This will also instantiate tests from CharTest
-// each with parameter values 'a' and 'b':
-//
-// ::std::list<char> GetParameterChars() {
-//   ::std::list<char> list;
-//   list.push_back('a');
-//   list.push_back('b');
-//   return list;
-// }
-// ::std::list<char> l = GetParameterChars();
-// INSTANTIATE_TEST_CASE_P(CharSequence2,
-//                         CharTest,
-//                         ValuesIn(l.begin(), l.end()));
-//
-template <typename ForwardIterator>
-internal::ParamGenerator<
-  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end) {
-  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
-      ::value_type ParamType;
-  return internal::ParamGenerator<ParamType>(
-      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
-}
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
-  return ValuesIn(array, array + N);
-}
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
-    const Container& container) {
-  return ValuesIn(container.begin(), container.end());
-}
-
-// Values() allows generating tests from explicitly specified list of
-// parameters.
-//
-// Synopsis:
-// Values(T v1, T v2, ..., T vN)
-//   - returns a generator producing sequences with elements v1, v2, ..., vN.
-//
-// For example, this instantiates tests from test case BarTest each
-// with values "one", "two", and "three":
-//
-// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
-//
-// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
-// The exact type of values will depend on the type of parameter in BazTest.
-//
-// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
-//
-// Currently, Values() supports from 1 to 50 parameters.
-//
-template <typename T1>
-internal::ValueArray1<T1> Values(T1 v1) {
-  return internal::ValueArray1<T1>(v1);
-}
-
-template <typename T1, typename T2>
-internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
-  return internal::ValueArray2<T1, T2>(v1, v2);
-}
-
-template <typename T1, typename T2, typename T3>
-internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
-  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
-  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5) {
-  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6>
-internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
-    T4 v4, T5 v5, T6 v6) {
-  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7>
-internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
-    T4 v4, T5 v5, T6 v6, T7 v7) {
-  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
-      v6, v7);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8>
-internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
-  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
-      v5, v6, v7, v8);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9>
-internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
-  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
-      v4, v5, v6, v7, v8, v9);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10>
-internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
-  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
-      v2, v3, v4, v5, v6, v7, v8, v9, v10);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11>
-internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
-    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11) {
-  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
-      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12>
-internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12) {
-  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13>
-internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13) {
-  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14>
-internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
-  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
-      v14);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15>
-internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
-  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
-      v13, v14, v15);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16>
-internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16) {
-  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
-      v12, v13, v14, v15, v16);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17>
-internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17) {
-  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
-      v11, v12, v13, v14, v15, v16, v17);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18>
-internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18) {
-  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
-      v10, v11, v12, v13, v14, v15, v16, v17, v18);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19>
-internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
-  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20>
-internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
-  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21>
-internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
-  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22>
-internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
-    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22) {
-  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
-      v20, v21, v22);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23>
-internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22, T23 v23) {
-  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
-      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
-      v20, v21, v22, v23);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24>
-internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22, T23 v23, T24 v24) {
-  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
-      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
-      v19, v20, v21, v22, v23, v24);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25>
-internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
-    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
-    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
-  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
-      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
-      v18, v19, v20, v21, v22, v23, v24, v25);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26>
-internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26) {
-  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
-      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27>
-internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27) {
-  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
-      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28>
-internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28) {
-  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
-      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
-      v28);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29>
-internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28, T29 v29) {
-  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
-      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
-      v27, v28, v29);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30>
-internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
-    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
-    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
-  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
-      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
-      v26, v27, v28, v29, v30);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31>
-internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
-  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
-      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
-      v25, v26, v27, v28, v29, v30, v31);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32>
-internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
-    T32 v32) {
-  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
-      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
-      v24, v25, v26, v27, v28, v29, v30, v31, v32);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33>
-internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
-    T32 v32, T33 v33) {
-  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34>
-internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
-    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
-    T31 v31, T32 v32, T33 v33, T34 v34) {
-  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
-      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35>
-internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
-  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
-      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36>
-internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
-  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
-      v34, v35, v36);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37>
-internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
-    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
-    T37 v37) {
-  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
-      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
-      v34, v35, v36, v37);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38>
-internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
-    T37 v37, T38 v38) {
-  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
-      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
-      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
-      v33, v34, v35, v36, v37, v38);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39>
-internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
-    T37 v37, T38 v38, T39 v39) {
-  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
-      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
-      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
-      v32, v33, v34, v35, v36, v37, v38, v39);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40>
-internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
-    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
-    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
-    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
-    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
-  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
-      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
-      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41>
-internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
-  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
-      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
-      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42>
-internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-    T42 v42) {
-  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
-      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
-      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
-      v42);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43>
-internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-    T42 v42, T43 v43) {
-  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
-      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
-      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
-      v41, v42, v43);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44>
-internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-    T42 v42, T43 v43, T44 v44) {
-  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
-      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
-      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
-      v40, v41, v42, v43, v44);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45>
-internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
-    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
-    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
-    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
-    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
-  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
-      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
-      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
-      v39, v40, v41, v42, v43, v44, v45);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46>
-internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
-  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
-      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
-      v38, v39, v40, v41, v42, v43, v44, v45, v46);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47>
-internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
-  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
-      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48>
-internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
-    T48 v48) {
-  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
-      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
-      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49>
-internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
-    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
-    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
-    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
-    T47 v47, T48 v48, T49 v49) {
-  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
-      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
-      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49, typename T50>
-internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
-    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
-    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
-  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
-      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
-      v48, v49, v50);
-}
-
-// Bool() allows generating tests with parameters in a set of (false, true).
-//
-// Synopsis:
-// Bool()
-//   - returns a generator producing sequences with elements {false, true}.
-//
-// It is useful when testing code that depends on Boolean flags. Combinations
-// of multiple flags can be tested when several Bool()'s are combined using
-// Combine() function.
-//
-// In the following example all tests in the test case FlagDependentTest
-// will be instantiated twice with parameters false and true.
-//
-// class FlagDependentTest : public testing::TestWithParam<bool> {
-//   virtual void SetUp() {
-//     external_flag = GetParam();
-//   }
-// }
-// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
-//
-inline internal::ParamGenerator<bool> Bool() {
-  return Values(false, true);
-}
-
-# if GTEST_HAS_COMBINE
-// Combine() allows the user to combine two or more sequences to produce
-// values of a Cartesian product of those sequences' elements.
-//
-// Synopsis:
-// Combine(gen1, gen2, ..., genN)
-//   - returns a generator producing sequences with elements coming from
-//     the Cartesian product of elements from the sequences generated by
-//     gen1, gen2, ..., genN. The sequence elements will have a type of
-//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
-//     of elements from sequences produces by gen1, gen2, ..., genN.
-//
-// Combine can have up to 10 arguments. This number is currently limited
-// by the maximum number of elements in the tuple implementation used by Google
-// Test.
-//
-// Example:
-//
-// This will instantiate tests in test case AnimalTest each one with
-// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
-// tuple("dog", BLACK), and tuple("dog", WHITE):
-//
-// enum Color { BLACK, GRAY, WHITE };
-// class AnimalTest
-//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
-//
-// TEST_P(AnimalTest, AnimalLooksNice) {...}
-//
-// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
-//                         Combine(Values("cat", "dog"),
-//                                 Values(BLACK, WHITE)));
-//
-// This will instantiate tests in FlagDependentTest with all variations of two
-// Boolean flags:
-//
-// class FlagDependentTest
-//     : public testing::TestWithParam<tuple(bool, bool)> > {
-//   virtual void SetUp() {
-//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
-//     tie(external_flag_1, external_flag_2) = GetParam();
-//   }
-// };
-//
-// TEST_P(FlagDependentTest, TestFeature1) {
-//   // Test your code using external_flag_1 and external_flag_2 here.
-// }
-// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
-//                         Combine(Bool(), Bool()));
-//
-template <typename Generator1, typename Generator2>
-internal::CartesianProductHolder2<Generator1, Generator2> Combine(
-    const Generator1& g1, const Generator2& g2) {
-  return internal::CartesianProductHolder2<Generator1, Generator2>(
-      g1, g2);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3>
-internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
-  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
-      g1, g2, g3);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4>
-internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
-    Generator4> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4) {
-  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
-      Generator4>(
-      g1, g2, g3, g4);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5>
-internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
-    Generator4, Generator5> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5) {
-  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
-      Generator4, Generator5>(
-      g1, g2, g3, g4, g5);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5, typename Generator6>
-internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
-    Generator4, Generator5, Generator6> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
-  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
-      Generator4, Generator5, Generator6>(
-      g1, g2, g3, g4, g5, g6);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5, typename Generator6,
-    typename Generator7>
-internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
-    Generator4, Generator5, Generator6, Generator7> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,
-        const Generator7& g7) {
-  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
-      Generator4, Generator5, Generator6, Generator7>(
-      g1, g2, g3, g4, g5, g6, g7);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5, typename Generator6,
-    typename Generator7, typename Generator8>
-internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
-    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,
-        const Generator7& g7, const Generator8& g8) {
-  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
-      Generator4, Generator5, Generator6, Generator7, Generator8>(
-      g1, g2, g3, g4, g5, g6, g7, g8);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5, typename Generator6,
-    typename Generator7, typename Generator8, typename Generator9>
-internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
-    Generator4, Generator5, Generator6, Generator7, Generator8,
-    Generator9> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,
-        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
-  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
-      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
-      g1, g2, g3, g4, g5, g6, g7, g8, g9);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
-    typename Generator4, typename Generator5, typename Generator6,
-    typename Generator7, typename Generator8, typename Generator9,
-    typename Generator10>
-internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
-    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
-    Generator10> Combine(
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,
-        const Generator7& g7, const Generator8& g8, const Generator9& g9,
-        const Generator10& g10) {
-  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
-      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
-      Generator10>(
-      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
-}
-# endif  // GTEST_HAS_COMBINE
-
-
-
-# define TEST_P(test_case_name, test_name) \
-  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
-      : public test_case_name { \
-   public: \
-    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
-    virtual void TestBody(); \
-   private: \
-    static int AddToRegistry() { \
-      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
-          GetTestCasePatternHolder<test_case_name>(\
-              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
-                  #test_case_name, \
-                  #test_name, \
-                  new ::testing::internal::TestMetaFactory< \
-                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
-      return 0; \
-    } \
-    static int gtest_registering_dummy_; \
-    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
-        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
-  }; \
-  int GTEST_TEST_CLASS_NAME_(test_case_name, \
-                             test_name)::gtest_registering_dummy_ = \
-      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
-  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
-  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
-      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
-  int gtest_##prefix##test_case_name##_dummy_ = \
-      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
-          GetTestCasePatternHolder<test_case_name>(\
-              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
-                  #prefix, \
-                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
-                  __FILE__, __LINE__)
-
-}  // namespace testing
-
-#endif  // GTEST_HAS_PARAM_TEST
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-printers.h b/unit_tests/gtest/include/gtest/gtest-printers.h
deleted file mode 100644
index 9cbab3f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-printers.h
+++ /dev/null
@@ -1,796 +0,0 @@
-// Copyright 2007, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// A user can teach this function how to print a class type T by
-// defining either operator<<() or PrintTo() in the namespace that
-// defines T.  More specifically, the FIRST defined function in the
-// following list will be used (assuming T is defined in namespace
-// foo):
-//
-//   1. foo::PrintTo(const T&, ostream*)
-//   2. operator<<(ostream&, const T&) defined in either foo or the
-//      global namespace.
-//
-// If none of the above is defined, it will print the debug string of
-// the value if it is a protocol buffer, or print the raw bytes in the
-// value otherwise.
-//
-// To aid debugging: when T is a reference type, the address of the
-// value is also printed; when T is a (const) char pointer, both the
-// pointer value and the NUL-terminated string it points to are
-// printed.
-//
-// We also provide some convenient wrappers:
-//
-//   // Prints a value to a string.  For a (const or not) char
-//   // pointer, the NUL-terminated string (but not the pointer) is
-//   // printed.
-//   std::string ::testing::PrintToString(const T& value);
-//
-//   // Prints a value tersely: for a reference type, the referenced
-//   // value (but not the address) is printed; for a (const or not) char
-//   // pointer, the NUL-terminated string (but not the pointer) is
-//   // printed.
-//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
-//
-//   // Prints value using the type inferred by the compiler.  The difference
-//   // from UniversalTersePrint() is that this function prints both the
-//   // pointer and the NUL-terminated string for a (const or not) char pointer.
-//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
-//
-//   // Prints the fields of a tuple tersely to a string vector, one
-//   // element for each field. Tuple support must be enabled in
-//   // gtest-port.h.
-//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
-//       const Tuple& value);
-//
-// Known limitation:
-//
-// The print primitives print the elements of an STL-style container
-// using the compiler-inferred type of *iter where iter is a
-// const_iterator of the container.  When const_iterator is an input
-// iterator but not a forward iterator, this inferred type may not
-// match value_type, and the print output may be incorrect.  In
-// practice, this is rarely a problem as for most containers
-// const_iterator is a forward iterator.  We'll fix this if there's an
-// actual need for it.  Note that this fix cannot rely on value_type
-// being defined as many user-defined container types don't have
-// value_type.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-
-#include <ostream>  // NOLINT
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// Definitions in the 'internal' and 'internal2' name spaces are
-// subject to change without notice.  DO NOT USE THEM IN USER CODE!
-namespace internal2 {
-
-// Prints the given number of bytes in the given object to the given
-// ostream.
-GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
-                                     size_t count,
-                                     ::std::ostream* os);
-
-// For selecting which printer to use when a given type has neither <<
-// nor PrintTo().
-enum TypeKind {
-  kProtobuf,              // a protobuf type
-  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
-                          // (e.g. a named or unnamed enum type)
-  kOtherType              // anything else
-};
-
-// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
-// by the universal printer to print a value of type T when neither
-// operator<< nor PrintTo() is defined for T, where kTypeKind is the
-// "kind" of T as defined by enum TypeKind.
-template <typename T, TypeKind kTypeKind>
-class TypeWithoutFormatter {
- public:
-  // This default version is called when kTypeKind is kOtherType.
-  static void PrintValue(const T& value, ::std::ostream* os) {
-    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
-                         sizeof(value), os);
-  }
-};
-
-// We print a protobuf using its ShortDebugString() when the string
-// doesn't exceed this many characters; otherwise we print it using
-// DebugString() for better readability.
-const size_t kProtobufOneLinerMaxLength = 50;
-
-template <typename T>
-class TypeWithoutFormatter<T, kProtobuf> {
- public:
-  static void PrintValue(const T& value, ::std::ostream* os) {
-    const ::testing::internal::string short_str = value.ShortDebugString();
-    const ::testing::internal::string pretty_str =
-        short_str.length() <= kProtobufOneLinerMaxLength ?
-        short_str : ("\n" + value.DebugString());
-    *os << ("<" + pretty_str + ">");
-  }
-};
-
-template <typename T>
-class TypeWithoutFormatter<T, kConvertibleToInteger> {
- public:
-  // Since T has no << operator or PrintTo() but can be implicitly
-  // converted to BiggestInt, we print it as a BiggestInt.
-  //
-  // Most likely T is an enum type (either named or unnamed), in which
-  // case printing it as an integer is the desired behavior.  In case
-  // T is not an enum, printing it as an integer is the best we can do
-  // given that it has no user-defined printer.
-  static void PrintValue(const T& value, ::std::ostream* os) {
-    const internal::BiggestInt kBigInt = value;
-    *os << kBigInt;
-  }
-};
-
-// Prints the given value to the given ostream.  If the value is a
-// protocol message, its debug string is printed; if it's an enum or
-// of a type implicitly convertible to BiggestInt, it's printed as an
-// integer; otherwise the bytes in the value are printed.  This is
-// what UniversalPrinter<T>::Print() does when it knows nothing about
-// type T and T has neither << operator nor PrintTo().
-//
-// A user can override this behavior for a class type Foo by defining
-// a << operator in the namespace where Foo is defined.
-//
-// We put this operator in namespace 'internal2' instead of 'internal'
-// to simplify the implementation, as much code in 'internal' needs to
-// use << in STL, which would conflict with our own << were it defined
-// in 'internal'.
-//
-// Note that this operator<< takes a generic std::basic_ostream<Char,
-// CharTraits> type instead of the more restricted std::ostream.  If
-// we define it to take an std::ostream instead, we'll get an
-// "ambiguous overloads" compiler error when trying to print a type
-// Foo that supports streaming to std::basic_ostream<Char,
-// CharTraits>, as the compiler cannot tell whether
-// operator<<(std::ostream&, const T&) or
-// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
-// specific.
-template <typename Char, typename CharTraits, typename T>
-::std::basic_ostream<Char, CharTraits>& operator<<(
-    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
-  TypeWithoutFormatter<T,
-      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
-       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
-       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
-  return os;
-}
-
-}  // namespace internal2
-}  // namespace testing
-
-// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
-// magic needed for implementing UniversalPrinter won't work.
-namespace testing_internal {
-
-// Used to print a value that is not an STL-style container when the
-// user doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
-  // With the following statement, during unqualified name lookup,
-  // testing::internal2::operator<< appears as if it was declared in
-  // the nearest enclosing namespace that contains both
-  // ::testing_internal and ::testing::internal2, i.e. the global
-  // namespace.  For more details, refer to the C++ Standard section
-  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
-  // testing::internal2::operator<< in case T doesn't come with a <<
-  // operator.
-  //
-  // We cannot write 'using ::testing::internal2::operator<<;', which
-  // gcc 3.3 fails to compile due to a compiler bug.
-  using namespace ::testing::internal2;  // NOLINT
-
-  // Assuming T is defined in namespace foo, in the next statement,
-  // the compiler will consider all of:
-  //
-  //   1. foo::operator<< (thanks to Koenig look-up),
-  //   2. ::operator<< (as the current namespace is enclosed in ::),
-  //   3. testing::internal2::operator<< (thanks to the using statement above).
-  //
-  // The operator<< whose type matches T best will be picked.
-  //
-  // We deliberately allow #2 to be a candidate, as sometimes it's
-  // impossible to define #1 (e.g. when foo is ::std, defining
-  // anything in it is undefined behavior unless you are a compiler
-  // vendor.).
-  *os << value;
-}
-
-}  // namespace testing_internal
-
-namespace testing {
-namespace internal {
-
-// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
-// value to the given ostream.  The caller must ensure that
-// 'ostream_ptr' is not NULL, or the behavior is undefined.
-//
-// We define UniversalPrinter as a class template (as opposed to a
-// function template), as we need to partially specialize it for
-// reference types, which cannot be done with function templates.
-template <typename T>
-class UniversalPrinter;
-
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os);
-
-// Used to print an STL-style container when the user doesn't define
-// a PrintTo() for it.
-template <typename C>
-void DefaultPrintTo(IsContainer /* dummy */,
-                    false_type /* is not a pointer */,
-                    const C& container, ::std::ostream* os) {
-  const size_t kMaxCount = 32;  // The maximum number of elements to print.
-  *os << '{';
-  size_t count = 0;
-  for (typename C::const_iterator it = container.begin();
-       it != container.end(); ++it, ++count) {
-    if (count > 0) {
-      *os << ',';
-      if (count == kMaxCount) {  // Enough has been printed.
-        *os << " ...";
-        break;
-      }
-    }
-    *os << ' ';
-    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
-    // handle *it being a native array.
-    internal::UniversalPrint(*it, os);
-  }
-
-  if (count > 0) {
-    *os << ' ';
-  }
-  *os << '}';
-}
-
-// Used to print a pointer that is neither a char pointer nor a member
-// pointer, when the user doesn't define PrintTo() for it.  (A member
-// variable pointer or member function pointer doesn't really point to
-// a location in the address space.  Their representation is
-// implementation-defined.  Therefore they will be printed as raw
-// bytes.)
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
-                    true_type /* is a pointer */,
-                    T* p, ::std::ostream* os) {
-  if (p == NULL) {
-    *os << "NULL";
-  } else {
-    // C++ doesn't allow casting from a function pointer to any object
-    // pointer.
-    //
-    // IsTrue() silences warnings: "Condition is always true",
-    // "unreachable code".
-    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
-      // T is not a function type.  We just call << to print p,
-      // relying on ADL to pick up user-defined << for their pointer
-      // types, if any.
-      *os << p;
-    } else {
-      // T is a function type, so '*os << p' doesn't do what we want
-      // (it just prints p as bool).  We want to print p as a const
-      // void*.  However, we cannot cast it to const void* directly,
-      // even using reinterpret_cast, as earlier versions of gcc
-      // (e.g. 3.4.5) cannot compile the cast when p is a function
-      // pointer.  Casting to UInt64 first solves the problem.
-      *os << reinterpret_cast<const void*>(
-          reinterpret_cast<internal::UInt64>(p));
-    }
-  }
-}
-
-// Used to print a non-container, non-pointer value when the user
-// doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
-                    false_type /* is not a pointer */,
-                    const T& value, ::std::ostream* os) {
-  ::testing_internal::DefaultPrintNonContainerTo(value, os);
-}
-
-// Prints the given value using the << operator if it has one;
-// otherwise prints the bytes in it.  This is what
-// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
-// or overloaded for type T.
-//
-// A user can override this behavior for a class type Foo by defining
-// an overload of PrintTo() in the namespace where Foo is defined.  We
-// give the user this option as sometimes defining a << operator for
-// Foo is not desirable (e.g. the coding style may prevent doing it,
-// or there is already a << operator but it doesn't do what the user
-// wants).
-template <typename T>
-void PrintTo(const T& value, ::std::ostream* os) {
-  // DefaultPrintTo() is overloaded.  The type of its first two
-  // arguments determine which version will be picked.  If T is an
-  // STL-style container, the version for container will be called; if
-  // T is a pointer, the pointer version will be called; otherwise the
-  // generic version will be called.
-  //
-  // Note that we check for container types here, prior to we check
-  // for protocol message types in our operator<<.  The rationale is:
-  //
-  // For protocol messages, we want to give people a chance to
-  // override Google Mock's format by defining a PrintTo() or
-  // operator<<.  For STL containers, other formats can be
-  // incompatible with Google Mock's format for the container
-  // elements; therefore we check for container types here to ensure
-  // that our format is used.
-  //
-  // The second argument of DefaultPrintTo() is needed to bypass a bug
-  // in Symbian's C++ compiler that prevents it from picking the right
-  // overload between:
-  //
-  //   PrintTo(const T& x, ...);
-  //   PrintTo(T* x, ...);
-  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
-}
-
-// The following list of PrintTo() overloads tells
-// UniversalPrinter<T>::Print() how to print standard types (built-in
-// types, strings, plain arrays, and pointers).
-
-// Overloads for various char types.
-GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
-GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
-inline void PrintTo(char c, ::std::ostream* os) {
-  // When printing a plain char, we always treat it as unsigned.  This
-  // way, the output won't be affected by whether the compiler thinks
-  // char is signed or not.
-  PrintTo(static_cast<unsigned char>(c), os);
-}
-
-// Overloads for other simple built-in types.
-inline void PrintTo(bool x, ::std::ostream* os) {
-  *os << (x ? "true" : "false");
-}
-
-// Overload for wchar_t type.
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its decimal code (except for L'\0').
-// The L'\0' char is printed as "L'\\0'". The decimal code is printed
-// as signed integer when wchar_t is implemented by the compiler
-// as a signed type and is printed as an unsigned integer when wchar_t
-// is implemented as an unsigned type.
-GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
-
-// Overloads for C strings.
-GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
-inline void PrintTo(char* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const char*>(s), os);
-}
-
-// signed/unsigned char is often used for representing binary data, so
-// we print pointers to it as void* to be safe.
-inline void PrintTo(const signed char* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(signed char* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(unsigned char* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const void*>(s), os);
-}
-
-// MSVC can be configured to define wchar_t as a typedef of unsigned
-// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
-// type.  When wchar_t is a typedef, defining an overload for const
-// wchar_t* would cause unsigned short* be printed as a wide string,
-// possibly causing invalid memory accesses.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Overloads for wide C strings
-GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
-inline void PrintTo(wchar_t* s, ::std::ostream* os) {
-  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
-}
-#endif
-
-// Overload for C arrays.  Multi-dimensional arrays are printed
-// properly.
-
-// Prints the given number of elements in an array, without printing
-// the curly braces.
-template <typename T>
-void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
-  UniversalPrint(a[0], os);
-  for (size_t i = 1; i != count; i++) {
-    *os << ", ";
-    UniversalPrint(a[i], os);
-  }
-}
-
-// Overloads for ::string and ::std::string.
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
-inline void PrintTo(const ::string& s, ::std::ostream* os) {
-  PrintStringTo(s, os);
-}
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
-inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
-  PrintStringTo(s, os);
-}
-
-// Overloads for ::wstring and ::std::wstring.
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
-  PrintWideStringTo(s, os);
-}
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
-  PrintWideStringTo(s, os);
-}
-#endif  // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_TR1_TUPLE
-// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
-// which are packed as tuples.
-
-// Helper function for printing a tuple.  T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os);
-
-// Overloaded PrintTo() for tuples of various arities.  We support
-// tuples of up-to 10 fields.  The following implementation works
-// regardless of whether tr1::tuple is implemented using the
-// non-standard variadic template feature or not.
-
-inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1>
-void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2>
-void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
-             ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-          typename T6>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
-             ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-          typename T6, typename T7>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
-             ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-          typename T6, typename T7, typename T8>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
-             ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-          typename T6, typename T7, typename T8, typename T9>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
-             ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-          typename T6, typename T7, typename T8, typename T9, typename T10>
-void PrintTo(
-    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
-    ::std::ostream* os) {
-  PrintTupleTo(t, os);
-}
-#endif  // GTEST_HAS_TR1_TUPLE
-
-// Overload for std::pair.
-template <typename T1, typename T2>
-void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
-  *os << '(';
-  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
-  // a reference type.  The same for printing value.second.
-  UniversalPrinter<T1>::Print(value.first, os);
-  *os << ", ";
-  UniversalPrinter<T2>::Print(value.second, os);
-  *os << ')';
-}
-
-// Implements printing a non-reference type T by letting the compiler
-// pick the right overload of PrintTo() for T.
-template <typename T>
-class UniversalPrinter {
- public:
-  // MSVC warns about adding const to a function type, so we want to
-  // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4180)  // Temporarily disables warning 4180.
-#endif  // _MSC_VER
-
-  // Note: we deliberately don't call this PrintTo(), as that name
-  // conflicts with ::testing::internal::PrintTo in the body of the
-  // function.
-  static void Print(const T& value, ::std::ostream* os) {
-    // By default, ::testing::internal::PrintTo() is used for printing
-    // the value.
-    //
-    // Thanks to Koenig look-up, if T is a class and has its own
-    // PrintTo() function defined in its namespace, that function will
-    // be visible here.  Since it is more specific than the generic ones
-    // in ::testing::internal, it will be picked by the compiler in the
-    // following statement - exactly what we want.
-    PrintTo(value, os);
-  }
-
-#ifdef _MSC_VER
-# pragma warning(pop)           // Restores the warning state.
-#endif  // _MSC_VER
-};
-
-// UniversalPrintArray(begin, len, os) prints an array of 'len'
-// elements, starting at address 'begin'.
-template <typename T>
-void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
-  if (len == 0) {
-    *os << "{}";
-  } else {
-    *os << "{ ";
-    const size_t kThreshold = 18;
-    const size_t kChunkSize = 8;
-    // If the array has more than kThreshold elements, we'll have to
-    // omit some details by printing only the first and the last
-    // kChunkSize elements.
-    // TODO(wan at google.com): let the user control the threshold using a flag.
-    if (len <= kThreshold) {
-      PrintRawArrayTo(begin, len, os);
-    } else {
-      PrintRawArrayTo(begin, kChunkSize, os);
-      *os << ", ..., ";
-      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
-    }
-    *os << " }";
-  }
-}
-// This overload prints a (const) char array compactly.
-GTEST_API_ void UniversalPrintArray(const char* begin,
-                                    size_t len,
-                                    ::std::ostream* os);
-
-// Implements printing an array type T[N].
-template <typename T, size_t N>
-class UniversalPrinter<T[N]> {
- public:
-  // Prints the given array, omitting some elements when there are too
-  // many.
-  static void Print(const T (&a)[N], ::std::ostream* os) {
-    UniversalPrintArray(a, N, os);
-  }
-};
-
-// Implements printing a reference type T&.
-template <typename T>
-class UniversalPrinter<T&> {
- public:
-  // MSVC warns about adding const to a function type, so we want to
-  // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4180)  // Temporarily disables warning 4180.
-#endif  // _MSC_VER
-
-  static void Print(const T& value, ::std::ostream* os) {
-    // Prints the address of the value.  We use reinterpret_cast here
-    // as static_cast doesn't compile when T is a function type.
-    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
-
-    // Then prints the value itself.
-    UniversalPrint(value, os);
-  }
-
-#ifdef _MSC_VER
-# pragma warning(pop)           // Restores the warning state.
-#endif  // _MSC_VER
-};
-
-// Prints a value tersely: for a reference type, the referenced value
-// (but not the address) is printed; for a (const) char pointer, the
-// NUL-terminated string (but not the pointer) is printed.
-template <typename T>
-void UniversalTersePrint(const T& value, ::std::ostream* os) {
-  UniversalPrint(value, os);
-}
-inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
-  if (str == NULL) {
-    *os << "NULL";
-  } else {
-    UniversalPrint(string(str), os);
-  }
-}
-inline void UniversalTersePrint(char* str, ::std::ostream* os) {
-  UniversalTersePrint(static_cast<const char*>(str), os);
-}
-
-// Prints a value using the type inferred by the compiler.  The
-// difference between this and UniversalTersePrint() is that for a
-// (const) char pointer, this prints both the pointer and the
-// NUL-terminated string.
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os) {
-  UniversalPrinter<T>::Print(value, os);
-}
-
-#if GTEST_HAS_TR1_TUPLE
-typedef ::std::vector<string> Strings;
-
-// This helper template allows PrintTo() for tuples and
-// UniversalTersePrintTupleFieldsToStrings() to be defined by
-// induction on the number of tuple fields.  The idea is that
-// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
-// fields in tuple t, and can be defined in terms of
-// TuplePrefixPrinter<N - 1>.
-
-// The inductive case.
-template <size_t N>
-struct TuplePrefixPrinter {
-  // Prints the first N fields of a tuple.
-  template <typename Tuple>
-  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
-    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
-    *os << ", ";
-    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
-        ::Print(::std::tr1::get<N - 1>(t), os);
-  }
-
-  // Tersely prints the first N fields of a tuple to a string vector,
-  // one element for each field.
-  template <typename Tuple>
-  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
-    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
-    ::std::stringstream ss;
-    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
-    strings->push_back(ss.str());
-  }
-};
-
-// Base cases.
-template <>
-struct TuplePrefixPrinter<0> {
-  template <typename Tuple>
-  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
-
-  template <typename Tuple>
-  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
-};
-// We have to specialize the entire TuplePrefixPrinter<> class
-// template here, even though the definition of
-// TersePrintPrefixToStrings() is the same as the generic version, as
-// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
-// support specializing a method template of a class template.
-template <>
-struct TuplePrefixPrinter<1> {
-  template <typename Tuple>
-  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
-    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
-        Print(::std::tr1::get<0>(t), os);
-  }
-
-  template <typename Tuple>
-  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
-    ::std::stringstream ss;
-    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
-    strings->push_back(ss.str());
-  }
-};
-
-// Helper function for printing a tuple.  T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os) {
-  *os << "(";
-  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
-      PrintPrefixTo(t, os);
-  *os << ")";
-}
-
-// Prints the fields of a tuple tersely to a string vector, one
-// element for each field.  See the comment before
-// UniversalTersePrint() for how we define "tersely".
-template <typename Tuple>
-Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
-  Strings result;
-  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
-      TersePrintPrefixToStrings(value, &result);
-  return result;
-}
-#endif  // GTEST_HAS_TR1_TUPLE
-
-}  // namespace internal
-
-template <typename T>
-::std::string PrintToString(const T& value) {
-  ::std::stringstream ss;
-  internal::UniversalTersePrint(value, &ss);
-  return ss.str();
-}
-
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-spi.h b/unit_tests/gtest/include/gtest/gtest-spi.h
deleted file mode 100644
index b226e55..0000000
--- a/unit_tests/gtest/include/gtest/gtest-spi.h
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2007, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// Utilities for testing Google Test itself and code that uses Google Test
-// (e.g. frameworks built on top of Google Test).
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-
-#include "gtest/gtest.h"
-
-namespace testing {
-
-// This helper class can be used to mock out Google Test failure reporting
-// so that we can test Google Test or code that builds on Google Test.
-//
-// An object of this class appends a TestPartResult object to the
-// TestPartResultArray object given in the constructor whenever a Google Test
-// failure is reported. It can either intercept only failures that are
-// generated in the same thread that created this object or it can intercept
-// all generated failures. The scope of this mock object can be controlled with
-// the second argument to the two arguments constructor.
-class GTEST_API_ ScopedFakeTestPartResultReporter
-    : public TestPartResultReporterInterface {
- public:
-  // The two possible mocking modes of this object.
-  enum InterceptMode {
-    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
-    INTERCEPT_ALL_THREADS           // Intercepts all failures.
-  };
-
-  // The c'tor sets this object as the test part result reporter used
-  // by Google Test.  The 'result' parameter specifies where to report the
-  // results. This reporter will only catch failures generated in the current
-  // thread. DEPRECATED
-  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
-
-  // Same as above, but you can choose the interception scope of this object.
-  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
-                                   TestPartResultArray* result);
-
-  // The d'tor restores the previous test part result reporter.
-  virtual ~ScopedFakeTestPartResultReporter();
-
-  // Appends the TestPartResult object to the TestPartResultArray
-  // received in the constructor.
-  //
-  // This method is from the TestPartResultReporterInterface
-  // interface.
-  virtual void ReportTestPartResult(const TestPartResult& result);
- private:
-  void Init();
-
-  const InterceptMode intercept_mode_;
-  TestPartResultReporterInterface* old_reporter_;
-  TestPartResultArray* const result_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
-};
-
-namespace internal {
-
-// A helper class for implementing EXPECT_FATAL_FAILURE() and
-// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring.  If that's not the case, a
-// non-fatal failure will be generated.
-class GTEST_API_ SingleFailureChecker {
- public:
-  // The constructor remembers the arguments.
-  SingleFailureChecker(const TestPartResultArray* results,
-                       TestPartResult::Type type,
-                       const string& substr);
-  ~SingleFailureChecker();
- private:
-  const TestPartResultArray* const results_;
-  const TestPartResult::Type type_;
-  const string substr_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
-};
-
-}  // namespace internal
-
-}  // namespace testing
-
-// A set of macros for testing Google Test assertions or code that's expected
-// to generate Google Test fatal failures.  It verifies that the given
-// statement will cause exactly one fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-//   - 'statement' cannot reference local non-static variables or
-//     non-static members of the current object.
-//   - 'statement' cannot return a value.
-//   - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
-// gtest_unittest.cc will fail to compile if we do that.
-#define EXPECT_FATAL_FAILURE(statement, substr) \
-  do { \
-    class GTestExpectFatalFailureHelper {\
-     public:\
-      static void Execute() { statement; }\
-    };\
-    ::testing::TestPartResultArray gtest_failures;\
-    ::testing::internal::SingleFailureChecker gtest_checker(\
-        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
-    {\
-      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
-          ::testing::ScopedFakeTestPartResultReporter:: \
-          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
-      GTestExpectFatalFailureHelper::Execute();\
-    }\
-  } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
-  do { \
-    class GTestExpectFatalFailureHelper {\
-     public:\
-      static void Execute() { statement; }\
-    };\
-    ::testing::TestPartResultArray gtest_failures;\
-    ::testing::internal::SingleFailureChecker gtest_checker(\
-        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
-    {\
-      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
-          ::testing::ScopedFakeTestPartResultReporter:: \
-          INTERCEPT_ALL_THREADS, &gtest_failures);\
-      GTestExpectFatalFailureHelper::Execute();\
-    }\
-  } while (::testing::internal::AlwaysFalse())
-
-// A macro for testing Google Test assertions or code that's expected to
-// generate Google Test non-fatal failures.  It asserts that the given
-// statement will cause exactly one non-fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// 'statement' is allowed to reference local variables and members of
-// the current object.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-//   - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works.  If we do that, the code won't compile when the user gives
-// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
-// expands to code containing an unprotected comma.  The
-// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
-// catches that.
-//
-// For the same reason, we have to write
-//   if (::testing::internal::AlwaysTrue()) { statement; }
-// instead of
-//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-// to avoid an MSVC warning on unreachable code.
-#define EXPECT_NONFATAL_FAILURE(statement, substr) \
-  do {\
-    ::testing::TestPartResultArray gtest_failures;\
-    ::testing::internal::SingleFailureChecker gtest_checker(\
-        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
-        (substr));\
-    {\
-      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
-          ::testing::ScopedFakeTestPartResultReporter:: \
-          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
-      if (::testing::internal::AlwaysTrue()) { statement; }\
-    }\
-  } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
-  do {\
-    ::testing::TestPartResultArray gtest_failures;\
-    ::testing::internal::SingleFailureChecker gtest_checker(\
-        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
-        (substr));\
-    {\
-      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
-          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
-          &gtest_failures);\
-      if (::testing::internal::AlwaysTrue()) { statement; }\
-    }\
-  } while (::testing::internal::AlwaysFalse())
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-test-part.h b/unit_tests/gtest/include/gtest/gtest-test-part.h
deleted file mode 100644
index 8aeea14..0000000
--- a/unit_tests/gtest/include/gtest/gtest-test-part.h
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule at google.com (Markus Heule)
-//
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-
-#include <iosfwd>
-#include <vector>
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-
-// A copyable object representing the result of a test part (i.e. an
-// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
-//
-// Don't inherit from TestPartResult as its destructor is not virtual.
-class GTEST_API_ TestPartResult {
- public:
-  // The possible outcomes of a test part (i.e. an assertion or an
-  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
-  enum Type {
-    kSuccess,          // Succeeded.
-    kNonFatalFailure,  // Failed but the test can continue.
-    kFatalFailure      // Failed and the test should be terminated.
-  };
-
-  // C'tor.  TestPartResult does NOT have a default constructor.
-  // Always use this constructor (with parameters) to create a
-  // TestPartResult object.
-  TestPartResult(Type a_type,
-                 const char* a_file_name,
-                 int a_line_number,
-                 const char* a_message)
-      : type_(a_type),
-        file_name_(a_file_name),
-        line_number_(a_line_number),
-        summary_(ExtractSummary(a_message)),
-        message_(a_message) {
-  }
-
-  // Gets the outcome of the test part.
-  Type type() const { return type_; }
-
-  // Gets the name of the source file where the test part took place, or
-  // NULL if it's unknown.
-  const char* file_name() const { return file_name_.c_str(); }
-
-  // Gets the line in the source file where the test part took place,
-  // or -1 if it's unknown.
-  int line_number() const { return line_number_; }
-
-  // Gets the summary of the failure message.
-  const char* summary() const { return summary_.c_str(); }
-
-  // Gets the message associated with the test part.
-  const char* message() const { return message_.c_str(); }
-
-  // Returns true iff the test part passed.
-  bool passed() const { return type_ == kSuccess; }
-
-  // Returns true iff the test part failed.
-  bool failed() const { return type_ != kSuccess; }
-
-  // Returns true iff the test part non-fatally failed.
-  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
-
-  // Returns true iff the test part fatally failed.
-  bool fatally_failed() const { return type_ == kFatalFailure; }
- private:
-  Type type_;
-
-  // Gets the summary of the failure message by omitting the stack
-  // trace in it.
-  static internal::String ExtractSummary(const char* message);
-
-  // The name of the source file where the test part took place, or
-  // NULL if the source file is unknown.
-  internal::String file_name_;
-  // The line in the source file where the test part took place, or -1
-  // if the line number is unknown.
-  int line_number_;
-  internal::String summary_;  // The test failure summary.
-  internal::String message_;  // The test failure message.
-};
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
-
-// An array of TestPartResult objects.
-//
-// Don't inherit from TestPartResultArray as its destructor is not
-// virtual.
-class GTEST_API_ TestPartResultArray {
- public:
-  TestPartResultArray() {}
-
-  // Appends the given TestPartResult to the array.
-  void Append(const TestPartResult& result);
-
-  // Returns the TestPartResult at the given index (0-based).
-  const TestPartResult& GetTestPartResult(int index) const;
-
-  // Returns the number of TestPartResult objects in the array.
-  int size() const;
-
- private:
-  std::vector<TestPartResult> array_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
-};
-
-// This interface knows how to report a test part result.
-class TestPartResultReporterInterface {
- public:
-  virtual ~TestPartResultReporterInterface() {}
-
-  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
-};
-
-namespace internal {
-
-// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
-// statement generates new fatal failures. To do so it registers itself as the
-// current test part result reporter. Besides checking if fatal failures were
-// reported, it only delegates the reporting to the former result reporter.
-// The original result reporter is restored in the destructor.
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-class GTEST_API_ HasNewFatalFailureHelper
-    : public TestPartResultReporterInterface {
- public:
-  HasNewFatalFailureHelper();
-  virtual ~HasNewFatalFailureHelper();
-  virtual void ReportTestPartResult(const TestPartResult& result);
-  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
- private:
-  bool has_new_fatal_failure_;
-  TestPartResultReporterInterface* original_reporter_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
-};
-
-}  // namespace internal
-
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-typed-test.h b/unit_tests/gtest/include/gtest/gtest-typed-test.h
deleted file mode 100644
index fe1e83b..0000000
--- a/unit_tests/gtest/include/gtest/gtest-typed-test.h
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2008 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-
-// This header implements typed tests and type-parameterized tests.
-
-// Typed (aka type-driven) tests repeat the same test for types in a
-// list.  You must know which types you want to test with when writing
-// typed tests. Here's how you do it:
-
-#if 0
-
-// First, define a fixture class template.  It should be parameterized
-// by a type.  Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
- public:
-  ...
-  typedef std::list<T> List;
-  static T shared_;
-  T value_;
-};
-
-// Next, associate a list of types with the test case, which will be
-// repeated for each type in the list.  The typedef is necessary for
-// the macro to parse correctly.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-TYPED_TEST_CASE(FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-//   TYPED_TEST_CASE(FooTest, int);
-
-// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
-// tests for this test case as you want.
-TYPED_TEST(FooTest, DoesBlah) {
-  // Inside a test, refer to TypeParam to get the type parameter.
-  // Since we are inside a derived class template, C++ requires use to
-  // visit the members of FooTest via 'this'.
-  TypeParam n = this->value_;
-
-  // To visit static members of the fixture, add the TestFixture::
-  // prefix.
-  n += TestFixture::shared_;
-
-  // To refer to typedefs in the fixture, add the "typename
-  // TestFixture::" prefix.
-  typename TestFixture::List values;
-  values.push_back(n);
-  ...
-}
-
-TYPED_TEST(FooTest, HasPropertyA) { ... }
-
-#endif  // 0
-
-// Type-parameterized tests are abstract test patterns parameterized
-// by a type.  Compared with typed tests, type-parameterized tests
-// allow you to define the test pattern without knowing what the type
-// parameters are.  The defined pattern can be instantiated with
-// different types any number of times, in any number of translation
-// units.
-//
-// If you are designing an interface or concept, you can define a
-// suite of type-parameterized tests to verify properties that any
-// valid implementation of the interface/concept should have.  Then,
-// each implementation can easily instantiate the test suite to verify
-// that it conforms to the requirements, without having to write
-// similar tests repeatedly.  Here's an example:
-
-#if 0
-
-// First, define a fixture class template.  It should be parameterized
-// by a type.  Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
-  ...
-};
-
-// Next, declare that you will define a type-parameterized test case
-// (the _P suffix is for "parameterized" or "pattern", whichever you
-// prefer):
-TYPED_TEST_CASE_P(FooTest);
-
-// Then, use TYPED_TEST_P() to define as many type-parameterized tests
-// for this type-parameterized test case as you want.
-TYPED_TEST_P(FooTest, DoesBlah) {
-  // Inside a test, refer to TypeParam to get the type parameter.
-  TypeParam n = 0;
-  ...
-}
-
-TYPED_TEST_P(FooTest, HasPropertyA) { ... }
-
-// Now the tricky part: you need to register all test patterns before
-// you can instantiate them.  The first argument of the macro is the
-// test case name; the rest are the names of the tests in this test
-// case.
-REGISTER_TYPED_TEST_CASE_P(FooTest,
-                           DoesBlah, HasPropertyA);
-
-// Finally, you are free to instantiate the pattern with the types you
-// want.  If you put the above code in a header file, you can #include
-// it in multiple C++ source files and instantiate it multiple times.
-//
-// To distinguish different instances of the pattern, the first
-// argument to the INSTANTIATE_* macro is a prefix that will be added
-// to the actual test case name.  Remember to pick unique prefixes for
-// different instances.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
-
-#endif  // 0
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-type-util.h"
-
-// Implements typed tests.
-
-#if GTEST_HAS_TYPED_TEST
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the typedef for the type parameters of the
-// given test case.
-# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define TYPED_TEST_CASE(CaseName, Types) \
-  typedef ::testing::internal::TypeList< Types >::type \
-      GTEST_TYPE_PARAMS_(CaseName)
-
-# define TYPED_TEST(CaseName, TestName) \
-  template <typename gtest_TypeParam_> \
-  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
-      : public CaseName<gtest_TypeParam_> { \
-   private: \
-    typedef CaseName<gtest_TypeParam_> TestFixture; \
-    typedef gtest_TypeParam_ TypeParam; \
-    virtual void TestBody(); \
-  }; \
-  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
-      ::testing::internal::TypeParameterizedTest< \
-          CaseName, \
-          ::testing::internal::TemplateSel< \
-              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
-          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
-              "", #CaseName, #TestName, 0); \
-  template <typename gtest_TypeParam_> \
-  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
-
-#endif  // GTEST_HAS_TYPED_TEST
-
-// Implements type-parameterized tests.
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the namespace name that the type-parameterized tests for
-// the given type-parameterized test case are defined in.  The exact
-// name of the namespace is subject to change without notice.
-# define GTEST_CASE_NAMESPACE_(TestCaseName) \
-  gtest_case_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the variable used to remember the names of
-// the defined tests in the given test case.
-# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
-  gtest_typed_test_case_p_state_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
-//
-// Expands to the name of the variable used to remember the names of
-// the registered tests in the given test case.
-# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
-  gtest_registered_test_names_##TestCaseName##_
-
-// The variables defined in the type-parameterized test macros are
-// static as typically these macros are used in a .h file that can be
-// #included in multiple translation units linked together.
-# define TYPED_TEST_CASE_P(CaseName) \
-  static ::testing::internal::TypedTestCasePState \
-      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
-
-# define TYPED_TEST_P(CaseName, TestName) \
-  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
-  template <typename gtest_TypeParam_> \
-  class TestName : public CaseName<gtest_TypeParam_> { \
-   private: \
-    typedef CaseName<gtest_TypeParam_> TestFixture; \
-    typedef gtest_TypeParam_ TypeParam; \
-    virtual void TestBody(); \
-  }; \
-  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
-      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
-          __FILE__, __LINE__, #CaseName, #TestName); \
-  } \
-  template <typename gtest_TypeParam_> \
-  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
-
-# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
-  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
-  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
-  } \
-  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
-      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
-          __FILE__, __LINE__, #__VA_ARGS__)
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
-  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
-      ::testing::internal::TypeParameterizedTestCase<CaseName, \
-          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
-          ::testing::internal::TypeList< Types >::type>::Register(\
-              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
-
-#endif  // GTEST_HAS_TYPED_TEST_P
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest.h b/unit_tests/gtest/include/gtest/gtest.h
deleted file mode 100644
index cd01c7b..0000000
--- a/unit_tests/gtest/include/gtest/gtest.h
+++ /dev/null
@@ -1,2155 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for Google Test.  It should be
-// included by any test program that uses Google Test.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
-// program!
-//
-// Acknowledgment: Google Test borrowed the idea of automatic test
-// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
-// easyUnit framework.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_H_
-
-#include <limits>
-#include <vector>
-
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-#include "gtest/gtest-death-test.h"
-#include "gtest/gtest-message.h"
-#include "gtest/gtest-param-test.h"
-#include "gtest/gtest-printers.h"
-#include "gtest/gtest_prod.h"
-#include "gtest/gtest-test-part.h"
-#include "gtest/gtest-typed-test.h"
-
-// Depending on the platform, different string classes are available.
-// On Linux, in addition to ::std::string, Google also makes use of
-// class ::string, which has the same interface as ::std::string, but
-// has a different implementation.
-//
-// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
-// ::string is available AND is a distinct type to ::std::string, or
-// define it to 0 to indicate otherwise.
-//
-// If the user's ::std::string and ::string are the same class due to
-// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
-//
-// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
-// heuristically.
-
-namespace testing {
-
-// Declares the flags.
-
-// This flag temporary enables the disabled tests.
-GTEST_DECLARE_bool_(also_run_disabled_tests);
-
-// This flag brings the debugger on an assertion failure.
-GTEST_DECLARE_bool_(break_on_failure);
-
-// This flag controls whether Google Test catches all test-thrown exceptions
-// and logs them as failures.
-GTEST_DECLARE_bool_(catch_exceptions);
-
-// This flag enables using colors in terminal output. Available values are
-// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
-// to let Google Test decide.
-GTEST_DECLARE_string_(color);
-
-// This flag sets up the filter to select by name using a glob pattern
-// the tests to run. If the filter is not given all tests are executed.
-GTEST_DECLARE_string_(filter);
-
-// This flag causes the Google Test to list tests. None of the tests listed
-// are actually run if the flag is provided.
-GTEST_DECLARE_bool_(list_tests);
-
-// This flag controls whether Google Test emits a detailed XML report to a file
-// in addition to its normal textual output.
-GTEST_DECLARE_string_(output);
-
-// This flags control whether Google Test prints the elapsed time for each
-// test.
-GTEST_DECLARE_bool_(print_time);
-
-// This flag specifies the random number seed.
-GTEST_DECLARE_int32_(random_seed);
-
-// This flag sets how many times the tests are repeated. The default value
-// is 1. If the value is -1 the tests are repeating forever.
-GTEST_DECLARE_int32_(repeat);
-
-// This flag controls whether Google Test includes Google Test internal
-// stack frames in failure stack traces.
-GTEST_DECLARE_bool_(show_internal_stack_frames);
-
-// When this flag is specified, tests' order is randomized on every iteration.
-GTEST_DECLARE_bool_(shuffle);
-
-// This flag specifies the maximum number of stack frames to be
-// printed in a failure message.
-GTEST_DECLARE_int32_(stack_trace_depth);
-
-// When this flag is specified, a failed assertion will throw an
-// exception if exceptions are enabled, or exit the program with a
-// non-zero code otherwise.
-GTEST_DECLARE_bool_(throw_on_failure);
-
-// When this flag is set with a "host:port" string, on supported
-// platforms test results are streamed to the specified port on
-// the specified host machine.
-GTEST_DECLARE_string_(stream_result_to);
-
-// The upper limit for valid stack trace depths.
-const int kMaxStackTraceDepth = 100;
-
-namespace internal {
-
-class AssertHelper;
-class DefaultGlobalTestPartResultReporter;
-class ExecDeathTest;
-class NoExecDeathTest;
-class FinalSuccessChecker;
-class GTestFlagSaver;
-class TestResultAccessor;
-class TestEventListenersAccessor;
-class TestEventRepeater;
-class WindowsDeathTest;
-class UnitTestImpl* GetUnitTestImpl();
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
-                                    const String& message);
-
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared in gtest-internal.h but defined here, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable) {
-  return (Message() << streamable).GetString();
-}
-
-}  // namespace internal
-
-// The friend relationship of some of these classes is cyclic.
-// If we don't forward declare them the compiler might confuse the classes
-// in friendship clauses with same named classes on the scope.
-class Test;
-class TestCase;
-class TestInfo;
-class UnitTest;
-
-// A class for indicating whether an assertion was successful.  When
-// the assertion wasn't successful, the AssertionResult object
-// remembers a non-empty message that describes how it failed.
-//
-// To create an instance of this class, use one of the factory functions
-// (AssertionSuccess() and AssertionFailure()).
-//
-// This class is useful for two purposes:
-//   1. Defining predicate functions to be used with Boolean test assertions
-//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
-//   2. Defining predicate-format functions to be
-//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
-//
-// For example, if you define IsEven predicate:
-//
-//   testing::AssertionResult IsEven(int n) {
-//     if ((n % 2) == 0)
-//       return testing::AssertionSuccess();
-//     else
-//       return testing::AssertionFailure() << n << " is odd";
-//   }
-//
-// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
-// will print the message
-//
-//   Value of: IsEven(Fib(5))
-//     Actual: false (5 is odd)
-//   Expected: true
-//
-// instead of a more opaque
-//
-//   Value of: IsEven(Fib(5))
-//     Actual: false
-//   Expected: true
-//
-// in case IsEven is a simple Boolean predicate.
-//
-// If you expect your predicate to be reused and want to support informative
-// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
-// about half as often as positive ones in our tests), supply messages for
-// both success and failure cases:
-//
-//   testing::AssertionResult IsEven(int n) {
-//     if ((n % 2) == 0)
-//       return testing::AssertionSuccess() << n << " is even";
-//     else
-//       return testing::AssertionFailure() << n << " is odd";
-//   }
-//
-// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
-//
-//   Value of: IsEven(Fib(6))
-//     Actual: true (8 is even)
-//   Expected: false
-//
-// NB: Predicates that support negative Boolean assertions have reduced
-// performance in positive ones so be careful not to use them in tests
-// that have lots (tens of thousands) of positive Boolean assertions.
-//
-// To use this class with EXPECT_PRED_FORMAT assertions such as:
-//
-//   // Verifies that Foo() returns an even number.
-//   EXPECT_PRED_FORMAT1(IsEven, Foo());
-//
-// you need to define:
-//
-//   testing::AssertionResult IsEven(const char* expr, int n) {
-//     if ((n % 2) == 0)
-//       return testing::AssertionSuccess();
-//     else
-//       return testing::AssertionFailure()
-//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
-//   }
-//
-// If Foo() returns 5, you will see the following message:
-//
-//   Expected: Foo() is even
-//     Actual: it's 5
-//
-class GTEST_API_ AssertionResult {
- public:
-  // Copy constructor.
-  // Used in EXPECT_TRUE/FALSE(assertion_result).
-  AssertionResult(const AssertionResult& other);
-  // Used in the EXPECT_TRUE/FALSE(bool_expression).
-  explicit AssertionResult(bool success) : success_(success) {}
-
-  // Returns true iff the assertion succeeded.
-  operator bool() const { return success_; }  // NOLINT
-
-  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
-  AssertionResult operator!() const;
-
-  // Returns the text streamed into this AssertionResult. Test assertions
-  // use it when they fail (i.e., the predicate's outcome doesn't match the
-  // assertion's expectation). When nothing has been streamed into the
-  // object, returns an empty string.
-  const char* message() const {
-    return message_.get() != NULL ?  message_->c_str() : "";
-  }
-  // TODO(vladl at google.com): Remove this after making sure no clients use it.
-  // Deprecated; please use message() instead.
-  const char* failure_message() const { return message(); }
-
-  // Streams a custom failure message into this object.
-  template <typename T> AssertionResult& operator<<(const T& value) {
-    AppendMessage(Message() << value);
-    return *this;
-  }
-
-  // Allows streaming basic output manipulators such as endl or flush into
-  // this object.
-  AssertionResult& operator<<(
-      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
-    AppendMessage(Message() << basic_manipulator);
-    return *this;
-  }
-
- private:
-  // Appends the contents of message to message_.
-  void AppendMessage(const Message& a_message) {
-    if (message_.get() == NULL)
-      message_.reset(new ::std::string);
-    message_->append(a_message.GetString().c_str());
-  }
-
-  // Stores result of the assertion predicate.
-  bool success_;
-  // Stores the message describing the condition in case the expectation
-  // construct is not satisfied with the predicate's outcome.
-  // Referenced via a pointer to avoid taking too much stack frame space
-  // with test assertions.
-  internal::scoped_ptr< ::std::string> message_;
-
-  GTEST_DISALLOW_ASSIGN_(AssertionResult);
-};
-
-// Makes a successful assertion result.
-GTEST_API_ AssertionResult AssertionSuccess();
-
-// Makes a failed assertion result.
-GTEST_API_ AssertionResult AssertionFailure();
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << msg.
-GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
-
-// The abstract class that all tests inherit from.
-//
-// In Google Test, a unit test program contains one or many TestCases, and
-// each TestCase contains one or many Tests.
-//
-// When you define a test using the TEST macro, you don't need to
-// explicitly derive from Test - the TEST macro automatically does
-// this for you.
-//
-// The only time you derive from Test is when defining a test fixture
-// to be used a TEST_F.  For example:
-//
-//   class FooTest : public testing::Test {
-//    protected:
-//     virtual void SetUp() { ... }
-//     virtual void TearDown() { ... }
-//     ...
-//   };
-//
-//   TEST_F(FooTest, Bar) { ... }
-//   TEST_F(FooTest, Baz) { ... }
-//
-// Test is not copyable.
-class GTEST_API_ Test {
- public:
-  friend class TestInfo;
-
-  // Defines types for pointers to functions that set up and tear down
-  // a test case.
-  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
-  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
-
-  // The d'tor is virtual as we intend to inherit from Test.
-  virtual ~Test();
-
-  // Sets up the stuff shared by all tests in this test case.
-  //
-  // Google Test will call Foo::SetUpTestCase() before running the first
-  // test in test case Foo.  Hence a sub-class can define its own
-  // SetUpTestCase() method to shadow the one defined in the super
-  // class.
-  static void SetUpTestCase() {}
-
-  // Tears down the stuff shared by all tests in this test case.
-  //
-  // Google Test will call Foo::TearDownTestCase() after running the last
-  // test in test case Foo.  Hence a sub-class can define its own
-  // TearDownTestCase() method to shadow the one defined in the super
-  // class.
-  static void TearDownTestCase() {}
-
-  // Returns true iff the current test has a fatal failure.
-  static bool HasFatalFailure();
-
-  // Returns true iff the current test has a non-fatal failure.
-  static bool HasNonfatalFailure();
-
-  // Returns true iff the current test has a (either fatal or
-  // non-fatal) failure.
-  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
-
-  // Logs a property for the current test.  Only the last value for a given
-  // key is remembered.
-  // These are public static so they can be called from utility functions
-  // that are not members of the test fixture.
-  // The arguments are const char* instead strings, as Google Test is used
-  // on platforms where string doesn't compile.
-  //
-  // Note that a driving consideration for these RecordProperty methods
-  // was to produce xml output suited to the Greenspan charting utility,
-  // which at present will only chart values that fit in a 32-bit int. It
-  // is the user's responsibility to restrict their values to 32-bit ints
-  // if they intend them to be used with Greenspan.
-  static void RecordProperty(const char* key, const char* value);
-  static void RecordProperty(const char* key, int value);
-
- protected:
-  // Creates a Test object.
-  Test();
-
-  // Sets up the test fixture.
-  virtual void SetUp();
-
-  // Tears down the test fixture.
-  virtual void TearDown();
-
- private:
-  // Returns true iff the current test has the same fixture class as
-  // the first test in the current test case.
-  static bool HasSameFixtureClass();
-
-  // Runs the test after the test fixture has been set up.
-  //
-  // A sub-class must implement this to define the test logic.
-  //
-  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
-  // Instead, use the TEST or TEST_F macro.
-  virtual void TestBody() = 0;
-
-  // Sets up, executes, and tears down the test.
-  void Run();
-
-  // Deletes self.  We deliberately pick an unusual name for this
-  // internal method to avoid clashing with names used in user TESTs.
-  void DeleteSelf_() { delete this; }
-
-  // Uses a GTestFlagSaver to save and restore all Google Test flags.
-  const internal::GTestFlagSaver* const gtest_flag_saver_;
-
-  // Often a user mis-spells SetUp() as Setup() and spends a long time
-  // wondering why it is never called by Google Test.  The declaration of
-  // the following method is solely for catching such an error at
-  // compile time:
-  //
-  //   - The return type is deliberately chosen to be not void, so it
-  //   will be a conflict if a user declares void Setup() in his test
-  //   fixture.
-  //
-  //   - This method is private, so it will be another compiler error
-  //   if a user calls it from his test fixture.
-  //
-  // DO NOT OVERRIDE THIS FUNCTION.
-  //
-  // If you see an error about overriding the following function or
-  // about it being private, you have mis-spelled SetUp() as Setup().
-  struct Setup_should_be_spelled_SetUp {};
-  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-
-  // We disallow copying Tests.
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
-};
-
-typedef internal::TimeInMillis TimeInMillis;
-
-// A copyable object representing a user specified test property which can be
-// output as a key/value string pair.
-//
-// Don't inherit from TestProperty as its destructor is not virtual.
-class TestProperty {
- public:
-  // C'tor.  TestProperty does NOT have a default constructor.
-  // Always use this constructor (with parameters) to create a
-  // TestProperty object.
-  TestProperty(const char* a_key, const char* a_value) :
-    key_(a_key), value_(a_value) {
-  }
-
-  // Gets the user supplied key.
-  const char* key() const {
-    return key_.c_str();
-  }
-
-  // Gets the user supplied value.
-  const char* value() const {
-    return value_.c_str();
-  }
-
-  // Sets a new value, overriding the one supplied in the constructor.
-  void SetValue(const char* new_value) {
-    value_ = new_value;
-  }
-
- private:
-  // The key supplied by the user.
-  internal::String key_;
-  // The value supplied by the user.
-  internal::String value_;
-};
-
-// The result of a single Test.  This includes a list of
-// TestPartResults, a list of TestProperties, a count of how many
-// death tests there are in the Test, and how much time it took to run
-// the Test.
-//
-// TestResult is not copyable.
-class GTEST_API_ TestResult {
- public:
-  // Creates an empty TestResult.
-  TestResult();
-
-  // D'tor.  Do not inherit from TestResult.
-  ~TestResult();
-
-  // Gets the number of all test parts.  This is the sum of the number
-  // of successful test parts and the number of failed test parts.
-  int total_part_count() const;
-
-  // Returns the number of the test properties.
-  int test_property_count() const;
-
-  // Returns true iff the test passed (i.e. no test part failed).
-  bool Passed() const { return !Failed(); }
-
-  // Returns true iff the test failed.
-  bool Failed() const;
-
-  // Returns true iff the test fatally failed.
-  bool HasFatalFailure() const;
-
-  // Returns true iff the test has a non-fatal failure.
-  bool HasNonfatalFailure() const;
-
-  // Returns the elapsed time, in milliseconds.
-  TimeInMillis elapsed_time() const { return elapsed_time_; }
-
-  // Returns the i-th test part result among all the results. i can range
-  // from 0 to test_property_count() - 1. If i is not in that range, aborts
-  // the program.
-  const TestPartResult& GetTestPartResult(int i) const;
-
-  // Returns the i-th test property. i can range from 0 to
-  // test_property_count() - 1. If i is not in that range, aborts the
-  // program.
-  const TestProperty& GetTestProperty(int i) const;
-
- private:
-  friend class TestInfo;
-  friend class UnitTest;
-  friend class internal::DefaultGlobalTestPartResultReporter;
-  friend class internal::ExecDeathTest;
-  friend class internal::TestResultAccessor;
-  friend class internal::UnitTestImpl;
-  friend class internal::WindowsDeathTest;
-
-  // Gets the vector of TestPartResults.
-  const std::vector<TestPartResult>& test_part_results() const {
-    return test_part_results_;
-  }
-
-  // Gets the vector of TestProperties.
-  const std::vector<TestProperty>& test_properties() const {
-    return test_properties_;
-  }
-
-  // Sets the elapsed time.
-  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
-
-  // Adds a test property to the list. The property is validated and may add
-  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
-  // key names). If a property is already recorded for the same key, the
-  // value will be updated, rather than storing multiple values for the same
-  // key.
-  void RecordProperty(const TestProperty& test_property);
-
-  // Adds a failure if the key is a reserved attribute of Google Test
-  // testcase tags.  Returns true if the property is valid.
-  // TODO(russr): Validate attribute names are legal and human readable.
-  static bool ValidateTestProperty(const TestProperty& test_property);
-
-  // Adds a test part result to the list.
-  void AddTestPartResult(const TestPartResult& test_part_result);
-
-  // Returns the death test count.
-  int death_test_count() const { return death_test_count_; }
-
-  // Increments the death test count, returning the new count.
-  int increment_death_test_count() { return ++death_test_count_; }
-
-  // Clears the test part results.
-  void ClearTestPartResults();
-
-  // Clears the object.
-  void Clear();
-
-  // Protects mutable state of the property vector and of owned
-  // properties, whose values may be updated.
-  internal::Mutex test_properites_mutex_;
-
-  // The vector of TestPartResults
-  std::vector<TestPartResult> test_part_results_;
-  // The vector of TestProperties
-  std::vector<TestProperty> test_properties_;
-  // Running count of death tests.
-  int death_test_count_;
-  // The elapsed time, in milliseconds.
-  TimeInMillis elapsed_time_;
-
-  // We disallow copying TestResult.
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
-};  // class TestResult
-
-// A TestInfo object stores the following information about a test:
-//
-//   Test case name
-//   Test name
-//   Whether the test should be run
-//   A function pointer that creates the test object when invoked
-//   Test result
-//
-// The constructor of TestInfo registers itself with the UnitTest
-// singleton such that the RUN_ALL_TESTS() macro knows which tests to
-// run.
-class GTEST_API_ TestInfo {
- public:
-  // Destructs a TestInfo object.  This function is not virtual, so
-  // don't inherit from TestInfo.
-  ~TestInfo();
-
-  // Returns the test case name.
-  const char* test_case_name() const { return test_case_name_.c_str(); }
-
-  // Returns the test name.
-  const char* name() const { return name_.c_str(); }
-
-  // Returns the name of the parameter type, or NULL if this is not a typed
-  // or a type-parameterized test.
-  const char* type_param() const {
-    if (type_param_.get() != NULL)
-      return type_param_->c_str();
-    return NULL;
-  }
-
-  // Returns the text representation of the value parameter, or NULL if this
-  // is not a value-parameterized test.
-  const char* value_param() const {
-    if (value_param_.get() != NULL)
-      return value_param_->c_str();
-    return NULL;
-  }
-
-  // Returns true if this test should run, that is if the test is not disabled
-  // (or it is disabled but the also_run_disabled_tests flag has been specified)
-  // and its full name matches the user-specified filter.
-  //
-  // Google Test allows the user to filter the tests by their full names.
-  // The full name of a test Bar in test case Foo is defined as
-  // "Foo.Bar".  Only the tests that match the filter will run.
-  //
-  // A filter is a colon-separated list of glob (not regex) patterns,
-  // optionally followed by a '-' and a colon-separated list of
-  // negative patterns (tests to exclude).  A test is run if it
-  // matches one of the positive patterns and does not match any of
-  // the negative patterns.
-  //
-  // For example, *A*:Foo.* is a filter that matches any string that
-  // contains the character 'A' or starts with "Foo.".
-  bool should_run() const { return should_run_; }
-
-  // Returns the result of the test.
-  const TestResult* result() const { return &result_; }
-
- private:
-
-#if GTEST_HAS_DEATH_TEST
-  friend class internal::DefaultDeathTestFactory;
-#endif  // GTEST_HAS_DEATH_TEST
-  friend class Test;
-  friend class TestCase;
-  friend class internal::UnitTestImpl;
-  friend TestInfo* internal::MakeAndRegisterTestInfo(
-      const char* test_case_name, const char* name,
-      const char* type_param,
-      const char* value_param,
-      internal::TypeId fixture_class_id,
-      Test::SetUpTestCaseFunc set_up_tc,
-      Test::TearDownTestCaseFunc tear_down_tc,
-      internal::TestFactoryBase* factory);
-
-  // Constructs a TestInfo object. The newly constructed instance assumes
-  // ownership of the factory object.
-  TestInfo(const char* test_case_name, const char* name,
-           const char* a_type_param,
-           const char* a_value_param,
-           internal::TypeId fixture_class_id,
-           internal::TestFactoryBase* factory);
-
-  // Increments the number of death tests encountered in this test so
-  // far.
-  int increment_death_test_count() {
-    return result_.increment_death_test_count();
-  }
-
-  // Creates the test object, runs it, records its result, and then
-  // deletes it.
-  void Run();
-
-  static void ClearTestResult(TestInfo* test_info) {
-    test_info->result_.Clear();
-  }
-
-  // These fields are immutable properties of the test.
-  const std::string test_case_name_;     // Test case name
-  const std::string name_;               // Test name
-  // Name of the parameter type, or NULL if this is not a typed or a
-  // type-parameterized test.
-  const internal::scoped_ptr<const ::std::string> type_param_;
-  // Text representation of the value parameter, or NULL if this is not a
-  // value-parameterized test.
-  const internal::scoped_ptr<const ::std::string> value_param_;
-  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
-  bool should_run_;                 // True iff this test should run
-  bool is_disabled_;                // True iff this test is disabled
-  bool matches_filter_;             // True if this test matches the
-                                    // user-specified filter.
-  internal::TestFactoryBase* const factory_;  // The factory that creates
-                                              // the test object
-
-  // This field is mutable and needs to be reset before running the
-  // test for the second time.
-  TestResult result_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
-};
-
-// A test case, which consists of a vector of TestInfos.
-//
-// TestCase is not copyable.
-class GTEST_API_ TestCase {
- public:
-  // Creates a TestCase with the given name.
-  //
-  // TestCase does NOT have a default constructor.  Always use this
-  // constructor to create a TestCase object.
-  //
-  // Arguments:
-  //
-  //   name:         name of the test case
-  //   a_type_param: the name of the test's type parameter, or NULL if
-  //                 this is not a type-parameterized test.
-  //   set_up_tc:    pointer to the function that sets up the test case
-  //   tear_down_tc: pointer to the function that tears down the test case
-  TestCase(const char* name, const char* a_type_param,
-           Test::SetUpTestCaseFunc set_up_tc,
-           Test::TearDownTestCaseFunc tear_down_tc);
-
-  // Destructor of TestCase.
-  virtual ~TestCase();
-
-  // Gets the name of the TestCase.
-  const char* name() const { return name_.c_str(); }
-
-  // Returns the name of the parameter type, or NULL if this is not a
-  // type-parameterized test case.
-  const char* type_param() const {
-    if (type_param_.get() != NULL)
-      return type_param_->c_str();
-    return NULL;
-  }
-
-  // Returns true if any test in this test case should run.
-  bool should_run() const { return should_run_; }
-
-  // Gets the number of successful tests in this test case.
-  int successful_test_count() const;
-
-  // Gets the number of failed tests in this test case.
-  int failed_test_count() const;
-
-  // Gets the number of disabled tests in this test case.
-  int disabled_test_count() const;
-
-  // Get the number of tests in this test case that should run.
-  int test_to_run_count() const;
-
-  // Gets the number of all tests in this test case.
-  int total_test_count() const;
-
-  // Returns true iff the test case passed.
-  bool Passed() const { return !Failed(); }
-
-  // Returns true iff the test case failed.
-  bool Failed() const { return failed_test_count() > 0; }
-
-  // Returns the elapsed time, in milliseconds.
-  TimeInMillis elapsed_time() const { return elapsed_time_; }
-
-  // Returns the i-th test among all the tests. i can range from 0 to
-  // total_test_count() - 1. If i is not in that range, returns NULL.
-  const TestInfo* GetTestInfo(int i) const;
-
- private:
-  friend class Test;
-  friend class internal::UnitTestImpl;
-
-  // Gets the (mutable) vector of TestInfos in this TestCase.
-  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
-
-  // Gets the (immutable) vector of TestInfos in this TestCase.
-  const std::vector<TestInfo*>& test_info_list() const {
-    return test_info_list_;
-  }
-
-  // Returns the i-th test among all the tests. i can range from 0 to
-  // total_test_count() - 1. If i is not in that range, returns NULL.
-  TestInfo* GetMutableTestInfo(int i);
-
-  // Sets the should_run member.
-  void set_should_run(bool should) { should_run_ = should; }
-
-  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
-  // destruction of the TestCase object.
-  void AddTestInfo(TestInfo * test_info);
-
-  // Clears the results of all tests in this test case.
-  void ClearResult();
-
-  // Clears the results of all tests in the given test case.
-  static void ClearTestCaseResult(TestCase* test_case) {
-    test_case->ClearResult();
-  }
-
-  // Runs every test in this TestCase.
-  void Run();
-
-  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
-  // for catching exceptions thrown from SetUpTestCase().
-  void RunSetUpTestCase() { (*set_up_tc_)(); }
-
-  // Runs TearDownTestCase() for this TestCase.  This wrapper is
-  // needed for catching exceptions thrown from TearDownTestCase().
-  void RunTearDownTestCase() { (*tear_down_tc_)(); }
-
-  // Returns true iff test passed.
-  static bool TestPassed(const TestInfo* test_info) {
-    return test_info->should_run() && test_info->result()->Passed();
-  }
-
-  // Returns true iff test failed.
-  static bool TestFailed(const TestInfo* test_info) {
-    return test_info->should_run() && test_info->result()->Failed();
-  }
-
-  // Returns true iff test is disabled.
-  static bool TestDisabled(const TestInfo* test_info) {
-    return test_info->is_disabled_;
-  }
-
-  // Returns true if the given test should run.
-  static bool ShouldRunTest(const TestInfo* test_info) {
-    return test_info->should_run();
-  }
-
-  // Shuffles the tests in this test case.
-  void ShuffleTests(internal::Random* random);
-
-  // Restores the test order to before the first shuffle.
-  void UnshuffleTests();
-
-  // Name of the test case.
-  internal::String name_;
-  // Name of the parameter type, or NULL if this is not a typed or a
-  // type-parameterized test.
-  const internal::scoped_ptr<const ::std::string> type_param_;
-  // The vector of TestInfos in their original order.  It owns the
-  // elements in the vector.
-  std::vector<TestInfo*> test_info_list_;
-  // Provides a level of indirection for the test list to allow easy
-  // shuffling and restoring the test order.  The i-th element in this
-  // vector is the index of the i-th test in the shuffled test list.
-  std::vector<int> test_indices_;
-  // Pointer to the function that sets up the test case.
-  Test::SetUpTestCaseFunc set_up_tc_;
-  // Pointer to the function that tears down the test case.
-  Test::TearDownTestCaseFunc tear_down_tc_;
-  // True iff any test in this test case should run.
-  bool should_run_;
-  // Elapsed time, in milliseconds.
-  TimeInMillis elapsed_time_;
-
-  // We disallow copying TestCases.
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
-};
-
-// An Environment object is capable of setting up and tearing down an
-// environment.  The user should subclass this to define his own
-// environment(s).
-//
-// An Environment object does the set-up and tear-down in virtual
-// methods SetUp() and TearDown() instead of the constructor and the
-// destructor, as:
-//
-//   1. You cannot safely throw from a destructor.  This is a problem
-//      as in some cases Google Test is used where exceptions are enabled, and
-//      we may want to implement ASSERT_* using exceptions where they are
-//      available.
-//   2. You cannot use ASSERT_* directly in a constructor or
-//      destructor.
-class Environment {
- public:
-  // The d'tor is virtual as we need to subclass Environment.
-  virtual ~Environment() {}
-
-  // Override this to define how to set up the environment.
-  virtual void SetUp() {}
-
-  // Override this to define how to tear down the environment.
-  virtual void TearDown() {}
- private:
-  // If you see an error about overriding the following function or
-  // about it being private, you have mis-spelled SetUp() as Setup().
-  struct Setup_should_be_spelled_SetUp {};
-  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-};
-
-// The interface for tracing execution of tests. The methods are organized in
-// the order the corresponding events are fired.
-class TestEventListener {
- public:
-  virtual ~TestEventListener() {}
-
-  // Fired before any test activity starts.
-  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
-
-  // Fired before each iteration of tests starts.  There may be more than
-  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
-  // index, starting from 0.
-  virtual void OnTestIterationStart(const UnitTest& unit_test,
-                                    int iteration) = 0;
-
-  // Fired before environment set-up for each iteration of tests starts.
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
-
-  // Fired after environment set-up for each iteration of tests ends.
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
-
-  // Fired before the test case starts.
-  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
-
-  // Fired before the test starts.
-  virtual void OnTestStart(const TestInfo& test_info) = 0;
-
-  // Fired after a failed assertion or a SUCCEED() invocation.
-  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
-
-  // Fired after the test ends.
-  virtual void OnTestEnd(const TestInfo& test_info) = 0;
-
-  // Fired after the test case ends.
-  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
-
-  // Fired before environment tear-down for each iteration of tests starts.
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
-
-  // Fired after environment tear-down for each iteration of tests ends.
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
-
-  // Fired after each iteration of tests finishes.
-  virtual void OnTestIterationEnd(const UnitTest& unit_test,
-                                  int iteration) = 0;
-
-  // Fired after all test activities have ended.
-  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
-};
-
-// The convenience class for users who need to override just one or two
-// methods and are not concerned that a possible change to a signature of
-// the methods they override will not be caught during the build.  For
-// comments about each method please see the definition of TestEventListener
-// above.
-class EmptyTestEventListener : public TestEventListener {
- public:
-  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
-                                    int /*iteration*/) {}
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
-  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
-  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
-  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
-  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
-                                  int /*iteration*/) {}
-  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-};
-
-// TestEventListeners lets users add listeners to track events in Google Test.
-class GTEST_API_ TestEventListeners {
- public:
-  TestEventListeners();
-  ~TestEventListeners();
-
-  // Appends an event listener to the end of the list. Google Test assumes
-  // the ownership of the listener (i.e. it will delete the listener when
-  // the test program finishes).
-  void Append(TestEventListener* listener);
-
-  // Removes the given event listener from the list and returns it.  It then
-  // becomes the caller's responsibility to delete the listener. Returns
-  // NULL if the listener is not found in the list.
-  TestEventListener* Release(TestEventListener* listener);
-
-  // Returns the standard listener responsible for the default console
-  // output.  Can be removed from the listeners list to shut down default
-  // console output.  Note that removing this object from the listener list
-  // with Release transfers its ownership to the caller and makes this
-  // function return NULL the next time.
-  TestEventListener* default_result_printer() const {
-    return default_result_printer_;
-  }
-
-  // Returns the standard listener responsible for the default XML output
-  // controlled by the --gtest_output=xml flag.  Can be removed from the
-  // listeners list by users who want to shut down the default XML output
-  // controlled by this flag and substitute it with custom one.  Note that
-  // removing this object from the listener list with Release transfers its
-  // ownership to the caller and makes this function return NULL the next
-  // time.
-  TestEventListener* default_xml_generator() const {
-    return default_xml_generator_;
-  }
-
- private:
-  friend class TestCase;
-  friend class TestInfo;
-  friend class internal::DefaultGlobalTestPartResultReporter;
-  friend class internal::NoExecDeathTest;
-  friend class internal::TestEventListenersAccessor;
-  friend class internal::UnitTestImpl;
-
-  // Returns repeater that broadcasts the TestEventListener events to all
-  // subscribers.
-  TestEventListener* repeater();
-
-  // Sets the default_result_printer attribute to the provided listener.
-  // The listener is also added to the listener list and previous
-  // default_result_printer is removed from it and deleted. The listener can
-  // also be NULL in which case it will not be added to the list. Does
-  // nothing if the previous and the current listener objects are the same.
-  void SetDefaultResultPrinter(TestEventListener* listener);
-
-  // Sets the default_xml_generator attribute to the provided listener.  The
-  // listener is also added to the listener list and previous
-  // default_xml_generator is removed from it and deleted. The listener can
-  // also be NULL in which case it will not be added to the list. Does
-  // nothing if the previous and the current listener objects are the same.
-  void SetDefaultXmlGenerator(TestEventListener* listener);
-
-  // Controls whether events will be forwarded by the repeater to the
-  // listeners in the list.
-  bool EventForwardingEnabled() const;
-  void SuppressEventForwarding();
-
-  // The actual list of listeners.
-  internal::TestEventRepeater* repeater_;
-  // Listener responsible for the standard result output.
-  TestEventListener* default_result_printer_;
-  // Listener responsible for the creation of the XML output file.
-  TestEventListener* default_xml_generator_;
-
-  // We disallow copying TestEventListeners.
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
-};
-
-// A UnitTest consists of a vector of TestCases.
-//
-// This is a singleton class.  The only instance of UnitTest is
-// created when UnitTest::GetInstance() is first called.  This
-// instance is never deleted.
-//
-// UnitTest is not copyable.
-//
-// This class is thread-safe as long as the methods are called
-// according to their specification.
-class GTEST_API_ UnitTest {
- public:
-  // Gets the singleton UnitTest object.  The first time this method
-  // is called, a UnitTest object is constructed and returned.
-  // Consecutive calls will return the same object.
-  static UnitTest* GetInstance();
-
-  // Runs all tests in this UnitTest object and prints the result.
-  // Returns 0 if successful, or 1 otherwise.
-  //
-  // This method can only be called from the main thread.
-  //
-  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-  int Run() GTEST_MUST_USE_RESULT_;
-
-  // Returns the working directory when the first TEST() or TEST_F()
-  // was executed.  The UnitTest object owns the string.
-  const char* original_working_dir() const;
-
-  // Returns the TestCase object for the test that's currently running,
-  // or NULL if no test is running.
-  const TestCase* current_test_case() const;
-
-  // Returns the TestInfo object for the test that's currently running,
-  // or NULL if no test is running.
-  const TestInfo* current_test_info() const;
-
-  // Returns the random seed used at the start of the current test run.
-  int random_seed() const;
-
-#if GTEST_HAS_PARAM_TEST
-  // Returns the ParameterizedTestCaseRegistry object used to keep track of
-  // value-parameterized tests and instantiate and register them.
-  //
-  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
-#endif  // GTEST_HAS_PARAM_TEST
-
-  // Gets the number of successful test cases.
-  int successful_test_case_count() const;
-
-  // Gets the number of failed test cases.
-  int failed_test_case_count() const;
-
-  // Gets the number of all test cases.
-  int total_test_case_count() const;
-
-  // Gets the number of all test cases that contain at least one test
-  // that should run.
-  int test_case_to_run_count() const;
-
-  // Gets the number of successful tests.
-  int successful_test_count() const;
-
-  // Gets the number of failed tests.
-  int failed_test_count() const;
-
-  // Gets the number of disabled tests.
-  int disabled_test_count() const;
-
-  // Gets the number of all tests.
-  int total_test_count() const;
-
-  // Gets the number of tests that should run.
-  int test_to_run_count() const;
-
-  // Gets the elapsed time, in milliseconds.
-  TimeInMillis elapsed_time() const;
-
-  // Returns true iff the unit test passed (i.e. all test cases passed).
-  bool Passed() const;
-
-  // Returns true iff the unit test failed (i.e. some test case failed
-  // or something outside of all tests failed).
-  bool Failed() const;
-
-  // Gets the i-th test case among all the test cases. i can range from 0 to
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.
-  const TestCase* GetTestCase(int i) const;
-
-  // Returns the list of event listeners that can be used to track events
-  // inside Google Test.
-  TestEventListeners& listeners();
-
- private:
-  // Registers and returns a global test environment.  When a test
-  // program is run, all global test environments will be set-up in
-  // the order they were registered.  After all tests in the program
-  // have finished, all global test environments will be torn-down in
-  // the *reverse* order they were registered.
-  //
-  // The UnitTest object takes ownership of the given environment.
-  //
-  // This method can only be called from the main thread.
-  Environment* AddEnvironment(Environment* env);
-
-  // Adds a TestPartResult to the current TestResult object.  All
-  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
-  // eventually call this to report their results.  The user code
-  // should use the assertion macros instead of calling this directly.
-  void AddTestPartResult(TestPartResult::Type result_type,
-                         const char* file_name,
-                         int line_number,
-                         const internal::String& message,
-                         const internal::String& os_stack_trace);
-
-  // Adds a TestProperty to the current TestResult object. If the result already
-  // contains a property with the same key, the value will be updated.
-  void RecordPropertyForCurrentTest(const char* key, const char* value);
-
-  // Gets the i-th test case among all the test cases. i can range from 0 to
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.
-  TestCase* GetMutableTestCase(int i);
-
-  // Accessors for the implementation object.
-  internal::UnitTestImpl* impl() { return impl_; }
-  const internal::UnitTestImpl* impl() const { return impl_; }
-
-  // These classes and funcions are friends as they need to access private
-  // members of UnitTest.
-  friend class Test;
-  friend class internal::AssertHelper;
-  friend class internal::ScopedTrace;
-  friend Environment* AddGlobalTestEnvironment(Environment* env);
-  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
-  friend void internal::ReportFailureInUnknownLocation(
-      TestPartResult::Type result_type,
-      const internal::String& message);
-
-  // Creates an empty UnitTest.
-  UnitTest();
-
-  // D'tor
-  virtual ~UnitTest();
-
-  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
-  // Google Test trace stack.
-  void PushGTestTrace(const internal::TraceInfo& trace);
-
-  // Pops a trace from the per-thread Google Test trace stack.
-  void PopGTestTrace();
-
-  // Protects mutable state in *impl_.  This is mutable as some const
-  // methods need to lock it too.
-  mutable internal::Mutex mutex_;
-
-  // Opaque implementation object.  This field is never changed once
-  // the object is constructed.  We don't mark it as const here, as
-  // doing so will cause a warning in the constructor of UnitTest.
-  // Mutable state in *impl_ is protected by mutex_.
-  internal::UnitTestImpl* impl_;
-
-  // We disallow copying UnitTest.
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
-};
-
-// A convenient wrapper for adding an environment for the test
-// program.
-//
-// You should call this before RUN_ALL_TESTS() is called, probably in
-// main().  If you use gtest_main, you need to call this before main()
-// starts for it to take effect.  For example, you can define a global
-// variable like this:
-//
-//   testing::Environment* const foo_env =
-//       testing::AddGlobalTestEnvironment(new FooEnvironment);
-//
-// However, we strongly recommend you to write your own main() and
-// call AddGlobalTestEnvironment() there, as relying on initialization
-// of global variables makes the code harder to read and may cause
-// problems when you register multiple environments from different
-// translation units and the environments have dependencies among them
-// (remember that the compiler doesn't guarantee the order in which
-// global variables from different translation units are initialized).
-inline Environment* AddGlobalTestEnvironment(Environment* env) {
-  return UnitTest::GetInstance()->AddEnvironment(env);
-}
-
-// Initializes Google Test.  This must be called before calling
-// RUN_ALL_TESTS().  In particular, it parses a command line for the
-// flags that Google Test recognizes.  Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned.  Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-GTEST_API_ void InitGoogleTest(int* argc, char** argv);
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
-
-namespace internal {
-
-// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
-// operand to be used in a failure message.  The type (but not value)
-// of the other operand may affect the format.  This allows us to
-// print a char* as a raw pointer when it is compared against another
-// char*, and print it as a C string when it is compared against an
-// std::string object, for example.
-//
-// The default implementation ignores the type of the other operand.
-// Some specialized versions are used to handle formatting wide or
-// narrow C strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename T1, typename T2>
-String FormatForComparisonFailureMessage(const T1& value,
-                                         const T2& /* other_operand */) {
-  // C++Builder compiles this incorrectly if the namespace isn't explicitly
-  // given.
-  return ::testing::PrintToString(value);
-}
-
-// The helper function for {ASSERT|EXPECT}_EQ.
-template <typename T1, typename T2>
-AssertionResult CmpHelperEQ(const char* expected_expression,
-                            const char* actual_expression,
-                            const T1& expected,
-                            const T2& actual) {
-#ifdef _MSC_VER
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4389)  // Temporarily disables warning on
-                               // signed/unsigned mismatch.
-#endif
-
-  if (expected == actual) {
-    return AssertionSuccess();
-  }
-
-#ifdef _MSC_VER
-# pragma warning(pop)          // Restores the warning state.
-#endif
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   FormatForComparisonFailureMessage(expected, actual),
-                   FormatForComparisonFailureMessage(actual, expected),
-                   false);
-}
-
-// With this overloaded version, we allow anonymous enums to be used
-// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
-// can be implicitly cast to BiggestInt.
-GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
-                                       const char* actual_expression,
-                                       BiggestInt expected,
-                                       BiggestInt actual);
-
-// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
-// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
-// is a null pointer literal.  The following default implementation is
-// for lhs_is_null_literal being false.
-template <bool lhs_is_null_literal>
-class EqHelper {
- public:
-  // This templatized version is for the general case.
-  template <typename T1, typename T2>
-  static AssertionResult Compare(const char* expected_expression,
-                                 const char* actual_expression,
-                                 const T1& expected,
-                                 const T2& actual) {
-    return CmpHelperEQ(expected_expression, actual_expression, expected,
-                       actual);
-  }
-
-  // With this overloaded version, we allow anonymous enums to be used
-  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
-  // enums can be implicitly cast to BiggestInt.
-  //
-  // Even though its body looks the same as the above version, we
-  // cannot merge the two, as it will make anonymous enums unhappy.
-  static AssertionResult Compare(const char* expected_expression,
-                                 const char* actual_expression,
-                                 BiggestInt expected,
-                                 BiggestInt actual) {
-    return CmpHelperEQ(expected_expression, actual_expression, expected,
-                       actual);
-  }
-};
-
-// This specialization is used when the first argument to ASSERT_EQ()
-// is a null pointer literal, like NULL, false, or 0.
-template <>
-class EqHelper<true> {
- public:
-  // We define two overloaded versions of Compare().  The first
-  // version will be picked when the second argument to ASSERT_EQ() is
-  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
-  // EXPECT_EQ(false, a_bool).
-  template <typename T1, typename T2>
-  static AssertionResult Compare(
-      const char* expected_expression,
-      const char* actual_expression,
-      const T1& expected,
-      const T2& actual,
-      // The following line prevents this overload from being considered if T2
-      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
-      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
-      // to match the Secret* in the other overload, which would otherwise make
-      // this template match better.
-      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
-    return CmpHelperEQ(expected_expression, actual_expression, expected,
-                       actual);
-  }
-
-  // This version will be picked when the second argument to ASSERT_EQ() is a
-  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
-  template <typename T>
-  static AssertionResult Compare(
-      const char* expected_expression,
-      const char* actual_expression,
-      // We used to have a second template parameter instead of Secret*.  That
-      // template parameter would deduce to 'long', making this a better match
-      // than the first overload even without the first overload's EnableIf.
-      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
-      // non-pointer argument" (even a deduced integral argument), so the old
-      // implementation caused warnings in user code.
-      Secret* /* expected (NULL) */,
-      T* actual) {
-    // We already know that 'expected' is a null pointer.
-    return CmpHelperEQ(expected_expression, actual_expression,
-                       static_cast<T*>(NULL), actual);
-  }
-};
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
-// of similar code.
-//
-// For each templatized helper function, we also define an overloaded
-// version for BiggestInt in order to reduce code bloat and allow
-// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
-// with gcc 4.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-template <typename T1, typename T2>\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
-                                   const T1& val1, const T2& val2) {\
-  if (val1 op val2) {\
-    return AssertionSuccess();\
-  } else {\
-    return AssertionFailure() \
-        << "Expected: (" << expr1 << ") " #op " (" << expr2\
-        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
-        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
-  }\
-}\
-GTEST_API_ AssertionResult CmpHelper##op_name(\
-    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-
-// Implements the helper function for {ASSERT|EXPECT}_NE
-GTEST_IMPL_CMP_HELPER_(NE, !=);
-// Implements the helper function for {ASSERT|EXPECT}_LE
-GTEST_IMPL_CMP_HELPER_(LE, <=);
-// Implements the helper function for {ASSERT|EXPECT}_LT
-GTEST_IMPL_CMP_HELPER_(LT, < );
-// Implements the helper function for {ASSERT|EXPECT}_GE
-GTEST_IMPL_CMP_HELPER_(GE, >=);
-// Implements the helper function for {ASSERT|EXPECT}_GT
-GTEST_IMPL_CMP_HELPER_(GT, > );
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
-                                          const char* actual_expression,
-                                          const char* expected,
-                                          const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
-                                              const char* actual_expression,
-                                              const char* expected,
-                                              const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
-                                          const char* s2_expression,
-                                          const char* s1,
-                                          const char* s2);
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
-                                              const char* s2_expression,
-                                              const char* s1,
-                                              const char* s2);
-
-
-// Helper function for *_STREQ on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
-                                          const char* actual_expression,
-                                          const wchar_t* expected,
-                                          const wchar_t* actual);
-
-// Helper function for *_STRNE on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
-                                          const char* s2_expression,
-                                          const wchar_t* s1,
-                                          const wchar_t* s2);
-
-}  // namespace internal
-
-// IsSubstring() and IsNotSubstring() are intended to be used as the
-// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
-// themselves.  They check whether needle is a substring of haystack
-// (NULL is considered a substring of itself only), and return an
-// appropriate error message when they fail.
-//
-// The {needle,haystack}_expr arguments are the stringified
-// expressions that generated the two real arguments.
-GTEST_API_ AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::string& needle, const ::std::string& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::string& needle, const ::std::string& haystack);
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::wstring& needle, const ::std::wstring& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::wstring& needle, const ::std::wstring& haystack);
-#endif  // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-// Helper template function for comparing floating-points.
-//
-// Template parameter:
-//
-//   RawType: the raw floating-point type (either float or double)
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename RawType>
-AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
-                                         const char* actual_expression,
-                                         RawType expected,
-                                         RawType actual) {
-  const FloatingPoint<RawType> lhs(expected), rhs(actual);
-
-  if (lhs.AlmostEquals(rhs)) {
-    return AssertionSuccess();
-  }
-
-  ::std::stringstream expected_ss;
-  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
-              << expected;
-
-  ::std::stringstream actual_ss;
-  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
-            << actual;
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   StringStreamToString(&expected_ss),
-                   StringStreamToString(&actual_ss),
-                   false);
-}
-
-// Helper function for implementing ASSERT_NEAR.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
-                                                const char* expr2,
-                                                const char* abs_error_expr,
-                                                double val1,
-                                                double val2,
-                                                double abs_error);
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-// A class that enables one to stream messages to assertion macros
-class GTEST_API_ AssertHelper {
- public:
-  // Constructor.
-  AssertHelper(TestPartResult::Type type,
-               const char* file,
-               int line,
-               const char* message);
-  ~AssertHelper();
-
-  // Message assignment is a semantic trick to enable assertion
-  // streaming; see the GTEST_MESSAGE_ macro below.
-  void operator=(const Message& message) const;
-
- private:
-  // We put our data in a struct so that the size of the AssertHelper class can
-  // be as small as possible.  This is important because gcc is incapable of
-  // re-using stack space even for temporary variables, so every EXPECT_EQ
-  // reserves stack space for another AssertHelper.
-  struct AssertHelperData {
-    AssertHelperData(TestPartResult::Type t,
-                     const char* srcfile,
-                     int line_num,
-                     const char* msg)
-        : type(t), file(srcfile), line(line_num), message(msg) { }
-
-    TestPartResult::Type const type;
-    const char*        const file;
-    int                const line;
-    String             const message;
-
-   private:
-    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
-  };
-
-  AssertHelperData* const data_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
-};
-
-}  // namespace internal
-
-#if GTEST_HAS_PARAM_TEST
-// The pure interface class that all value-parameterized tests inherit from.
-// A value-parameterized class must inherit from both ::testing::Test and
-// ::testing::WithParamInterface. In most cases that just means inheriting
-// from ::testing::TestWithParam, but more complicated test hierarchies
-// may need to inherit from Test and WithParamInterface at different levels.
-//
-// This interface has support for accessing the test parameter value via
-// the GetParam() method.
-//
-// Use it with one of the parameter generator defining functions, like Range(),
-// Values(), ValuesIn(), Bool(), and Combine().
-//
-// class FooTest : public ::testing::TestWithParam<int> {
-//  protected:
-//   FooTest() {
-//     // Can use GetParam() here.
-//   }
-//   virtual ~FooTest() {
-//     // Can use GetParam() here.
-//   }
-//   virtual void SetUp() {
-//     // Can use GetParam() here.
-//   }
-//   virtual void TearDown {
-//     // Can use GetParam() here.
-//   }
-// };
-// TEST_P(FooTest, DoesBar) {
-//   // Can use GetParam() method here.
-//   Foo foo;
-//   ASSERT_TRUE(foo.DoesBar(GetParam()));
-// }
-// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
-
-template <typename T>
-class WithParamInterface {
- public:
-  typedef T ParamType;
-  virtual ~WithParamInterface() {}
-
-  // The current parameter value. Is also available in the test fixture's
-  // constructor. This member function is non-static, even though it only
-  // references static data, to reduce the opportunity for incorrect uses
-  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
-  // uses a fixture whose parameter type is int.
-  const ParamType& GetParam() const { return *parameter_; }
-
- private:
-  // Sets parameter value. The caller is responsible for making sure the value
-  // remains alive and unchanged throughout the current test.
-  static void SetParam(const ParamType* parameter) {
-    parameter_ = parameter;
-  }
-
-  // Static value used for accessing parameter during a test lifetime.
-  static const ParamType* parameter_;
-
-  // TestClass must be a subclass of WithParamInterface<T> and Test.
-  template <class TestClass> friend class internal::ParameterizedTestFactory;
-};
-
-template <typename T>
-const T* WithParamInterface<T>::parameter_ = NULL;
-
-// Most value-parameterized classes can ignore the existence of
-// WithParamInterface, and can just inherit from ::testing::TestWithParam.
-
-template <typename T>
-class TestWithParam : public Test, public WithParamInterface<T> {
-};
-
-#endif  // GTEST_HAS_PARAM_TEST
-
-// Macros for indicating success/failure in test code.
-
-// ADD_FAILURE unconditionally adds a failure to the current test.
-// SUCCEED generates a success - it doesn't automatically make the
-// current test successful, as a test is only successful when it has
-// no failure.
-//
-// EXPECT_* verifies that a certain condition is satisfied.  If not,
-// it behaves like ADD_FAILURE.  In particular:
-//
-//   EXPECT_TRUE  verifies that a Boolean condition is true.
-//   EXPECT_FALSE verifies that a Boolean condition is false.
-//
-// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
-// that they will also abort the current function on failure.  People
-// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
-// writing data-driven tests often find themselves using ADD_FAILURE
-// and EXPECT_* more.
-//
-// Examples:
-//
-//   EXPECT_TRUE(server.StatusIsOK());
-//   ASSERT_FALSE(server.HasPendingRequest(port))
-//       << "There are still pending requests " << "on port " << port;
-
-// Generates a nonfatal failure with a generic message.
-#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
-
-// Generates a nonfatal failure at the given source file location with
-// a generic message.
-#define ADD_FAILURE_AT(file, line) \
-  GTEST_MESSAGE_AT_(file, line, "Failed", \
-                    ::testing::TestPartResult::kNonFatalFailure)
-
-// Generates a fatal failure with a generic message.
-#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
-
-// Define this macro to 1 to omit the definition of FAIL(), which is a
-// generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_FAIL
-# define FAIL() GTEST_FAIL()
-#endif
-
-// Generates a success with a generic message.
-#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
-
-// Define this macro to 1 to omit the definition of SUCCEED(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_SUCCEED
-# define SUCCEED() GTEST_SUCCEED()
-#endif
-
-// Macros for testing exceptions.
-//
-//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
-//         Tests that the statement throws the expected exception.
-//    * {ASSERT|EXPECT}_NO_THROW(statement):
-//         Tests that the statement doesn't throw any exception.
-//    * {ASSERT|EXPECT}_ANY_THROW(statement):
-//         Tests that the statement throws an exception.
-
-#define EXPECT_THROW(statement, expected_exception) \
-  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_NO_THROW(statement) \
-  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_ANY_THROW(statement) \
-  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_THROW(statement, expected_exception) \
-  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
-#define ASSERT_NO_THROW(statement) \
-  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
-#define ASSERT_ANY_THROW(statement) \
-  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
-
-// Boolean assertions. Condition can be either a Boolean expression or an
-// AssertionResult. For more information on how to use AssertionResult with
-// these macros see comments on that class.
-#define EXPECT_TRUE(condition) \
-  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
-                      GTEST_NONFATAL_FAILURE_)
-#define EXPECT_FALSE(condition) \
-  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
-                      GTEST_NONFATAL_FAILURE_)
-#define ASSERT_TRUE(condition) \
-  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
-                      GTEST_FATAL_FAILURE_)
-#define ASSERT_FALSE(condition) \
-  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
-                      GTEST_FATAL_FAILURE_)
-
-// Includes the auto-generated header that implements a family of
-// generic predicate assertion macros.
-#include "gtest/gtest_pred_impl.h"
-
-// Macros for testing equalities and inequalities.
-//
-//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
-//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
-//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
-//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
-//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
-//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
-//
-// When they are not, Google Test prints both the tested expressions and
-// their actual values.  The values must be compatible built-in types,
-// or you will get a compiler error.  By "compatible" we mean that the
-// values can be compared by the respective operator.
-//
-// Note:
-//
-//   1. It is possible to make a user-defined type work with
-//   {ASSERT|EXPECT}_??(), but that requires overloading the
-//   comparison operators and is thus discouraged by the Google C++
-//   Usage Guide.  Therefore, you are advised to use the
-//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
-//   equal.
-//
-//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
-//   pointers (in particular, C strings).  Therefore, if you use it
-//   with two C strings, you are testing how their locations in memory
-//   are related, not how their content is related.  To compare two C
-//   strings by content, use {ASSERT|EXPECT}_STR*().
-//
-//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
-//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
-//   what the actual value is when it fails, and similarly for the
-//   other comparisons.
-//
-//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
-//   evaluate their arguments, which is undefined.
-//
-//   5. These macros evaluate their arguments exactly once.
-//
-// Examples:
-//
-//   EXPECT_NE(5, Foo());
-//   EXPECT_EQ(NULL, a_pointer);
-//   ASSERT_LT(i, array_size);
-//   ASSERT_GT(records.size(), 0) << "There is no record left.";
-
-#define EXPECT_EQ(expected, actual) \
-  EXPECT_PRED_FORMAT2(::testing::internal:: \
-                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
-                      expected, actual)
-#define EXPECT_NE(expected, actual) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
-#define EXPECT_LE(val1, val2) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define EXPECT_LT(val1, val2) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define EXPECT_GE(val1, val2) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define EXPECT_GT(val1, val2) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-#define GTEST_ASSERT_EQ(expected, actual) \
-  ASSERT_PRED_FORMAT2(::testing::internal:: \
-                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
-                      expected, actual)
-#define GTEST_ASSERT_NE(val1, val2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
-#define GTEST_ASSERT_LE(val1, val2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define GTEST_ASSERT_LT(val1, val2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define GTEST_ASSERT_GE(val1, val2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define GTEST_ASSERT_GT(val1, val2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
-// ASSERT_XY(), which clashes with some users' own code.
-
-#if !GTEST_DONT_DEFINE_ASSERT_EQ
-# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_NE
-# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LE
-# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LT
-# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GE
-# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GT
-# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
-#endif
-
-// C String Comparisons.  All tests treat NULL and any non-NULL string
-// as different.  Two NULLs are equal.
-//
-//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
-//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
-//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
-//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
-//
-// For wide or narrow string objects, you can use the
-// {ASSERT|EXPECT}_??() macros.
-//
-// Don't depend on the order in which the arguments are evaluated,
-// which is undefined.
-//
-// These macros evaluate their arguments exactly once.
-
-#define EXPECT_STREQ(expected, actual) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define EXPECT_STRNE(s1, s2) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define EXPECT_STRCASEEQ(expected, actual) \
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define EXPECT_STRCASENE(s1, s2)\
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-#define ASSERT_STREQ(expected, actual) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define ASSERT_STRNE(s1, s2) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define ASSERT_STRCASEEQ(expected, actual) \
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define ASSERT_STRCASENE(s1, s2)\
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-// Macros for comparing floating-point numbers.
-//
-//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
-//         Tests that two float values are almost equal.
-//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
-//         Tests that two double values are almost equal.
-//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
-//         Tests that v1 and v2 are within the given distance to each other.
-//
-// Google Test uses ULP-based comparison to automatically pick a default
-// error bound that is appropriate for the operands.  See the
-// FloatingPoint template class in gtest-internal.h if you are
-// interested in the implementation details.
-
-#define EXPECT_FLOAT_EQ(expected, actual)\
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
-                      expected, actual)
-
-#define EXPECT_DOUBLE_EQ(expected, actual)\
-  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
-                      expected, actual)
-
-#define ASSERT_FLOAT_EQ(expected, actual)\
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
-                      expected, actual)
-
-#define ASSERT_DOUBLE_EQ(expected, actual)\
-  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
-                      expected, actual)
-
-#define EXPECT_NEAR(val1, val2, abs_error)\
-  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
-                      val1, val2, abs_error)
-
-#define ASSERT_NEAR(val1, val2, abs_error)\
-  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
-                      val1, val2, abs_error)
-
-// These predicate format functions work on floating-point values, and
-// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
-//
-//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
-
-// Asserts that val1 is less than, or almost equal to, val2.  Fails
-// otherwise.  In particular, it fails if either val1 or val2 is NaN.
-GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
-                                   float val1, float val2);
-GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
-                                    double val1, double val2);
-
-
-#if GTEST_OS_WINDOWS
-
-// Macros that test for HRESULT failure and success, these are only useful
-// on Windows, and rely on Windows SDK macros and APIs to compile.
-//
-//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
-//
-// When expr unexpectedly fails or succeeds, Google Test prints the
-// expected result and the actual result with both a human-readable
-// string representation of the error, if available, as well as the
-// hex result code.
-# define EXPECT_HRESULT_SUCCEEDED(expr) \
-    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define ASSERT_HRESULT_SUCCEEDED(expr) \
-    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define EXPECT_HRESULT_FAILED(expr) \
-    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-# define ASSERT_HRESULT_FAILED(expr) \
-    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-#endif  // GTEST_OS_WINDOWS
-
-// Macros that execute statement and check that it doesn't generate new fatal
-// failures in the current thread.
-//
-//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
-//
-// Examples:
-//
-//   EXPECT_NO_FATAL_FAILURE(Process());
-//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
-//
-#define ASSERT_NO_FATAL_FAILURE(statement) \
-    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
-#define EXPECT_NO_FATAL_FAILURE(statement) \
-    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
-
-// Causes a trace (including the source file path, the current line
-// number, and the given message) to be included in every test failure
-// message generated by code in the current scope.  The effect is
-// undone when the control leaves the current scope.
-//
-// The message argument can be anything streamable to std::ostream.
-//
-// In the implementation, we include the current line number as part
-// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
-// to appear in the same block - as long as they are on different
-// lines.
-#define SCOPED_TRACE(message) \
-  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
-    __FILE__, __LINE__, ::testing::Message() << (message))
-
-// Compile-time assertion for type equality.
-// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
-// the same type.  The value it returns is not interesting.
-//
-// Instead of making StaticAssertTypeEq a class template, we make it a
-// function template that invokes a helper class template.  This
-// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
-// defining objects of that type.
-//
-// CAVEAT:
-//
-// When used inside a method of a class template,
-// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
-// instantiated.  For example, given:
-//
-//   template <typename T> class Foo {
-//    public:
-//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
-//   };
-//
-// the code:
-//
-//   void Test1() { Foo<bool> foo; }
-//
-// will NOT generate a compiler error, as Foo<bool>::Bar() is never
-// actually instantiated.  Instead, you need:
-//
-//   void Test2() { Foo<bool> foo; foo.Bar(); }
-//
-// to cause a compiler error.
-template <typename T1, typename T2>
-bool StaticAssertTypeEq() {
-  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
-  return true;
-}
-
-// Defines a test.
-//
-// The first parameter is the name of the test case, and the second
-// parameter is the name of the test within the test case.
-//
-// The convention is to end the test case name with "Test".  For
-// example, a test case for the Foo class can be named FooTest.
-//
-// The user should put his test code between braces after using this
-// macro.  Example:
-//
-//   TEST(FooTest, InitializesCorrectly) {
-//     Foo foo;
-//     EXPECT_TRUE(foo.StatusIsOK());
-//   }
-
-// Note that we call GetTestTypeId() instead of GetTypeId<
-// ::testing::Test>() here to get the type ID of testing::Test.  This
-// is to work around a suspected linker bug when using Google Test as
-// a framework on Mac OS X.  The bug causes GetTypeId<
-// ::testing::Test>() to return different values depending on whether
-// the call is from the Google Test framework itself or from user test
-// code.  GetTestTypeId() is guaranteed to always return the same
-// value, as it always calls GetTypeId<>() from the Google Test
-// framework.
-#define GTEST_TEST(test_case_name, test_name)\
-  GTEST_TEST_(test_case_name, test_name, \
-              ::testing::Test, ::testing::internal::GetTestTypeId())
-
-// Define this macro to 1 to omit the definition of TEST(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_TEST
-# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
-#endif
-
-// Defines a test that uses a test fixture.
-//
-// The first parameter is the name of the test fixture class, which
-// also doubles as the test case name.  The second parameter is the
-// name of the test within the test case.
-//
-// A test fixture class must be declared earlier.  The user should put
-// his test code between braces after using this macro.  Example:
-//
-//   class FooTest : public testing::Test {
-//    protected:
-//     virtual void SetUp() { b_.AddElement(3); }
-//
-//     Foo a_;
-//     Foo b_;
-//   };
-//
-//   TEST_F(FooTest, InitializesCorrectly) {
-//     EXPECT_TRUE(a_.StatusIsOK());
-//   }
-//
-//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
-//     EXPECT_EQ(0, a_.size());
-//     EXPECT_EQ(1, b_.size());
-//   }
-
-#define TEST_F(test_fixture, test_name)\
-  GTEST_TEST_(test_fixture, test_name, test_fixture, \
-              ::testing::internal::GetTypeId<test_fixture>())
-
-// Use this macro in main() to run all tests.  It returns 0 if all
-// tests are successful, or 1 otherwise.
-//
-// RUN_ALL_TESTS() should be invoked after the command line has been
-// parsed by InitGoogleTest().
-
-#define RUN_ALL_TESTS()\
-  (::testing::UnitTest::GetInstance()->Run())
-
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest_pred_impl.h b/unit_tests/gtest/include/gtest/gtest_pred_impl.h
deleted file mode 100644
index 3805f85..0000000
--- a/unit_tests/gtest/include/gtest/gtest_pred_impl.h
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2006, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
-// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
-//
-// Implements a family of generic predicate assertion macros.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-
-// Makes sure this header is not included before gtest.h.
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
-#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
-
-// This header implements a family of generic predicate assertion
-// macros:
-//
-//   ASSERT_PRED_FORMAT1(pred_format, v1)
-//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
-//   ...
-//
-// where pred_format is a function or functor that takes n (in the
-// case of ASSERT_PRED_FORMATn) values and their source expression
-// text, and returns a testing::AssertionResult.  See the definition
-// of ASSERT_EQ in gtest.h for an example.
-//
-// If you don't care about formatting, you can use the more
-// restrictive version:
-//
-//   ASSERT_PRED1(pred, v1)
-//   ASSERT_PRED2(pred, v1, v2)
-//   ...
-//
-// where pred is an n-ary function or functor that returns bool,
-// and the values v1, v2, ..., must support the << operator for
-// streaming to std::ostream.
-//
-// We also define the EXPECT_* variations.
-//
-// For now we only support predicates whose arity is at most 5.
-// Please email googletestframework at googlegroups.com if you need
-// support for higher arities.
-
-// GTEST_ASSERT_ is the basic statement to which all of the assertions
-// in this file reduce.  Don't use this in your code.
-
-#define GTEST_ASSERT_(expression, on_failure) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (const ::testing::AssertionResult gtest_ar = (expression)) \
-    ; \
-  else \
-    on_failure(gtest_ar.failure_message())
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
-// this in your code.
-template <typename Pred,
-          typename T1>
-AssertionResult AssertPred1Helper(const char* pred_text,
-                                  const char* e1,
-                                  Pred pred,
-                                  const T1& v1) {
-  if (pred(v1)) return AssertionSuccess();
-
-  return AssertionFailure() << pred_text << "("
-                            << e1 << ") evaluates to false, where"
-                            << "\n" << e1 << " evaluates to " << v1;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, v1),\
-                on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
-// this in your code.
-#define GTEST_PRED1_(pred, v1, on_failure)\
-  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
-                                             #v1, \
-                                             pred, \
-                                             v1), on_failure)
-
-// Unary predicate assertion macros.
-#define EXPECT_PRED_FORMAT1(pred_format, v1) \
-  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED1(pred, v1) \
-  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT1(pred_format, v1) \
-  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED1(pred, v1) \
-  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
-// this in your code.
-template <typename Pred,
-          typename T1,
-          typename T2>
-AssertionResult AssertPred2Helper(const char* pred_text,
-                                  const char* e1,
-                                  const char* e2,
-                                  Pred pred,
-                                  const T1& v1,
-                                  const T2& v2) {
-  if (pred(v1, v2)) return AssertionSuccess();
-
-  return AssertionFailure() << pred_text << "("
-                            << e1 << ", "
-                            << e2 << ") evaluates to false, where"
-                            << "\n" << e1 << " evaluates to " << v1
-                            << "\n" << e2 << " evaluates to " << v2;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
-                on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
-// this in your code.
-#define GTEST_PRED2_(pred, v1, v2, on_failure)\
-  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
-                                             #v1, \
-                                             #v2, \
-                                             pred, \
-                                             v1, \
-                                             v2), on_failure)
-
-// Binary predicate assertion macros.
-#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
-  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED2(pred, v1, v2) \
-  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
-  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED2(pred, v1, v2) \
-  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
-// this in your code.
-template <typename Pred,
-          typename T1,
-          typename T2,
-          typename T3>
-AssertionResult AssertPred3Helper(const char* pred_text,
-                                  const char* e1,
-                                  const char* e2,
-                                  const char* e3,
-                                  Pred pred,
-                                  const T1& v1,
-                                  const T2& v2,
-                                  const T3& v3) {
-  if (pred(v1, v2, v3)) return AssertionSuccess();
-
-  return AssertionFailure() << pred_text << "("
-                            << e1 << ", "
-                            << e2 << ", "
-                            << e3 << ") evaluates to false, where"
-                            << "\n" << e1 << " evaluates to " << v1
-                            << "\n" << e2 << " evaluates to " << v2
-                            << "\n" << e3 << " evaluates to " << v3;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
-                on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
-// this in your code.
-#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
-  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
-                                             #v1, \
-                                             #v2, \
-                                             #v3, \
-                                             pred, \
-                                             v1, \
-                                             v2, \
-                                             v3), on_failure)
-
-// Ternary predicate assertion macros.
-#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
-  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED3(pred, v1, v2, v3) \
-  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
-  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED3(pred, v1, v2, v3) \
-  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
-// this in your code.
-template <typename Pred,
-          typename T1,
-          typename T2,
-          typename T3,
-          typename T4>
-AssertionResult AssertPred4Helper(const char* pred_text,
-                                  const char* e1,
-                                  const char* e2,
-                                  const char* e3,
-                                  const char* e4,
-                                  Pred pred,
-                                  const T1& v1,
-                                  const T2& v2,
-                                  const T3& v3,
-                                  const T4& v4) {
-  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
-
-  return AssertionFailure() << pred_text << "("
-                            << e1 << ", "
-                            << e2 << ", "
-                            << e3 << ", "
-                            << e4 << ") evaluates to false, where"
-                            << "\n" << e1 << " evaluates to " << v1
-                            << "\n" << e2 << " evaluates to " << v2
-                            << "\n" << e3 << " evaluates to " << v3
-                            << "\n" << e4 << " evaluates to " << v4;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
-                on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
-// this in your code.
-#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
-  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
-                                             #v1, \
-                                             #v2, \
-                                             #v3, \
-                                             #v4, \
-                                             pred, \
-                                             v1, \
-                                             v2, \
-                                             v3, \
-                                             v4), on_failure)
-
-// 4-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
-  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
-  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
-  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
-  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
-// this in your code.
-template <typename Pred,
-          typename T1,
-          typename T2,
-          typename T3,
-          typename T4,
-          typename T5>
-AssertionResult AssertPred5Helper(const char* pred_text,
-                                  const char* e1,
-                                  const char* e2,
-                                  const char* e3,
-                                  const char* e4,
-                                  const char* e5,
-                                  Pred pred,
-                                  const T1& v1,
-                                  const T2& v2,
-                                  const T3& v3,
-                                  const T4& v4,
-                                  const T5& v5) {
-  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
-
-  return AssertionFailure() << pred_text << "("
-                            << e1 << ", "
-                            << e2 << ", "
-                            << e3 << ", "
-                            << e4 << ", "
-                            << e5 << ") evaluates to false, where"
-                            << "\n" << e1 << " evaluates to " << v1
-                            << "\n" << e2 << " evaluates to " << v2
-                            << "\n" << e3 << " evaluates to " << v3
-                            << "\n" << e4 << " evaluates to " << v4
-                            << "\n" << e5 << " evaluates to " << v5;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
-                on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
-// this in your code.
-#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
-  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
-                                             #v1, \
-                                             #v2, \
-                                             #v3, \
-                                             #v4, \
-                                             #v5, \
-                                             pred, \
-                                             v1, \
-                                             v2, \
-                                             v3, \
-                                             v4, \
-                                             v5), on_failure)
-
-// 5-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
-  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
-  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
-  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
-  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-
-
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
diff --git a/unit_tests/gtest/include/gtest/gtest_prod.h b/unit_tests/gtest/include/gtest/gtest_prod.h
deleted file mode 100644
index da80ddc..0000000
--- a/unit_tests/gtest/include/gtest/gtest_prod.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2006, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// Google C++ Testing Framework definitions useful in production code.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-
-// When you need to test the private or protected members of a class,
-// use the FRIEND_TEST macro to declare your tests as friends of the
-// class.  For example:
-//
-// class MyClass {
-//  private:
-//   void MyMethod();
-//   FRIEND_TEST(MyClassTest, MyMethod);
-// };
-//
-// class MyClassTest : public testing::Test {
-//   // ...
-// };
-//
-// TEST_F(MyClassTest, MyMethod) {
-//   // Can call MyClass::MyMethod() here.
-// }
-
-#define FRIEND_TEST(test_case_name, test_name)\
-friend class test_case_name##_##test_name##_Test
-
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h b/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h
deleted file mode 100644
index 1d9f83b..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines internal utilities needed for implementing
-// death tests.  They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-internal.h"
-
-#include <stdio.h>
-
-namespace testing {
-namespace internal {
-
-GTEST_DECLARE_string_(internal_run_death_test);
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kDeathTestStyleFlag[] = "death_test_style";
-const char kDeathTestUseFork[] = "death_test_use_fork";
-const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
-
-#if GTEST_HAS_DEATH_TEST
-
-// DeathTest is a class that hides much of the complexity of the
-// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
-// returns a concrete class that depends on the prevailing death test
-// style, as defined by the --gtest_death_test_style and/or
-// --gtest_internal_run_death_test flags.
-
-// In describing the results of death tests, these terms are used with
-// the corresponding definitions:
-//
-// exit status:  The integer exit information in the format specified
-//               by wait(2)
-// exit code:    The integer code passed to exit(3), _exit(2), or
-//               returned from main()
-class GTEST_API_ DeathTest {
- public:
-  // Create returns false if there was an error determining the
-  // appropriate action to take for the current death test; for example,
-  // if the gtest_death_test_style flag is set to an invalid value.
-  // The LastMessage method will return a more detailed message in that
-  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
-  // argument is set.  If the death test should be skipped, the pointer
-  // is set to NULL; otherwise, it is set to the address of a new concrete
-  // DeathTest object that controls the execution of the current test.
-  static bool Create(const char* statement, const RE* regex,
-                     const char* file, int line, DeathTest** test);
-  DeathTest();
-  virtual ~DeathTest() { }
-
-  // A helper class that aborts a death test when it's deleted.
-  class ReturnSentinel {
-   public:
-    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
-    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
-   private:
-    DeathTest* const test_;
-    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
-  } GTEST_ATTRIBUTE_UNUSED_;
-
-  // An enumeration of possible roles that may be taken when a death
-  // test is encountered.  EXECUTE means that the death test logic should
-  // be executed immediately.  OVERSEE means that the program should prepare
-  // the appropriate environment for a child process to execute the death
-  // test, then wait for it to complete.
-  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
-
-  // An enumeration of the three reasons that a test might be aborted.
-  enum AbortReason {
-    TEST_ENCOUNTERED_RETURN_STATEMENT,
-    TEST_THREW_EXCEPTION,
-    TEST_DID_NOT_DIE
-  };
-
-  // Assumes one of the above roles.
-  virtual TestRole AssumeRole() = 0;
-
-  // Waits for the death test to finish and returns its status.
-  virtual int Wait() = 0;
-
-  // Returns true if the death test passed; that is, the test process
-  // exited during the test, its exit status matches a user-supplied
-  // predicate, and its stderr output matches a user-supplied regular
-  // expression.
-  // The user-supplied predicate may be a macro expression rather
-  // than a function pointer or functor, or else Wait and Passed could
-  // be combined.
-  virtual bool Passed(bool exit_status_ok) = 0;
-
-  // Signals that the death test did not die as expected.
-  virtual void Abort(AbortReason reason) = 0;
-
-  // Returns a human-readable outcome message regarding the outcome of
-  // the last death test.
-  static const char* LastMessage();
-
-  static void set_last_death_test_message(const String& message);
-
- private:
-  // A string containing a description of the outcome of the last death test.
-  static String last_death_test_message_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
-};
-
-// Factory interface for death tests.  May be mocked out for testing.
-class DeathTestFactory {
- public:
-  virtual ~DeathTestFactory() { }
-  virtual bool Create(const char* statement, const RE* regex,
-                      const char* file, int line, DeathTest** test) = 0;
-};
-
-// A concrete DeathTestFactory implementation for normal use.
-class DefaultDeathTestFactory : public DeathTestFactory {
- public:
-  virtual bool Create(const char* statement, const RE* regex,
-                      const char* file, int line, DeathTest** test);
-};
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
-
-// Traps C++ exceptions escaping statement and reports them as test
-// failures. Note that trapping SEH exceptions is not implemented here.
-# if GTEST_HAS_EXCEPTIONS
-#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
-  try { \
-    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-  } catch (const ::std::exception& gtest_exception) { \
-    fprintf(\
-        stderr, \
-        "\n%s: Caught std::exception-derived exception escaping the " \
-        "death test statement. Exception message: %s\n", \
-        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
-        gtest_exception.what()); \
-    fflush(stderr); \
-    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
-  } catch (...) { \
-    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
-  }
-
-# else
-#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
-  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-
-# endif
-
-// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
-// ASSERT_EXIT*, and EXPECT_EXIT*.
-# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (::testing::internal::AlwaysTrue()) { \
-    const ::testing::internal::RE& gtest_regex = (regex); \
-    ::testing::internal::DeathTest* gtest_dt; \
-    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
-        __FILE__, __LINE__, &gtest_dt)) { \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
-    } \
-    if (gtest_dt != NULL) { \
-      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
-          gtest_dt_ptr(gtest_dt); \
-      switch (gtest_dt->AssumeRole()) { \
-        case ::testing::internal::DeathTest::OVERSEE_TEST: \
-          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
-            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
-          } \
-          break; \
-        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
-          ::testing::internal::DeathTest::ReturnSentinel \
-              gtest_sentinel(gtest_dt); \
-          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
-          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
-          break; \
-        } \
-        default: \
-          break; \
-      } \
-    } \
-  } else \
-    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
-      fail(::testing::internal::DeathTest::LastMessage())
-// The symbol "fail" here expands to something into which a message
-// can be streamed.
-
-// A class representing the parsed contents of the
-// --gtest_internal_run_death_test flag, as it existed when
-// RUN_ALL_TESTS was called.
-class InternalRunDeathTestFlag {
- public:
-  InternalRunDeathTestFlag(const String& a_file,
-                           int a_line,
-                           int an_index,
-                           int a_write_fd)
-      : file_(a_file), line_(a_line), index_(an_index),
-        write_fd_(a_write_fd) {}
-
-  ~InternalRunDeathTestFlag() {
-    if (write_fd_ >= 0)
-      posix::Close(write_fd_);
-  }
-
-  String file() const { return file_; }
-  int line() const { return line_; }
-  int index() const { return index_; }
-  int write_fd() const { return write_fd_; }
-
- private:
-  String file_;
-  int line_;
-  int index_;
-  int write_fd_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
-};
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
-
-#else  // GTEST_HAS_DEATH_TEST
-
-// This macro is used for implementing macros such as
-// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
-// death tests are not supported. Those macros must compile on such systems
-// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
-// systems that support death tests. This allows one to write such a macro
-// on a system that does not support death tests and be sure that it will
-// compile on a death-test supporting system.
-//
-// Parameters:
-//   statement -  A statement that a macro such as EXPECT_DEATH would test
-//                for program termination. This macro has to make sure this
-//                statement is compiled but not executed, to ensure that
-//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
-//                parameter iff EXPECT_DEATH compiles with it.
-//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
-//                the output of statement.  This parameter has to be
-//                compiled but not evaluated by this macro, to ensure that
-//                this macro only accepts expressions that a macro such as
-//                EXPECT_DEATH would accept.
-//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
-//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
-//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
-//                compile inside functions where ASSERT_DEATH doesn't
-//                compile.
-//
-//  The branch that has an always false condition is used to ensure that
-//  statement and regex are compiled (and thus syntactically correct) but
-//  never executed. The unreachable code macro protects the terminator
-//  statement from generating an 'unreachable code' warning in case
-//  statement unconditionally returns or throws. The Message constructor at
-//  the end allows the syntax of streaming additional messages into the
-//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
-# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
-    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-    if (::testing::internal::AlwaysTrue()) { \
-      GTEST_LOG_(WARNING) \
-          << "Death tests are not supported on this platform.\n" \
-          << "Statement '" #statement "' cannot be verified."; \
-    } else if (::testing::internal::AlwaysFalse()) { \
-      ::testing::internal::RE::PartialMatch(".*", (regex)); \
-      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-      terminator; \
-    } else \
-      ::testing::Message()
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-filepath.h b/unit_tests/gtest/include/gtest/internal/gtest-filepath.h
deleted file mode 100644
index b36b3cf..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-filepath.h
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keith.ray at gmail.com (Keith Ray)
-//
-// Google Test filepath utilities
-//
-// This header file declares classes and functions used internally by
-// Google Test.  They are subject to change without notice.
-//
-// This file is #included in <gtest/internal/gtest-internal.h>.
-// Do not include this header file separately!
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-// FilePath - a class for file and directory pathname manipulation which
-// handles platform-specific conventions (like the pathname separator).
-// Used for helper functions for naming files in a directory for xml output.
-// Except for Set methods, all methods are const or static, which provides an
-// "immutable value object" -- useful for peace of mind.
-// A FilePath with a value ending in a path separator ("like/this/") represents
-// a directory, otherwise it is assumed to represent a file. In either case,
-// it may or may not represent an actual file or directory in the file system.
-// Names are NOT checked for syntax correctness -- no checking for illegal
-// characters, malformed paths, etc.
-
-class GTEST_API_ FilePath {
- public:
-  FilePath() : pathname_("") { }
-  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
-
-  explicit FilePath(const char* pathname) : pathname_(pathname) {
-    Normalize();
-  }
-
-  explicit FilePath(const String& pathname) : pathname_(pathname) {
-    Normalize();
-  }
-
-  FilePath& operator=(const FilePath& rhs) {
-    Set(rhs);
-    return *this;
-  }
-
-  void Set(const FilePath& rhs) {
-    pathname_ = rhs.pathname_;
-  }
-
-  String ToString() const { return pathname_; }
-  const char* c_str() const { return pathname_.c_str(); }
-
-  // Returns the current working directory, or "" if unsuccessful.
-  static FilePath GetCurrentDir();
-
-  // Given directory = "dir", base_name = "test", number = 0,
-  // extension = "xml", returns "dir/test.xml". If number is greater
-  // than zero (e.g., 12), returns "dir/test_12.xml".
-  // On Windows platform, uses \ as the separator rather than /.
-  static FilePath MakeFileName(const FilePath& directory,
-                               const FilePath& base_name,
-                               int number,
-                               const char* extension);
-
-  // Given directory = "dir", relative_path = "test.xml",
-  // returns "dir/test.xml".
-  // On Windows, uses \ as the separator rather than /.
-  static FilePath ConcatPaths(const FilePath& directory,
-                              const FilePath& relative_path);
-
-  // Returns a pathname for a file that does not currently exist. The pathname
-  // will be directory/base_name.extension or
-  // directory/base_name_<number>.extension if directory/base_name.extension
-  // already exists. The number will be incremented until a pathname is found
-  // that does not already exist.
-  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
-  // There could be a race condition if two or more processes are calling this
-  // function at the same time -- they could both pick the same filename.
-  static FilePath GenerateUniqueFileName(const FilePath& directory,
-                                         const FilePath& base_name,
-                                         const char* extension);
-
-  // Returns true iff the path is NULL or "".
-  bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
-
-  // If input name has a trailing separator character, removes it and returns
-  // the name, otherwise return the name string unmodified.
-  // On Windows platform, uses \ as the separator, other platforms use /.
-  FilePath RemoveTrailingPathSeparator() const;
-
-  // Returns a copy of the FilePath with the directory part removed.
-  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
-  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
-  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
-  // returns an empty FilePath ("").
-  // On Windows platform, '\' is the path separator, otherwise it is '/'.
-  FilePath RemoveDirectoryName() const;
-
-  // RemoveFileName returns the directory path with the filename removed.
-  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
-  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
-  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
-  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
-  // On Windows platform, '\' is the path separator, otherwise it is '/'.
-  FilePath RemoveFileName() const;
-
-  // Returns a copy of the FilePath with the case-insensitive extension removed.
-  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
-  // FilePath("dir/file"). If a case-insensitive extension is not
-  // found, returns a copy of the original FilePath.
-  FilePath RemoveExtension(const char* extension) const;
-
-  // Creates directories so that path exists. Returns true if successful or if
-  // the directories already exist; returns false if unable to create
-  // directories for any reason. Will also return false if the FilePath does
-  // not represent a directory (that is, it doesn't end with a path separator).
-  bool CreateDirectoriesRecursively() const;
-
-  // Create the directory so that path exists. Returns true if successful or
-  // if the directory already exists; returns false if unable to create the
-  // directory for any reason, including if the parent directory does not
-  // exist. Not named "CreateDirectory" because that's a macro on Windows.
-  bool CreateFolder() const;
-
-  // Returns true if FilePath describes something in the file-system,
-  // either a file, directory, or whatever, and that something exists.
-  bool FileOrDirectoryExists() const;
-
-  // Returns true if pathname describes a directory in the file-system
-  // that exists.
-  bool DirectoryExists() const;
-
-  // Returns true if FilePath ends with a path separator, which indicates that
-  // it is intended to represent a directory. Returns false otherwise.
-  // This does NOT check that a directory (or file) actually exists.
-  bool IsDirectory() const;
-
-  // Returns true if pathname describes a root directory. (Windows has one
-  // root directory per disk drive.)
-  bool IsRootDirectory() const;
-
-  // Returns true if pathname describes an absolute path.
-  bool IsAbsolutePath() const;
-
- private:
-  // Replaces multiple consecutive separators with a single separator.
-  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
-  // redundancies that might be in a pathname involving "." or "..".
-  //
-  // A pathname with multiple consecutive separators may occur either through
-  // user error or as a result of some scripts or APIs that generate a pathname
-  // with a trailing separator. On other platforms the same API or script
-  // may NOT generate a pathname with a trailing "/". Then elsewhere that
-  // pathname may have another "/" and pathname components added to it,
-  // without checking for the separator already being there.
-  // The script language and operating system may allow paths like "foo//bar"
-  // but some of the functions in FilePath will not handle that correctly. In
-  // particular, RemoveTrailingPathSeparator() only removes one separator, and
-  // it is called in CreateDirectoriesRecursively() assuming that it will change
-  // a pathname from directory syntax (trailing separator) to filename syntax.
-  //
-  // On Windows this method also replaces the alternate path separator '/' with
-  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
-  // "bar\\foo".
-
-  void Normalize();
-
-  // Returns a pointer to the last occurence of a valid path separator in
-  // the FilePath. On Windows, for example, both '/' and '\' are valid path
-  // separators. Returns NULL if no path separator was found.
-  const char* FindLastPathSeparator() const;
-
-  String pathname_;
-};  // class FilePath
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-internal.h b/unit_tests/gtest/include/gtest/internal/gtest-internal.h
deleted file mode 100644
index 7fb3f51..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-internal.h
+++ /dev/null
@@ -1,1236 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares functions and macros used internally by
-// Google Test.  They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_LINUX
-# include <stdlib.h>
-# include <sys/types.h>
-# include <sys/wait.h>
-# include <unistd.h>
-#endif  // GTEST_OS_LINUX
-
-#include <ctype.h>
-#include <string.h>
-#include <iomanip>
-#include <limits>
-#include <set>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-type-util.h"
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-// Due to C++ preprocessor weirdness, we need double indirection to
-// concatenate two tokens when one of them is __LINE__.  Writing
-//
-//   foo ## __LINE__
-//
-// will result in the token foo__LINE__, instead of foo followed by
-// the current line number.  For more details, see
-// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
-#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
-#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
-
-// Google Test defines the testing::Message class to allow construction of
-// test messages via the << operator.  The idea is that anything
-// streamable to std::ostream can be streamed to a testing::Message.
-// This allows a user to use his own types in Google Test assertions by
-// overloading the << operator.
-//
-// util/gtl/stl_logging-inl.h overloads << for STL containers.  These
-// overloads cannot be defined in the std namespace, as that will be
-// undefined behavior.  Therefore, they are defined in the global
-// namespace instead.
-//
-// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
-// overloads are visible in either the std namespace or the global
-// namespace, but not other namespaces, including the testing
-// namespace which Google Test's Message class is in.
-//
-// To allow STL containers (and other types that has a << operator
-// defined in the global namespace) to be used in Google Test assertions,
-// testing::Message must access the custom << operator from the global
-// namespace.  Hence this helper function.
-//
-// Note: Jeffrey Yasskin suggested an alternative fix by "using
-// ::operator<<;" in the definition of Message's operator<<.  That fix
-// doesn't require a helper function, but unfortunately doesn't
-// compile with MSVC.
-template <typename T>
-inline void GTestStreamToHelper(std::ostream* os, const T& val) {
-  *os << val;
-}
-
-class ProtocolMessage;
-namespace proto2 { class Message; }
-
-namespace testing {
-
-// Forward declarations.
-
-class AssertionResult;                 // Result of an assertion.
-class Message;                         // Represents a failure message.
-class Test;                            // Represents a test.
-class TestInfo;                        // Information about a test.
-class TestPartResult;                  // Result of a test part.
-class UnitTest;                        // A collection of test cases.
-
-template <typename T>
-::std::string PrintToString(const T& value);
-
-namespace internal {
-
-struct TraceInfo;                      // Information about a trace point.
-class ScopedTrace;                     // Implements scoped trace.
-class TestInfoImpl;                    // Opaque implementation of TestInfo
-class UnitTestImpl;                    // Opaque implementation of UnitTest
-
-// How many times InitGoogleTest() has been called.
-extern int g_init_gtest_count;
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-GTEST_API_ extern const char kStackTraceMarker[];
-
-// A secret type that Google Test users don't know about.  It has no
-// definition on purpose.  Therefore it's impossible to create a
-// Secret object, which is what we want.
-class Secret;
-
-// Two overloaded helpers for checking at compile time whether an
-// expression is a null pointer literal (i.e. NULL or any 0-valued
-// compile-time integral constant).  Their return values have
-// different sizes, so we can use sizeof() to test which version is
-// picked by the compiler.  These helpers have no implementations, as
-// we only need their signatures.
-//
-// Given IsNullLiteralHelper(x), the compiler will pick the first
-// version if x can be implicitly converted to Secret*, and pick the
-// second version otherwise.  Since Secret is a secret and incomplete
-// type, the only expression a user can write that has type Secret* is
-// a null pointer literal.  Therefore, we know that x is a null
-// pointer literal if and only if the first version is picked by the
-// compiler.
-char IsNullLiteralHelper(Secret* p);
-char (&IsNullLiteralHelper(...))[2];  // NOLINT
-
-// A compile-time bool constant that is true if and only if x is a
-// null pointer literal (i.e. NULL or any 0-valued compile-time
-// integral constant).
-#ifdef GTEST_ELLIPSIS_NEEDS_POD_
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_IS_NULL_LITERAL_(x) false
-#else
-# define GTEST_IS_NULL_LITERAL_(x) \
-    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
-#endif  // GTEST_ELLIPSIS_NEEDS_POD_
-
-// Appends the user-supplied message to the Google-Test-generated message.
-GTEST_API_ String AppendUserMessage(const String& gtest_msg,
-                                    const Message& user_msg);
-
-// A helper class for creating scoped traces in user programs.
-class GTEST_API_ ScopedTrace {
- public:
-  // The c'tor pushes the given source file location and message onto
-  // a trace stack maintained by Google Test.
-  ScopedTrace(const char* file, int line, const Message& message);
-
-  // The d'tor pops the info pushed by the c'tor.
-  //
-  // Note that the d'tor is not virtual in order to be efficient.
-  // Don't inherit from ScopedTrace!
-  ~ScopedTrace();
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
-} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
-                            // c'tor and d'tor.  Therefore it doesn't
-                            // need to be used otherwise.
-
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-// The Symbian compiler has a bug that prevents it from selecting the
-// correct overload of FormatForComparisonFailureMessage (see below)
-// unless we pass the first argument by reference.  If we do that,
-// however, Visual Age C++ 10.1 generates a compiler error.  Therefore
-// we only apply the work-around for Symbian.
-#if defined(__SYMBIAN32__)
-# define GTEST_CREF_WORKAROUND_ const&
-#else
-# define GTEST_CREF_WORKAROUND_
-#endif
-
-// When this operand is a const char* or char*, if the other operand
-// is a ::std::string or ::string, we print this operand as a C string
-// rather than a pointer (we do the same for wide strings); otherwise
-// we print it as a pointer to be safe.
-
-// This internal macro is used to avoid duplicated code.
-#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\
-inline String FormatForComparisonFailureMessage(\
-    operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
-    const operand2_type& /*operand2*/) {\
-  return operand1_printer(str);\
-}\
-inline String FormatForComparisonFailureMessage(\
-    const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
-    const operand2_type& /*operand2*/) {\
-  return operand1_printer(str);\
-}
-
-GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)
-#if GTEST_HAS_STD_WSTRING
-GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)
-#endif  // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)
-#endif  // GTEST_HAS_GLOBAL_STRING
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-#undef GTEST_FORMAT_IMPL_
-
-// The next four overloads handle the case where the operand being
-// printed is a char/wchar_t pointer and the other operand is not a
-// string/wstring object.  In such cases, we just print the operand as
-// a pointer to be safe.
-#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType)                       \
-  template <typename T>                                             \
-  String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \
-                                           const T&) { \
-    return PrintToString(static_cast<const void*>(p));              \
-  }
-
-GTEST_FORMAT_CHAR_PTR_IMPL_(char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)
-
-#undef GTEST_FORMAT_CHAR_PTR_IMPL_
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-//   expected_expression: "foo"
-//   actual_expression:   "bar"
-//   expected_value:      "5"
-//   actual_value:        "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
-                                     const char* actual_expression,
-                                     const String& expected_value,
-                                     const String& actual_value,
-                                     bool ignoring_case);
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-GTEST_API_ String GetBoolAssertionFailureMessage(
-    const AssertionResult& assertion_result,
-    const char* expression_text,
-    const char* actual_predicate_value,
-    const char* expected_predicate_value);
-
-// This template class represents an IEEE floating-point number
-// (either single-precision or double-precision, depending on the
-// template parameters).
-//
-// The purpose of this class is to do more sophisticated number
-// comparison.  (Due to round-off error, etc, it's very unlikely that
-// two floating-points will be equal exactly.  Hence a naive
-// comparison by the == operation often doesn't work.)
-//
-// Format of IEEE floating-point:
-//
-//   The most-significant bit being the leftmost, an IEEE
-//   floating-point looks like
-//
-//     sign_bit exponent_bits fraction_bits
-//
-//   Here, sign_bit is a single bit that designates the sign of the
-//   number.
-//
-//   For float, there are 8 exponent bits and 23 fraction bits.
-//
-//   For double, there are 11 exponent bits and 52 fraction bits.
-//
-//   More details can be found at
-//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
-//
-// Template parameter:
-//
-//   RawType: the raw floating-point type (either float or double)
-template <typename RawType>
-class FloatingPoint {
- public:
-  // Defines the unsigned integer type that has the same size as the
-  // floating point number.
-  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
-
-  // Constants.
-
-  // # of bits in a number.
-  static const size_t kBitCount = 8*sizeof(RawType);
-
-  // # of fraction bits in a number.
-  static const size_t kFractionBitCount =
-    std::numeric_limits<RawType>::digits - 1;
-
-  // # of exponent bits in a number.
-  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
-
-  // The mask for the sign bit.
-  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
-
-  // The mask for the fraction bits.
-  static const Bits kFractionBitMask =
-    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
-
-  // The mask for the exponent bits.
-  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
-
-  // How many ULP's (Units in the Last Place) we want to tolerate when
-  // comparing two numbers.  The larger the value, the more error we
-  // allow.  A 0 value means that two numbers must be exactly the same
-  // to be considered equal.
-  //
-  // The maximum error of a single floating-point operation is 0.5
-  // units in the last place.  On Intel CPU's, all floating-point
-  // calculations are done with 80-bit precision, while double has 64
-  // bits.  Therefore, 4 should be enough for ordinary use.
-  //
-  // See the following article for more details on ULP:
-  // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
-  static const size_t kMaxUlps = 4;
-
-  // Constructs a FloatingPoint from a raw floating-point number.
-  //
-  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
-  // around may change its bits, although the new value is guaranteed
-  // to be also a NAN.  Therefore, don't expect this constructor to
-  // preserve the bits in x when x is a NAN.
-  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
-
-  // Static methods
-
-  // Reinterprets a bit pattern as a floating-point number.
-  //
-  // This function is needed to test the AlmostEquals() method.
-  static RawType ReinterpretBits(const Bits bits) {
-    FloatingPoint fp(0);
-    fp.u_.bits_ = bits;
-    return fp.u_.value_;
-  }
-
-  // Returns the floating-point number that represent positive infinity.
-  static RawType Infinity() {
-    return ReinterpretBits(kExponentBitMask);
-  }
-
-  // Non-static methods
-
-  // Returns the bits that represents this number.
-  const Bits &bits() const { return u_.bits_; }
-
-  // Returns the exponent bits of this number.
-  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
-
-  // Returns the fraction bits of this number.
-  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
-
-  // Returns the sign bit of this number.
-  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
-
-  // Returns true iff this is NAN (not a number).
-  bool is_nan() const {
-    // It's a NAN if the exponent bits are all ones and the fraction
-    // bits are not entirely zeros.
-    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
-  }
-
-  // Returns true iff this number is at most kMaxUlps ULP's away from
-  // rhs.  In particular, this function:
-  //
-  //   - returns false if either number is (or both are) NAN.
-  //   - treats really large numbers as almost equal to infinity.
-  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
-  bool AlmostEquals(const FloatingPoint& rhs) const {
-    // The IEEE standard says that any comparison operation involving
-    // a NAN must return false.
-    if (is_nan() || rhs.is_nan()) return false;
-
-    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
-        <= kMaxUlps;
-  }
-
- private:
-  // The data type used to store the actual floating-point number.
-  union FloatingPointUnion {
-    RawType value_;  // The raw floating-point number.
-    Bits bits_;      // The bits that represent the number.
-  };
-
-  // Converts an integer from the sign-and-magnitude representation to
-  // the biased representation.  More precisely, let N be 2 to the
-  // power of (kBitCount - 1), an integer x is represented by the
-  // unsigned number x + N.
-  //
-  // For instance,
-  //
-  //   -N + 1 (the most negative number representable using
-  //          sign-and-magnitude) is represented by 1;
-  //   0      is represented by N; and
-  //   N - 1  (the biggest number representable using
-  //          sign-and-magnitude) is represented by 2N - 1.
-  //
-  // Read http://en.wikipedia.org/wiki/Signed_number_representations
-  // for more details on signed number representations.
-  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
-    if (kSignBitMask & sam) {
-      // sam represents a negative number.
-      return ~sam + 1;
-    } else {
-      // sam represents a positive number.
-      return kSignBitMask | sam;
-    }
-  }
-
-  // Given two numbers in the sign-and-magnitude representation,
-  // returns the distance between them as an unsigned number.
-  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
-                                                     const Bits &sam2) {
-    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
-    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
-    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
-  }
-
-  FloatingPointUnion u_;
-};
-
-// Typedefs the instances of the FloatingPoint template class that we
-// care to use.
-typedef FloatingPoint<float> Float;
-typedef FloatingPoint<double> Double;
-
-// In order to catch the mistake of putting tests that use different
-// test fixture classes in the same test case, we need to assign
-// unique IDs to fixture classes and compare them.  The TypeId type is
-// used to hold such IDs.  The user should treat TypeId as an opaque
-// type: the only operation allowed on TypeId values is to compare
-// them for equality using the == operator.
-typedef const void* TypeId;
-
-template <typename T>
-class TypeIdHelper {
- public:
-  // dummy_ must not have a const type.  Otherwise an overly eager
-  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
-  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
-  static bool dummy_;
-};
-
-template <typename T>
-bool TypeIdHelper<T>::dummy_ = false;
-
-// GetTypeId<T>() returns the ID of type T.  Different values will be
-// returned for different types.  Calling the function twice with the
-// same type argument is guaranteed to return the same ID.
-template <typename T>
-TypeId GetTypeId() {
-  // The compiler is required to allocate a different
-  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
-  // the template.  Therefore, the address of dummy_ is guaranteed to
-  // be unique.
-  return &(TypeIdHelper<T>::dummy_);
-}
-
-// Returns the type ID of ::testing::Test.  Always call this instead
-// of GetTypeId< ::testing::Test>() to get the type ID of
-// ::testing::Test, as the latter may give the wrong result due to a
-// suspected linker bug when compiling Google Test as a Mac OS X
-// framework.
-GTEST_API_ TypeId GetTestTypeId();
-
-// Defines the abstract factory interface that creates instances
-// of a Test object.
-class TestFactoryBase {
- public:
-  virtual ~TestFactoryBase() {}
-
-  // Creates a test instance to run. The instance is both created and destroyed
-  // within TestInfoImpl::Run()
-  virtual Test* CreateTest() = 0;
-
- protected:
-  TestFactoryBase() {}
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
-};
-
-// This class provides implementation of TeastFactoryBase interface.
-// It is used in TEST and TEST_F macros.
-template <class TestClass>
-class TestFactoryImpl : public TestFactoryBase {
- public:
-  virtual Test* CreateTest() { return new TestClass; }
-};
-
-#if GTEST_OS_WINDOWS
-
-// Predicate-formatters for implementing the HRESULT checking macros
-// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
-// We pass a long instead of HRESULT to avoid causing an
-// include dependency for the HRESULT type.
-GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
-                                            long hr);  // NOLINT
-GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
-                                            long hr);  // NOLINT
-
-#endif  // GTEST_OS_WINDOWS
-
-// Types of SetUpTestCase() and TearDownTestCase() functions.
-typedef void (*SetUpTestCaseFunc)();
-typedef void (*TearDownTestCaseFunc)();
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-//   test_case_name:   name of the test case
-//   name:             name of the test
-//   type_param        the name of the test's type parameter, or NULL if
-//                     this is not  a typed or a type-parameterized test.
-//   value_param       text representation of the test's value parameter,
-//                     or NULL if this is not a type-parameterized test.
-//   fixture_class_id: ID of the test fixture class
-//   set_up_tc:        pointer to the function that sets up the test case
-//   tear_down_tc:     pointer to the function that tears down the test case
-//   factory:          pointer to the factory that creates a test object.
-//                     The newly created TestInfo instance will assume
-//                     ownership of the factory object.
-GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
-    const char* test_case_name, const char* name,
-    const char* type_param,
-    const char* value_param,
-    TypeId fixture_class_id,
-    SetUpTestCaseFunc set_up_tc,
-    TearDownTestCaseFunc tear_down_tc,
-    TestFactoryBase* factory);
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false.  None of pstr, *pstr, and prefix can be NULL.
-GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// State of the definition of a type-parameterized test case.
-class GTEST_API_ TypedTestCasePState {
- public:
-  TypedTestCasePState() : registered_(false) {}
-
-  // Adds the given test name to defined_test_names_ and return true
-  // if the test case hasn't been registered; otherwise aborts the
-  // program.
-  bool AddTestName(const char* file, int line, const char* case_name,
-                   const char* test_name) {
-    if (registered_) {
-      fprintf(stderr, "%s Test %s must be defined before "
-              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
-              FormatFileLocation(file, line).c_str(), test_name, case_name);
-      fflush(stderr);
-      posix::Abort();
-    }
-    defined_test_names_.insert(test_name);
-    return true;
-  }
-
-  // Verifies that registered_tests match the test names in
-  // defined_test_names_; returns registered_tests if successful, or
-  // aborts the program otherwise.
-  const char* VerifyRegisteredTestNames(
-      const char* file, int line, const char* registered_tests);
-
- private:
-  bool registered_;
-  ::std::set<const char*> defined_test_names_;
-};
-
-// Skips to the first non-space char after the first comma in 'str';
-// returns NULL if no comma is found in 'str'.
-inline const char* SkipComma(const char* str) {
-  const char* comma = strchr(str, ',');
-  if (comma == NULL) {
-    return NULL;
-  }
-  while (IsSpace(*(++comma))) {}
-  return comma;
-}
-
-// Returns the prefix of 'str' before the first comma in it; returns
-// the entire string if it contains no comma.
-inline String GetPrefixUntilComma(const char* str) {
-  const char* comma = strchr(str, ',');
-  return comma == NULL ? String(str) : String(str, comma - str);
-}
-
-// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
-// registers a list of type-parameterized tests with Google Test.  The
-// return value is insignificant - we just need to return something
-// such that we can call this function in a namespace scope.
-//
-// Implementation note: The GTEST_TEMPLATE_ macro declares a template
-// template parameter.  It's defined in gtest-type-util.h.
-template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
-class TypeParameterizedTest {
- public:
-  // 'index' is the index of the test in the type list 'Types'
-  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
-  // Types).  Valid values for 'index' are [0, N - 1] where N is the
-  // length of Types.
-  static bool Register(const char* prefix, const char* case_name,
-                       const char* test_names, int index) {
-    typedef typename Types::Head Type;
-    typedef Fixture<Type> FixtureClass;
-    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
-
-    // First, registers the first type-parameterized test in the type
-    // list.
-    MakeAndRegisterTestInfo(
-        String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/",
-                       case_name, index).c_str(),
-        GetPrefixUntilComma(test_names).c_str(),
-        GetTypeName<Type>().c_str(),
-        NULL,  // No value parameter.
-        GetTypeId<FixtureClass>(),
-        TestClass::SetUpTestCase,
-        TestClass::TearDownTestCase,
-        new TestFactoryImpl<TestClass>);
-
-    // Next, recurses (at compile time) with the tail of the type list.
-    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
-        ::Register(prefix, case_name, test_names, index + 1);
-  }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, class TestSel>
-class TypeParameterizedTest<Fixture, TestSel, Types0> {
- public:
-  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
-                       const char* /*test_names*/, int /*index*/) {
-    return true;
-  }
-};
-
-// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
-// registers *all combinations* of 'Tests' and 'Types' with Google
-// Test.  The return value is insignificant - we just need to return
-// something such that we can call this function in a namespace scope.
-template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
-class TypeParameterizedTestCase {
- public:
-  static bool Register(const char* prefix, const char* case_name,
-                       const char* test_names) {
-    typedef typename Tests::Head Head;
-
-    // First, register the first test in 'Test' for each type in 'Types'.
-    TypeParameterizedTest<Fixture, Head, Types>::Register(
-        prefix, case_name, test_names, 0);
-
-    // Next, recurses (at compile time) with the tail of the test list.
-    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
-        ::Register(prefix, case_name, SkipComma(test_names));
-  }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, typename Types>
-class TypeParameterizedTestCase<Fixture, Templates0, Types> {
- public:
-  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
-                       const char* /*test_names*/) {
-    return true;
-  }
-};
-
-#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag.  The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,
-                                                  int skip_count);
-
-// Helpers for suppressing warnings on unreachable code or constant
-// condition.
-
-// Always returns true.
-GTEST_API_ bool AlwaysTrue();
-
-// Always returns false.
-inline bool AlwaysFalse() { return !AlwaysTrue(); }
-
-// Helper for suppressing false warning from Clang on a const char*
-// variable declared in a conditional expression always being NULL in
-// the else branch.
-struct GTEST_API_ ConstCharPtr {
-  ConstCharPtr(const char* str) : value(str) {}
-  operator bool() const { return true; }
-  const char* value;
-};
-
-// A simple Linear Congruential Generator for generating random
-// numbers with a uniform distribution.  Unlike rand() and srand(), it
-// doesn't use global state (and therefore can't interfere with user
-// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
-// but it's good enough for our purposes.
-class GTEST_API_ Random {
- public:
-  static const UInt32 kMaxRange = 1u << 31;
-
-  explicit Random(UInt32 seed) : state_(seed) {}
-
-  void Reseed(UInt32 seed) { state_ = seed; }
-
-  // Generates a random number from [0, range).  Crashes if 'range' is
-  // 0 or greater than kMaxRange.
-  UInt32 Generate(UInt32 range);
-
- private:
-  UInt32 state_;
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
-};
-
-// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
-// compiler error iff T1 and T2 are different types.
-template <typename T1, typename T2>
-struct CompileAssertTypesEqual;
-
-template <typename T>
-struct CompileAssertTypesEqual<T, T> {
-};
-
-// Removes the reference from a type if it is a reference type,
-// otherwise leaves it unchanged.  This is the same as
-// tr1::remove_reference, which is not widely available yet.
-template <typename T>
-struct RemoveReference { typedef T type; };  // NOLINT
-template <typename T>
-struct RemoveReference<T&> { typedef T type; };  // NOLINT
-
-// A handy wrapper around RemoveReference that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_REFERENCE_(T) \
-    typename ::testing::internal::RemoveReference<T>::type
-
-// Removes const from a type if it is a const type, otherwise leaves
-// it unchanged.  This is the same as tr1::remove_const, which is not
-// widely available yet.
-template <typename T>
-struct RemoveConst { typedef T type; };  // NOLINT
-template <typename T>
-struct RemoveConst<const T> { typedef T type; };  // NOLINT
-
-// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
-// definition to fail to remove the const in 'const int[3]' and 'const
-// char[3][4]'.  The following specialization works around the bug.
-// However, it causes trouble with GCC and thus needs to be
-// conditionally compiled.
-#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
-template <typename T, size_t N>
-struct RemoveConst<const T[N]> {
-  typedef typename RemoveConst<T>::type type[N];
-};
-#endif
-
-// A handy wrapper around RemoveConst that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_CONST_(T) \
-    typename ::testing::internal::RemoveConst<T>::type
-
-// Turns const U&, U&, const U, and U all into U.
-#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
-    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
-
-// Adds reference to a type if it is not a reference type,
-// otherwise leaves it unchanged.  This is the same as
-// tr1::add_reference, which is not widely available yet.
-template <typename T>
-struct AddReference { typedef T& type; };  // NOLINT
-template <typename T>
-struct AddReference<T&> { typedef T& type; };  // NOLINT
-
-// A handy wrapper around AddReference that works when the argument T
-// depends on template parameters.
-#define GTEST_ADD_REFERENCE_(T) \
-    typename ::testing::internal::AddReference<T>::type
-
-// Adds a reference to const on top of T as necessary.  For example,
-// it transforms
-//
-//   char         ==> const char&
-//   const char   ==> const char&
-//   char&        ==> const char&
-//   const char&  ==> const char&
-//
-// The argument T must depend on some template parameters.
-#define GTEST_REFERENCE_TO_CONST_(T) \
-    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
-
-// ImplicitlyConvertible<From, To>::value is a compile-time bool
-// constant that's true iff type From can be implicitly converted to
-// type To.
-template <typename From, typename To>
-class ImplicitlyConvertible {
- private:
-  // We need the following helper functions only for their types.
-  // They have no implementations.
-
-  // MakeFrom() is an expression whose type is From.  We cannot simply
-  // use From(), as the type From may not have a public default
-  // constructor.
-  static From MakeFrom();
-
-  // These two functions are overloaded.  Given an expression
-  // Helper(x), the compiler will pick the first version if x can be
-  // implicitly converted to type To; otherwise it will pick the
-  // second version.
-  //
-  // The first version returns a value of size 1, and the second
-  // version returns a value of size 2.  Therefore, by checking the
-  // size of Helper(x), which can be done at compile time, we can tell
-  // which version of Helper() is used, and hence whether x can be
-  // implicitly converted to type To.
-  static char Helper(To);
-  static char (&Helper(...))[2];  // NOLINT
-
-  // We have to put the 'public' section after the 'private' section,
-  // or MSVC refuses to compile the code.
- public:
-  // MSVC warns about implicitly converting from double to int for
-  // possible loss of data, so we need to temporarily disable the
-  // warning.
-#ifdef _MSC_VER
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4244)  // Temporarily disables warning 4244.
-
-  static const bool value =
-      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-# pragma warning(pop)           // Restores the warning state.
-#elif defined(__BORLANDC__)
-  // C++Builder cannot use member overload resolution during template
-  // instantiation.  The simplest workaround is to use its C++0x type traits
-  // functions (C++Builder 2009 and above only).
-  static const bool value = __is_convertible(From, To);
-#else
-  static const bool value =
-      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-#endif  // _MSV_VER
-};
-template <typename From, typename To>
-const bool ImplicitlyConvertible<From, To>::value;
-
-// IsAProtocolMessage<T>::value is a compile-time bool constant that's
-// true iff T is type ProtocolMessage, proto2::Message, or a subclass
-// of those.
-template <typename T>
-struct IsAProtocolMessage
-    : public bool_constant<
-  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
-  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
-};
-
-// When the compiler sees expression IsContainerTest<C>(0), if C is an
-// STL-style container class, the first overload of IsContainerTest
-// will be viable (since both C::iterator* and C::const_iterator* are
-// valid types and NULL can be implicitly converted to them).  It will
-// be picked over the second overload as 'int' is a perfect match for
-// the type of argument 0.  If C::iterator or C::const_iterator is not
-// a valid type, the first overload is not viable, and the second
-// overload will be picked.  Therefore, we can determine whether C is
-// a container class by checking the type of IsContainerTest<C>(0).
-// The value of the expression is insignificant.
-//
-// Note that we look for both C::iterator and C::const_iterator.  The
-// reason is that C++ injects the name of a class as a member of the
-// class itself (e.g. you can refer to class iterator as either
-// 'iterator' or 'iterator::iterator').  If we look for C::iterator
-// only, for example, we would mistakenly think that a class named
-// iterator is an STL container.
-//
-// Also note that the simpler approach of overloading
-// IsContainerTest(typename C::const_iterator*) and
-// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
-typedef int IsContainer;
-template <class C>
-IsContainer IsContainerTest(int /* dummy */,
-                            typename C::iterator* /* it */ = NULL,
-                            typename C::const_iterator* /* const_it */ = NULL) {
-  return 0;
-}
-
-typedef char IsNotContainer;
-template <class C>
-IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
-
-// EnableIf<condition>::type is void when 'Cond' is true, and
-// undefined when 'Cond' is false.  To use SFINAE to make a function
-// overload only apply when a particular expression is true, add
-// "typename EnableIf<expression>::type* = 0" as the last parameter.
-template<bool> struct EnableIf;
-template<> struct EnableIf<true> { typedef void type; };  // NOLINT
-
-// Utilities for native arrays.
-
-// ArrayEq() compares two k-dimensional native arrays using the
-// elements' operator==, where k can be any integer >= 0.  When k is
-// 0, ArrayEq() degenerates into comparing a single pair of values.
-
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
-  return internal::ArrayEq(lhs, N, rhs);
-}
-
-// This helper reduces code bloat.  If we instead put its logic inside
-// the previous ArrayEq() function, arrays with different sizes would
-// lead to different copies of the template code.
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
-  for (size_t i = 0; i != size; i++) {
-    if (!internal::ArrayEq(lhs[i], rhs[i]))
-      return false;
-  }
-  return true;
-}
-
-// Finds the first element in the iterator range [begin, end) that
-// equals elem.  Element may be a native array type itself.
-template <typename Iter, typename Element>
-Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
-  for (Iter it = begin; it != end; ++it) {
-    if (internal::ArrayEq(*it, elem))
-      return it;
-  }
-  return end;
-}
-
-// CopyArray() copies a k-dimensional native array using the elements'
-// operator=, where k can be any integer >= 0.  When k is 0,
-// CopyArray() degenerates into copying a single value.
-
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline void CopyArray(const T& from, U* to) { *to = from; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline void CopyArray(const T(&from)[N], U(*to)[N]) {
-  internal::CopyArray(from, N, *to);
-}
-
-// This helper reduces code bloat.  If we instead put its logic inside
-// the previous CopyArray() function, arrays with different sizes
-// would lead to different copies of the template code.
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to) {
-  for (size_t i = 0; i != size; i++) {
-    internal::CopyArray(from[i], to + i);
-  }
-}
-
-// The relation between an NativeArray object (see below) and the
-// native array it represents.
-enum RelationToSource {
-  kReference,  // The NativeArray references the native array.
-  kCopy        // The NativeArray makes a copy of the native array and
-               // owns the copy.
-};
-
-// Adapts a native array to a read-only STL-style container.  Instead
-// of the complete STL container concept, this adaptor only implements
-// members useful for Google Mock's container matchers.  New members
-// should be added as needed.  To simplify the implementation, we only
-// support Element being a raw type (i.e. having no top-level const or
-// reference modifier).  It's the client's responsibility to satisfy
-// this requirement.  Element can be an array type itself (hence
-// multi-dimensional arrays are supported).
-template <typename Element>
-class NativeArray {
- public:
-  // STL-style container typedefs.
-  typedef Element value_type;
-  typedef Element* iterator;
-  typedef const Element* const_iterator;
-
-  // Constructs from a native array.
-  NativeArray(const Element* array, size_t count, RelationToSource relation) {
-    Init(array, count, relation);
-  }
-
-  // Copy constructor.
-  NativeArray(const NativeArray& rhs) {
-    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
-  }
-
-  ~NativeArray() {
-    // Ensures that the user doesn't instantiate NativeArray with a
-    // const or reference type.
-    static_cast<void>(StaticAssertTypeEqHelper<Element,
-        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
-    if (relation_to_source_ == kCopy)
-      delete[] array_;
-  }
-
-  // STL-style container methods.
-  size_t size() const { return size_; }
-  const_iterator begin() const { return array_; }
-  const_iterator end() const { return array_ + size_; }
-  bool operator==(const NativeArray& rhs) const {
-    return size() == rhs.size() &&
-        ArrayEq(begin(), size(), rhs.begin());
-  }
-
- private:
-  // Initializes this object; makes a copy of the input array if
-  // 'relation' is kCopy.
-  void Init(const Element* array, size_t a_size, RelationToSource relation) {
-    if (relation == kReference) {
-      array_ = array;
-    } else {
-      Element* const copy = new Element[a_size];
-      CopyArray(array, a_size, copy);
-      array_ = copy;
-    }
-    size_ = a_size;
-    relation_to_source_ = relation;
-  }
-
-  const Element* array_;
-  size_t size_;
-  RelationToSource relation_to_source_;
-
-  GTEST_DISALLOW_ASSIGN_(NativeArray);
-};
-
-}  // namespace internal
-}  // namespace testing
-
-#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
-  ::testing::internal::AssertHelper(result_type, file, line, message) \
-    = ::testing::Message()
-
-#define GTEST_MESSAGE_(message, result_type) \
-  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
-
-#define GTEST_FATAL_FAILURE_(message) \
-  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
-
-#define GTEST_NONFATAL_FAILURE_(message) \
-  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
-
-#define GTEST_SUCCESS_(message) \
-  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
-
-// Suppresses MSVC warnings 4072 (unreachable code) for the code following
-// statement if it returns or throws (or doesn't return or throw in some
-// situations).
-#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
-  if (::testing::internal::AlwaysTrue()) { statement; }
-
-#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
-    bool gtest_caught_expected = false; \
-    try { \
-      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-    } \
-    catch (expected_exception const&) { \
-      gtest_caught_expected = true; \
-    } \
-    catch (...) { \
-      gtest_msg.value = \
-          "Expected: " #statement " throws an exception of type " \
-          #expected_exception ".\n  Actual: it throws a different type."; \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
-    } \
-    if (!gtest_caught_expected) { \
-      gtest_msg.value = \
-          "Expected: " #statement " throws an exception of type " \
-          #expected_exception ".\n  Actual: it throws nothing."; \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
-    } \
-  } else \
-    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
-      fail(gtest_msg.value)
-
-#define GTEST_TEST_NO_THROW_(statement, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (::testing::internal::AlwaysTrue()) { \
-    try { \
-      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-    } \
-    catch (...) { \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
-    } \
-  } else \
-    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
-      fail("Expected: " #statement " doesn't throw an exception.\n" \
-           "  Actual: it throws.")
-
-#define GTEST_TEST_ANY_THROW_(statement, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (::testing::internal::AlwaysTrue()) { \
-    bool gtest_caught_any = false; \
-    try { \
-      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-    } \
-    catch (...) { \
-      gtest_caught_any = true; \
-    } \
-    if (!gtest_caught_any) { \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
-    } \
-  } else \
-    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
-      fail("Expected: " #statement " throws an exception.\n" \
-           "  Actual: it doesn't.")
-
-
-// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
-// either a boolean expression or an AssertionResult. text is a textual
-// represenation of expression as it was passed into the EXPECT_TRUE.
-#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (const ::testing::AssertionResult gtest_ar_ = \
-      ::testing::AssertionResult(expression)) \
-    ; \
-  else \
-    fail(::testing::internal::GetBoolAssertionFailureMessage(\
-        gtest_ar_, text, #actual, #expected).c_str())
-
-#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-  if (::testing::internal::AlwaysTrue()) { \
-    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
-    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
-    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
-      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
-    } \
-  } else \
-    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
-      fail("Expected: " #statement " doesn't generate new fatal " \
-           "failures in the current thread.\n" \
-           "  Actual: it does.")
-
-// Expands to the name of the class that implements the given test.
-#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
-  test_case_name##_##test_name##_Test
-
-// Helper macro for defining tests.
-#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
-class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
- public:\
-  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
- private:\
-  virtual void TestBody();\
-  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
-      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
-};\
-\
-::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
-  ::test_info_ =\
-    ::testing::internal::MakeAndRegisterTestInfo(\
-        #test_case_name, #test_name, NULL, NULL, \
-        (parent_id), \
-        parent_class::SetUpTestCase, \
-        parent_class::TearDownTestCase, \
-        new ::testing::internal::TestFactoryImpl<\
-            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
-void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning enable 2304
-#endif
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h b/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h
deleted file mode 100644
index 57147b4..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2003 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: Dan Egnor (egnor at google.com)
-//
-// A "smart" pointer type with reference tracking.  Every pointer to a
-// particular object is kept on a circular linked list.  When the last pointer
-// to an object is destroyed or reassigned, the object is deleted.
-//
-// Used properly, this deletes the object when the last reference goes away.
-// There are several caveats:
-// - Like all reference counting schemes, cycles lead to leaks.
-// - Each smart pointer is actually two pointers (8 bytes instead of 4).
-// - Every time a pointer is assigned, the entire list of pointers to that
-//   object is traversed.  This class is therefore NOT SUITABLE when there
-//   will often be more than two or three pointers to a particular object.
-// - References are only tracked as long as linked_ptr<> objects are copied.
-//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
-//   will happen (double deletion).
-//
-// A good use of this class is storing object references in STL containers.
-// You can safely put linked_ptr<> in a vector<>.
-// Other uses may not be as good.
-//
-// Note: If you use an incomplete type with linked_ptr<>, the class
-// *containing* linked_ptr<> must have a constructor and destructor (even
-// if they do nothing!).
-//
-// Bill Gibbons suggested we use something like this.
-//
-// Thread Safety:
-//   Unlike other linked_ptr implementations, in this implementation
-//   a linked_ptr object is thread-safe in the sense that:
-//     - it's safe to copy linked_ptr objects concurrently,
-//     - it's safe to copy *from* a linked_ptr and read its underlying
-//       raw pointer (e.g. via get()) concurrently, and
-//     - it's safe to write to two linked_ptrs that point to the same
-//       shared object concurrently.
-// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
-// confusion with normal linked_ptr.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-
-#include <stdlib.h>
-#include <assert.h>
-
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-namespace internal {
-
-// Protects copying of all linked_ptr objects.
-GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// This is used internally by all instances of linked_ptr<>.  It needs to be
-// a non-template class because different types of linked_ptr<> can refer to
-// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
-// So, it needs to be possible for different types of linked_ptr to participate
-// in the same circular linked list, so we need a single class type here.
-//
-// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
-class linked_ptr_internal {
- public:
-  // Create a new circle that includes only this instance.
-  void join_new() {
-    next_ = this;
-  }
-
-  // Many linked_ptr operations may change p.link_ for some linked_ptr
-  // variable p in the same circle as this object.  Therefore we need
-  // to prevent two such operations from occurring concurrently.
-  //
-  // Note that different types of linked_ptr objects can coexist in a
-  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
-  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
-  // protect all linked_ptr objects.  This can create serious
-  // contention in production code, but is acceptable in a testing
-  // framework.
-
-  // Join an existing circle.
-  // L < g_linked_ptr_mutex
-  void join(linked_ptr_internal const* ptr) {
-    MutexLock lock(&g_linked_ptr_mutex);
-
-    linked_ptr_internal const* p = ptr;
-    while (p->next_ != ptr) p = p->next_;
-    p->next_ = this;
-    next_ = ptr;
-  }
-
-  // Leave whatever circle we're part of.  Returns true if we were the
-  // last member of the circle.  Once this is done, you can join() another.
-  // L < g_linked_ptr_mutex
-  bool depart() {
-    MutexLock lock(&g_linked_ptr_mutex);
-
-    if (next_ == this) return true;
-    linked_ptr_internal const* p = next_;
-    while (p->next_ != this) p = p->next_;
-    p->next_ = next_;
-    return false;
-  }
-
- private:
-  mutable linked_ptr_internal const* next_;
-};
-
-template <typename T>
-class linked_ptr {
- public:
-  typedef T element_type;
-
-  // Take over ownership of a raw pointer.  This should happen as soon as
-  // possible after the object is created.
-  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
-  ~linked_ptr() { depart(); }
-
-  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
-  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
-  linked_ptr(linked_ptr const& ptr) {  // NOLINT
-    assert(&ptr != this);
-    copy(&ptr);
-  }
-
-  // Assignment releases the old value and acquires the new.
-  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
-    depart();
-    copy(&ptr);
-    return *this;
-  }
-
-  linked_ptr& operator=(linked_ptr const& ptr) {
-    if (&ptr != this) {
-      depart();
-      copy(&ptr);
-    }
-    return *this;
-  }
-
-  // Smart pointer members.
-  void reset(T* ptr = NULL) {
-    depart();
-    capture(ptr);
-  }
-  T* get() const { return value_; }
-  T* operator->() const { return value_; }
-  T& operator*() const { return *value_; }
-
-  bool operator==(T* p) const { return value_ == p; }
-  bool operator!=(T* p) const { return value_ != p; }
-  template <typename U>
-  bool operator==(linked_ptr<U> const& ptr) const {
-    return value_ == ptr.get();
-  }
-  template <typename U>
-  bool operator!=(linked_ptr<U> const& ptr) const {
-    return value_ != ptr.get();
-  }
-
- private:
-  template <typename U>
-  friend class linked_ptr;
-
-  T* value_;
-  linked_ptr_internal link_;
-
-  void depart() {
-    if (link_.depart()) delete value_;
-  }
-
-  void capture(T* ptr) {
-    value_ = ptr;
-    link_.join_new();
-  }
-
-  template <typename U> void copy(linked_ptr<U> const* ptr) {
-    value_ = ptr->get();
-    if (value_)
-      link_.join(&ptr->link_);
-    else
-      link_.join_new();
-  }
-};
-
-template<typename T> inline
-bool operator==(T* ptr, const linked_ptr<T>& x) {
-  return ptr == x.get();
-}
-
-template<typename T> inline
-bool operator!=(T* ptr, const linked_ptr<T>& x) {
-  return ptr != x.get();
-}
-
-// A function to convert T* into linked_ptr<T>
-// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
-// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
-template <typename T>
-linked_ptr<T> make_linked_ptr(T* ptr) {
-  return linked_ptr<T>(ptr);
-}
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h b/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h
deleted file mode 100644
index 2582675..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h
+++ /dev/null
@@ -1,4822 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py gtest-param-util-generated.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl at google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
-//
-// Currently Google Test supports at most 50 arguments in Values,
-// and at most 10 arguments in Combine. Please contact
-// googletestframework at googlegroups.com if you need more.
-// Please note that the number of arguments to Combine is limited
-// by the maximum arity of the implementation of tr1::tuple which is
-// currently set at 10.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*.  Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Forward declarations of ValuesIn(), which is implemented in
-// include/gtest/gtest-param-test.h.
-template <typename ForwardIterator>
-internal::ParamGenerator<
-  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end);
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
-    const Container& container);
-
-namespace internal {
-
-// Used in the Values() function to provide polymorphic capabilities.
-template <typename T1>
-class ValueArray1 {
- public:
-  explicit ValueArray1(T1 v1) : v1_(v1) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray1& other);
-
-  const T1 v1_;
-};
-
-template <typename T1, typename T2>
-class ValueArray2 {
- public:
-  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray2& other);
-
-  const T1 v1_;
-  const T2 v2_;
-};
-
-template <typename T1, typename T2, typename T3>
-class ValueArray3 {
- public:
-  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray3& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-class ValueArray4 {
- public:
-  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray4& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class ValueArray5 {
- public:
-  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray5& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6>
-class ValueArray6 {
- public:
-  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray6& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7>
-class ValueArray7 {
- public:
-  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray7& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8>
-class ValueArray8 {
- public:
-  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
-      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray8& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9>
-class ValueArray9 {
- public:
-  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
-      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray9& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10>
-class ValueArray10 {
- public:
-  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray10& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11>
-class ValueArray11 {
- public:
-  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray11& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12>
-class ValueArray12 {
- public:
-  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray12& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13>
-class ValueArray13 {
- public:
-  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
-      v12_(v12), v13_(v13) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray13& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14>
-class ValueArray14 {
- public:
-  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray14& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15>
-class ValueArray15 {
- public:
-  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray15& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16>
-class ValueArray16 {
- public:
-  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
-      v16_(v16) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray16& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17>
-class ValueArray17 {
- public:
-  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
-      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray17& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18>
-class ValueArray18 {
- public:
-  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray18& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19>
-class ValueArray19 {
- public:
-  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray19& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20>
-class ValueArray20 {
- public:
-  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
-      v19_(v19), v20_(v20) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray20& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21>
-class ValueArray21 {
- public:
-  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray21& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22>
-class ValueArray22 {
- public:
-  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray22& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23>
-class ValueArray23 {
- public:
-  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
-        v23_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray23& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24>
-class ValueArray24 {
- public:
-  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
-      v22_(v22), v23_(v23), v24_(v24) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray24& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25>
-class ValueArray25 {
- public:
-  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
-      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray25& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26>
-class ValueArray26 {
- public:
-  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray26& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27>
-class ValueArray27 {
- public:
-  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
-      v26_(v26), v27_(v27) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray27& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28>
-class ValueArray28 {
- public:
-  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray28& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29>
-class ValueArray29 {
- public:
-  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray29& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30>
-class ValueArray30 {
- public:
-  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray30& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31>
-class ValueArray31 {
- public:
-  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30), v31_(v31) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray31& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32>
-class ValueArray32 {
- public:
-  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray32& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33>
-class ValueArray33 {
- public:
-  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
-      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray33& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34>
-class ValueArray34 {
- public:
-  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33), v34_(v34) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray34& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35>
-class ValueArray35 {
- public:
-  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
-      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
-      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
-        v35_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray35& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36>
-class ValueArray36 {
- public:
-  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
-      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray36& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37>
-class ValueArray37 {
- public:
-  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
-      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
-      v36_(v36), v37_(v37) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray37& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38>
-class ValueArray38 {
- public:
-  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray38& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39>
-class ValueArray39 {
- public:
-  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray39& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40>
-class ValueArray40 {
- public:
-  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
-      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
-      v40_(v40) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray40& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41>
-class ValueArray41 {
- public:
-  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
-      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
-      v39_(v39), v40_(v40), v41_(v41) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray41& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42>
-class ValueArray42 {
- public:
-  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray42& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43>
-class ValueArray43 {
- public:
-  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
-      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
-      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
-      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray43& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44>
-class ValueArray44 {
- public:
-  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
-      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
-      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
-      v43_(v43), v44_(v44) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray44& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45>
-class ValueArray45 {
- public:
-  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
-      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
-      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
-      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray45& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46>
-class ValueArray46 {
- public:
-  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
-      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray46& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-  const T46 v46_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47>
-class ValueArray47 {
- public:
-  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
-      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
-      v47_(v47) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
-        v47_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray47& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-  const T46 v46_;
-  const T47 v47_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48>
-class ValueArray48 {
- public:
-  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
-      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
-      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
-      v46_(v46), v47_(v47), v48_(v48) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray48& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-  const T46 v46_;
-  const T47 v47_;
-  const T48 v48_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49>
-class ValueArray49 {
- public:
-  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
-      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
-      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_, v49_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray49& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-  const T46 v46_;
-  const T47 v47_;
-  const T48 v48_;
-  const T49 v49_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49, typename T50>
-class ValueArray50 {
- public:
-  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
-      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
-      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
-
-  template <typename T>
-  operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_, v49_, v50_};
-    return ValuesIn(array);
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const ValueArray50& other);
-
-  const T1 v1_;
-  const T2 v2_;
-  const T3 v3_;
-  const T4 v4_;
-  const T5 v5_;
-  const T6 v6_;
-  const T7 v7_;
-  const T8 v8_;
-  const T9 v9_;
-  const T10 v10_;
-  const T11 v11_;
-  const T12 v12_;
-  const T13 v13_;
-  const T14 v14_;
-  const T15 v15_;
-  const T16 v16_;
-  const T17 v17_;
-  const T18 v18_;
-  const T19 v19_;
-  const T20 v20_;
-  const T21 v21_;
-  const T22 v22_;
-  const T23 v23_;
-  const T24 v24_;
-  const T25 v25_;
-  const T26 v26_;
-  const T27 v27_;
-  const T28 v28_;
-  const T29 v29_;
-  const T30 v30_;
-  const T31 v31_;
-  const T32 v32_;
-  const T33 v33_;
-  const T34 v34_;
-  const T35 v35_;
-  const T36 v36_;
-  const T37 v37_;
-  const T38 v38_;
-  const T39 v39_;
-  const T40 v40_;
-  const T41 v41_;
-  const T42 v42_;
-  const T43 v43_;
-  const T44 v44_;
-  const T45 v45_;
-  const T46 v46_;
-  const T47 v47_;
-  const T48 v48_;
-  const T49 v49_;
-  const T50 v50_;
-};
-
-# if GTEST_HAS_COMBINE
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Generates values from the Cartesian product of values produced
-// by the argument generators.
-//
-template <typename T1, typename T2>
-class CartesianProductGenerator2
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2> ParamType;
-
-  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2)
-      : g1_(g1), g2_(g2) {}
-  virtual ~CartesianProductGenerator2() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current2_;
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator2::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator2& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-};  // class CartesianProductGenerator2
-
-
-template <typename T1, typename T2, typename T3>
-class CartesianProductGenerator3
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
-
-  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
-      : g1_(g1), g2_(g2), g3_(g3) {}
-  virtual ~CartesianProductGenerator3() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current3_;
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator3::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator3& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-};  // class CartesianProductGenerator3
-
-
-template <typename T1, typename T2, typename T3, typename T4>
-class CartesianProductGenerator4
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
-
-  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
-  virtual ~CartesianProductGenerator4() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current4_;
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator4::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator4& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-};  // class CartesianProductGenerator4
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class CartesianProductGenerator5
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
-
-  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
-  virtual ~CartesianProductGenerator5() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current5_;
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator5::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator5& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-};  // class CartesianProductGenerator5
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6>
-class CartesianProductGenerator6
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
-        T6> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
-
-  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
-      const ParamGenerator<T6>& g6)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
-  virtual ~CartesianProductGenerator6() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5,
-      const ParamGenerator<T6>& g6,
-      const typename ParamGenerator<T6>::iterator& current6)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current6_;
-      if (current6_ == end6_) {
-        current6_ = begin6_;
-        ++current5_;
-      }
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_ &&
-          current6_ == typed_other->current6_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_),
-        begin6_(other.begin6_),
-        end6_(other.end6_),
-        current6_(other.current6_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_, *current6_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_ ||
-          current6_ == end6_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    const typename ParamGenerator<T6>::iterator begin6_;
-    const typename ParamGenerator<T6>::iterator end6_;
-    typename ParamGenerator<T6>::iterator current6_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator6::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator6& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-  const ParamGenerator<T6> g6_;
-};  // class CartesianProductGenerator6
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7>
-class CartesianProductGenerator7
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
-        T7> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
-
-  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
-  virtual ~CartesianProductGenerator7() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
-        g7_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5,
-      const ParamGenerator<T6>& g6,
-      const typename ParamGenerator<T6>::iterator& current6,
-      const ParamGenerator<T7>& g7,
-      const typename ParamGenerator<T7>::iterator& current7)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current7_;
-      if (current7_ == end7_) {
-        current7_ = begin7_;
-        ++current6_;
-      }
-      if (current6_ == end6_) {
-        current6_ = begin6_;
-        ++current5_;
-      }
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_ &&
-          current6_ == typed_other->current6_ &&
-          current7_ == typed_other->current7_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_),
-        begin6_(other.begin6_),
-        end6_(other.end6_),
-        current6_(other.current6_),
-        begin7_(other.begin7_),
-        end7_(other.end7_),
-        current7_(other.current7_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_, *current6_, *current7_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_ ||
-          current6_ == end6_ ||
-          current7_ == end7_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    const typename ParamGenerator<T6>::iterator begin6_;
-    const typename ParamGenerator<T6>::iterator end6_;
-    typename ParamGenerator<T6>::iterator current6_;
-    const typename ParamGenerator<T7>::iterator begin7_;
-    const typename ParamGenerator<T7>::iterator end7_;
-    typename ParamGenerator<T7>::iterator current7_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator7::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator7& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-  const ParamGenerator<T6> g6_;
-  const ParamGenerator<T7> g7_;
-};  // class CartesianProductGenerator7
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8>
-class CartesianProductGenerator8
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
-        T7, T8> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
-
-  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
-      const ParamGenerator<T8>& g8)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
-          g8_(g8) {}
-  virtual ~CartesianProductGenerator8() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
-        g7_.begin(), g8_, g8_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
-        g8_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5,
-      const ParamGenerator<T6>& g6,
-      const typename ParamGenerator<T6>::iterator& current6,
-      const ParamGenerator<T7>& g7,
-      const typename ParamGenerator<T7>::iterator& current7,
-      const ParamGenerator<T8>& g8,
-      const typename ParamGenerator<T8>::iterator& current8)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current8_;
-      if (current8_ == end8_) {
-        current8_ = begin8_;
-        ++current7_;
-      }
-      if (current7_ == end7_) {
-        current7_ = begin7_;
-        ++current6_;
-      }
-      if (current6_ == end6_) {
-        current6_ = begin6_;
-        ++current5_;
-      }
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_ &&
-          current6_ == typed_other->current6_ &&
-          current7_ == typed_other->current7_ &&
-          current8_ == typed_other->current8_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_),
-        begin6_(other.begin6_),
-        end6_(other.end6_),
-        current6_(other.current6_),
-        begin7_(other.begin7_),
-        end7_(other.end7_),
-        current7_(other.current7_),
-        begin8_(other.begin8_),
-        end8_(other.end8_),
-        current8_(other.current8_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_, *current6_, *current7_, *current8_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_ ||
-          current6_ == end6_ ||
-          current7_ == end7_ ||
-          current8_ == end8_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    const typename ParamGenerator<T6>::iterator begin6_;
-    const typename ParamGenerator<T6>::iterator end6_;
-    typename ParamGenerator<T6>::iterator current6_;
-    const typename ParamGenerator<T7>::iterator begin7_;
-    const typename ParamGenerator<T7>::iterator end7_;
-    typename ParamGenerator<T7>::iterator current7_;
-    const typename ParamGenerator<T8>::iterator begin8_;
-    const typename ParamGenerator<T8>::iterator end8_;
-    typename ParamGenerator<T8>::iterator current8_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator8::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator8& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-  const ParamGenerator<T6> g6_;
-  const ParamGenerator<T7> g7_;
-  const ParamGenerator<T8> g8_;
-};  // class CartesianProductGenerator8
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9>
-class CartesianProductGenerator9
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
-        T7, T8, T9> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
-
-  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
-      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
-          g9_(g9) {}
-  virtual ~CartesianProductGenerator9() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
-        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
-        g8_.end(), g9_, g9_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5,
-      const ParamGenerator<T6>& g6,
-      const typename ParamGenerator<T6>::iterator& current6,
-      const ParamGenerator<T7>& g7,
-      const typename ParamGenerator<T7>::iterator& current7,
-      const ParamGenerator<T8>& g8,
-      const typename ParamGenerator<T8>::iterator& current8,
-      const ParamGenerator<T9>& g9,
-      const typename ParamGenerator<T9>::iterator& current9)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
-          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current9_;
-      if (current9_ == end9_) {
-        current9_ = begin9_;
-        ++current8_;
-      }
-      if (current8_ == end8_) {
-        current8_ = begin8_;
-        ++current7_;
-      }
-      if (current7_ == end7_) {
-        current7_ = begin7_;
-        ++current6_;
-      }
-      if (current6_ == end6_) {
-        current6_ = begin6_;
-        ++current5_;
-      }
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_ &&
-          current6_ == typed_other->current6_ &&
-          current7_ == typed_other->current7_ &&
-          current8_ == typed_other->current8_ &&
-          current9_ == typed_other->current9_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_),
-        begin6_(other.begin6_),
-        end6_(other.end6_),
-        current6_(other.current6_),
-        begin7_(other.begin7_),
-        end7_(other.end7_),
-        current7_(other.current7_),
-        begin8_(other.begin8_),
-        end8_(other.end8_),
-        current8_(other.current8_),
-        begin9_(other.begin9_),
-        end9_(other.end9_),
-        current9_(other.current9_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_, *current6_, *current7_, *current8_,
-            *current9_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_ ||
-          current6_ == end6_ ||
-          current7_ == end7_ ||
-          current8_ == end8_ ||
-          current9_ == end9_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    const typename ParamGenerator<T6>::iterator begin6_;
-    const typename ParamGenerator<T6>::iterator end6_;
-    typename ParamGenerator<T6>::iterator current6_;
-    const typename ParamGenerator<T7>::iterator begin7_;
-    const typename ParamGenerator<T7>::iterator end7_;
-    typename ParamGenerator<T7>::iterator current7_;
-    const typename ParamGenerator<T8>::iterator begin8_;
-    const typename ParamGenerator<T8>::iterator end8_;
-    typename ParamGenerator<T8>::iterator current8_;
-    const typename ParamGenerator<T9>::iterator begin9_;
-    const typename ParamGenerator<T9>::iterator end9_;
-    typename ParamGenerator<T9>::iterator current9_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator9::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator9& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-  const ParamGenerator<T6> g6_;
-  const ParamGenerator<T7> g7_;
-  const ParamGenerator<T8> g8_;
-  const ParamGenerator<T9> g9_;
-};  // class CartesianProductGenerator9
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10>
-class CartesianProductGenerator10
-    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
-        T7, T8, T9, T10> > {
- public:
-  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
-
-  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
-      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
-      const ParamGenerator<T10>& g10)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
-          g9_(g9), g10_(g10) {}
-  virtual ~CartesianProductGenerator10() {}
-
-  virtual ParamIteratorInterface<ParamType>* Begin() const {
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
-        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
-  }
-  virtual ParamIteratorInterface<ParamType>* End() const {
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
-        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<ParamType> {
-   public:
-    Iterator(const ParamGeneratorInterface<ParamType>* base,
-      const ParamGenerator<T1>& g1,
-      const typename ParamGenerator<T1>::iterator& current1,
-      const ParamGenerator<T2>& g2,
-      const typename ParamGenerator<T2>::iterator& current2,
-      const ParamGenerator<T3>& g3,
-      const typename ParamGenerator<T3>::iterator& current3,
-      const ParamGenerator<T4>& g4,
-      const typename ParamGenerator<T4>::iterator& current4,
-      const ParamGenerator<T5>& g5,
-      const typename ParamGenerator<T5>::iterator& current5,
-      const ParamGenerator<T6>& g6,
-      const typename ParamGenerator<T6>::iterator& current6,
-      const ParamGenerator<T7>& g7,
-      const typename ParamGenerator<T7>::iterator& current7,
-      const ParamGenerator<T8>& g8,
-      const typename ParamGenerator<T8>::iterator& current8,
-      const ParamGenerator<T9>& g9,
-      const typename ParamGenerator<T9>::iterator& current9,
-      const ParamGenerator<T10>& g10,
-      const typename ParamGenerator<T10>::iterator& current10)
-        : base_(base),
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
-          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
-          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
-      ComputeCurrentValue();
-    }
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
-      return base_;
-    }
-    // Advance should not be called on beyond-of-range iterators
-    // so no component iterators must be beyond end of range, either.
-    virtual void Advance() {
-      assert(!AtEnd());
-      ++current10_;
-      if (current10_ == end10_) {
-        current10_ = begin10_;
-        ++current9_;
-      }
-      if (current9_ == end9_) {
-        current9_ = begin9_;
-        ++current8_;
-      }
-      if (current8_ == end8_) {
-        current8_ = begin8_;
-        ++current7_;
-      }
-      if (current7_ == end7_) {
-        current7_ = begin7_;
-        ++current6_;
-      }
-      if (current6_ == end6_) {
-        current6_ = begin6_;
-        ++current5_;
-      }
-      if (current5_ == end5_) {
-        current5_ = begin5_;
-        ++current4_;
-      }
-      if (current4_ == end4_) {
-        current4_ = begin4_;
-        ++current3_;
-      }
-      if (current3_ == end3_) {
-        current3_ = begin3_;
-        ++current2_;
-      }
-      if (current2_ == end2_) {
-        current2_ = begin2_;
-        ++current1_;
-      }
-      ComputeCurrentValue();
-    }
-    virtual ParamIteratorInterface<ParamType>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const ParamType* Current() const { return &current_value_; }
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const Iterator* typed_other =
-          CheckedDowncastToActualType<const Iterator>(&other);
-      // We must report iterators equal if they both point beyond their
-      // respective ranges. That can happen in a variety of fashions,
-      // so we have to consult AtEnd().
-      return (AtEnd() && typed_other->AtEnd()) ||
-         (
-          current1_ == typed_other->current1_ &&
-          current2_ == typed_other->current2_ &&
-          current3_ == typed_other->current3_ &&
-          current4_ == typed_other->current4_ &&
-          current5_ == typed_other->current5_ &&
-          current6_ == typed_other->current6_ &&
-          current7_ == typed_other->current7_ &&
-          current8_ == typed_other->current8_ &&
-          current9_ == typed_other->current9_ &&
-          current10_ == typed_other->current10_);
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : base_(other.base_),
-        begin1_(other.begin1_),
-        end1_(other.end1_),
-        current1_(other.current1_),
-        begin2_(other.begin2_),
-        end2_(other.end2_),
-        current2_(other.current2_),
-        begin3_(other.begin3_),
-        end3_(other.end3_),
-        current3_(other.current3_),
-        begin4_(other.begin4_),
-        end4_(other.end4_),
-        current4_(other.current4_),
-        begin5_(other.begin5_),
-        end5_(other.end5_),
-        current5_(other.current5_),
-        begin6_(other.begin6_),
-        end6_(other.end6_),
-        current6_(other.current6_),
-        begin7_(other.begin7_),
-        end7_(other.end7_),
-        current7_(other.current7_),
-        begin8_(other.begin8_),
-        end8_(other.end8_),
-        current8_(other.current8_),
-        begin9_(other.begin9_),
-        end9_(other.end9_),
-        current9_(other.current9_),
-        begin10_(other.begin10_),
-        end10_(other.end10_),
-        current10_(other.current10_) {
-      ComputeCurrentValue();
-    }
-
-    void ComputeCurrentValue() {
-      if (!AtEnd())
-        current_value_ = ParamType(*current1_, *current2_, *current3_,
-            *current4_, *current5_, *current6_, *current7_, *current8_,
-            *current9_, *current10_);
-    }
-    bool AtEnd() const {
-      // We must report iterator past the end of the range when either of the
-      // component iterators has reached the end of its range.
-      return
-          current1_ == end1_ ||
-          current2_ == end2_ ||
-          current3_ == end3_ ||
-          current4_ == end4_ ||
-          current5_ == end5_ ||
-          current6_ == end6_ ||
-          current7_ == end7_ ||
-          current8_ == end8_ ||
-          current9_ == end9_ ||
-          current10_ == end10_;
-    }
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<ParamType>* const base_;
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
-    // current[i]_ is the actual traversing iterator.
-    const typename ParamGenerator<T1>::iterator begin1_;
-    const typename ParamGenerator<T1>::iterator end1_;
-    typename ParamGenerator<T1>::iterator current1_;
-    const typename ParamGenerator<T2>::iterator begin2_;
-    const typename ParamGenerator<T2>::iterator end2_;
-    typename ParamGenerator<T2>::iterator current2_;
-    const typename ParamGenerator<T3>::iterator begin3_;
-    const typename ParamGenerator<T3>::iterator end3_;
-    typename ParamGenerator<T3>::iterator current3_;
-    const typename ParamGenerator<T4>::iterator begin4_;
-    const typename ParamGenerator<T4>::iterator end4_;
-    typename ParamGenerator<T4>::iterator current4_;
-    const typename ParamGenerator<T5>::iterator begin5_;
-    const typename ParamGenerator<T5>::iterator end5_;
-    typename ParamGenerator<T5>::iterator current5_;
-    const typename ParamGenerator<T6>::iterator begin6_;
-    const typename ParamGenerator<T6>::iterator end6_;
-    typename ParamGenerator<T6>::iterator current6_;
-    const typename ParamGenerator<T7>::iterator begin7_;
-    const typename ParamGenerator<T7>::iterator end7_;
-    typename ParamGenerator<T7>::iterator current7_;
-    const typename ParamGenerator<T8>::iterator begin8_;
-    const typename ParamGenerator<T8>::iterator end8_;
-    typename ParamGenerator<T8>::iterator current8_;
-    const typename ParamGenerator<T9>::iterator begin9_;
-    const typename ParamGenerator<T9>::iterator end9_;
-    typename ParamGenerator<T9>::iterator current9_;
-    const typename ParamGenerator<T10>::iterator begin10_;
-    const typename ParamGenerator<T10>::iterator end10_;
-    typename ParamGenerator<T10>::iterator current10_;
-    ParamType current_value_;
-  };  // class CartesianProductGenerator10::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductGenerator10& other);
-
-  const ParamGenerator<T1> g1_;
-  const ParamGenerator<T2> g2_;
-  const ParamGenerator<T3> g3_;
-  const ParamGenerator<T4> g4_;
-  const ParamGenerator<T5> g5_;
-  const ParamGenerator<T6> g6_;
-  const ParamGenerator<T7> g7_;
-  const ParamGenerator<T8> g8_;
-  const ParamGenerator<T9> g9_;
-  const ParamGenerator<T10> g10_;
-};  // class CartesianProductGenerator10
-
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Helper classes providing Combine() with polymorphic features. They allow
-// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
-// convertible to U.
-//
-template <class Generator1, class Generator2>
-class CartesianProductHolder2 {
- public:
-CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
-      : g1_(g1), g2_(g2) {}
-  template <typename T1, typename T2>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
-        new CartesianProductGenerator2<T1, T2>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder2& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-};  // class CartesianProductHolder2
-
-template <class Generator1, class Generator2, class Generator3>
-class CartesianProductHolder3 {
- public:
-CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3)
-      : g1_(g1), g2_(g2), g3_(g3) {}
-  template <typename T1, typename T2, typename T3>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
-        new CartesianProductGenerator3<T1, T2, T3>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder3& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-};  // class CartesianProductHolder3
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4>
-class CartesianProductHolder4 {
- public:
-CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
-  template <typename T1, typename T2, typename T3, typename T4>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
-        new CartesianProductGenerator4<T1, T2, T3, T4>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder4& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-};  // class CartesianProductHolder4
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5>
-class CartesianProductHolder5 {
- public:
-CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
-        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder5& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-};  // class CartesianProductHolder5
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5, class Generator6>
-class CartesianProductHolder6 {
- public:
-CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,
-    const Generator6& g6)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-      typename T6>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
-        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_),
-        static_cast<ParamGenerator<T6> >(g6_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder6& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-  const Generator6 g6_;
-};  // class CartesianProductHolder6
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5, class Generator6, class Generator7>
-class CartesianProductHolder7 {
- public:
-CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,
-    const Generator6& g6, const Generator7& g7)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-      typename T6, typename T7>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
-      T7> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
-        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_),
-        static_cast<ParamGenerator<T6> >(g6_),
-        static_cast<ParamGenerator<T7> >(g7_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder7& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-  const Generator6 g6_;
-  const Generator7 g7_;
-};  // class CartesianProductHolder7
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5, class Generator6, class Generator7,
-    class Generator8>
-class CartesianProductHolder8 {
- public:
-CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,
-    const Generator6& g6, const Generator7& g7, const Generator8& g8)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
-          g8_(g8) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-      typename T6, typename T7, typename T8>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
-      T8> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
-        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_),
-        static_cast<ParamGenerator<T6> >(g6_),
-        static_cast<ParamGenerator<T7> >(g7_),
-        static_cast<ParamGenerator<T8> >(g8_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder8& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-  const Generator6 g6_;
-  const Generator7 g7_;
-  const Generator8 g8_;
-};  // class CartesianProductHolder8
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5, class Generator6, class Generator7,
-    class Generator8, class Generator9>
-class CartesianProductHolder9 {
- public:
-CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,
-    const Generator6& g6, const Generator7& g7, const Generator8& g8,
-    const Generator9& g9)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
-          g9_(g9) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-      typename T6, typename T7, typename T8, typename T9>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
-      T9> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
-        T9> >(
-        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_),
-        static_cast<ParamGenerator<T6> >(g6_),
-        static_cast<ParamGenerator<T7> >(g7_),
-        static_cast<ParamGenerator<T8> >(g8_),
-        static_cast<ParamGenerator<T9> >(g9_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder9& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-  const Generator6 g6_;
-  const Generator7 g7_;
-  const Generator8 g8_;
-  const Generator9 g9_;
-};  // class CartesianProductHolder9
-
-template <class Generator1, class Generator2, class Generator3,
-    class Generator4, class Generator5, class Generator6, class Generator7,
-    class Generator8, class Generator9, class Generator10>
-class CartesianProductHolder10 {
- public:
-CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,
-    const Generator6& g6, const Generator7& g7, const Generator8& g8,
-    const Generator9& g9, const Generator10& g10)
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
-          g9_(g9), g10_(g10) {}
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-      typename T6, typename T7, typename T8, typename T9, typename T10>
-  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
-      T9, T10> >() const {
-    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
-        T9, T10> >(
-        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
-            T10>(
-        static_cast<ParamGenerator<T1> >(g1_),
-        static_cast<ParamGenerator<T2> >(g2_),
-        static_cast<ParamGenerator<T3> >(g3_),
-        static_cast<ParamGenerator<T4> >(g4_),
-        static_cast<ParamGenerator<T5> >(g5_),
-        static_cast<ParamGenerator<T6> >(g6_),
-        static_cast<ParamGenerator<T7> >(g7_),
-        static_cast<ParamGenerator<T8> >(g8_),
-        static_cast<ParamGenerator<T9> >(g9_),
-        static_cast<ParamGenerator<T10> >(g10_)));
-  }
-
- private:
-  // No implementation - assignment is unsupported.
-  void operator=(const CartesianProductHolder10& other);
-
-  const Generator1 g1_;
-  const Generator2 g2_;
-  const Generator3 g3_;
-  const Generator4 g4_;
-  const Generator5 g5_;
-  const Generator6 g6_;
-  const Generator7 g7_;
-  const Generator8 g8_;
-  const Generator9 g9_;
-  const Generator10 g10_;
-};  // class CartesianProductHolder10
-
-# endif  // GTEST_HAS_COMBINE
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  //  GTEST_HAS_PARAM_TEST
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-param-util.h b/unit_tests/gtest/include/gtest/internal/gtest-param-util.h
deleted file mode 100644
index 0ef9718..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-param-util.h
+++ /dev/null
@@ -1,619 +0,0 @@
-// Copyright 2008 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl at google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-
-#include <iterator>
-#include <utility>
-#include <vector>
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*.  Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-linked_ptr.h"
-#include "gtest/internal/gtest-port.h"
-#include "gtest/gtest-printers.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-namespace internal {
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Outputs a message explaining invalid registration of different
-// fixture class for the same test case. This may happen when
-// TEST_P macro is used to define two tests with the same name
-// but in different namespaces.
-GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
-                                          const char* file, int line);
-
-template <typename> class ParamGeneratorInterface;
-template <typename> class ParamGenerator;
-
-// Interface for iterating over elements provided by an implementation
-// of ParamGeneratorInterface<T>.
-template <typename T>
-class ParamIteratorInterface {
- public:
-  virtual ~ParamIteratorInterface() {}
-  // A pointer to the base generator instance.
-  // Used only for the purposes of iterator comparison
-  // to make sure that two iterators belong to the same generator.
-  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
-  // Advances iterator to point to the next element
-  // provided by the generator. The caller is responsible
-  // for not calling Advance() on an iterator equal to
-  // BaseGenerator()->End().
-  virtual void Advance() = 0;
-  // Clones the iterator object. Used for implementing copy semantics
-  // of ParamIterator<T>.
-  virtual ParamIteratorInterface* Clone() const = 0;
-  // Dereferences the current iterator and provides (read-only) access
-  // to the pointed value. It is the caller's responsibility not to call
-  // Current() on an iterator equal to BaseGenerator()->End().
-  // Used for implementing ParamGenerator<T>::operator*().
-  virtual const T* Current() const = 0;
-  // Determines whether the given iterator and other point to the same
-  // element in the sequence generated by the generator.
-  // Used for implementing ParamGenerator<T>::operator==().
-  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
-};
-
-// Class iterating over elements provided by an implementation of
-// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
-// and implements the const forward iterator concept.
-template <typename T>
-class ParamIterator {
- public:
-  typedef T value_type;
-  typedef const T& reference;
-  typedef ptrdiff_t difference_type;
-
-  // ParamIterator assumes ownership of the impl_ pointer.
-  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
-  ParamIterator& operator=(const ParamIterator& other) {
-    if (this != &other)
-      impl_.reset(other.impl_->Clone());
-    return *this;
-  }
-
-  const T& operator*() const { return *impl_->Current(); }
-  const T* operator->() const { return impl_->Current(); }
-  // Prefix version of operator++.
-  ParamIterator& operator++() {
-    impl_->Advance();
-    return *this;
-  }
-  // Postfix version of operator++.
-  ParamIterator operator++(int /*unused*/) {
-    ParamIteratorInterface<T>* clone = impl_->Clone();
-    impl_->Advance();
-    return ParamIterator(clone);
-  }
-  bool operator==(const ParamIterator& other) const {
-    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
-  }
-  bool operator!=(const ParamIterator& other) const {
-    return !(*this == other);
-  }
-
- private:
-  friend class ParamGenerator<T>;
-  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
-  scoped_ptr<ParamIteratorInterface<T> > impl_;
-};
-
-// ParamGeneratorInterface<T> is the binary interface to access generators
-// defined in other translation units.
-template <typename T>
-class ParamGeneratorInterface {
- public:
-  typedef T ParamType;
-
-  virtual ~ParamGeneratorInterface() {}
-
-  // Generator interface definition
-  virtual ParamIteratorInterface<T>* Begin() const = 0;
-  virtual ParamIteratorInterface<T>* End() const = 0;
-};
-
-// Wraps ParamGeneratorInterface<T> and provides general generator syntax
-// compatible with the STL Container concept.
-// This class implements copy initialization semantics and the contained
-// ParamGeneratorInterface<T> instance is shared among all copies
-// of the original object. This is possible because that instance is immutable.
-template<typename T>
-class ParamGenerator {
- public:
-  typedef ParamIterator<T> iterator;
-
-  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
-  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
-
-  ParamGenerator& operator=(const ParamGenerator& other) {
-    impl_ = other.impl_;
-    return *this;
-  }
-
-  iterator begin() const { return iterator(impl_->Begin()); }
-  iterator end() const { return iterator(impl_->End()); }
-
- private:
-  linked_ptr<const ParamGeneratorInterface<T> > impl_;
-};
-
-// Generates values from a range of two comparable values. Can be used to
-// generate sequences of user-defined types that implement operator+() and
-// operator<().
-// This class is used in the Range() function.
-template <typename T, typename IncrementT>
-class RangeGenerator : public ParamGeneratorInterface<T> {
- public:
-  RangeGenerator(T begin, T end, IncrementT step)
-      : begin_(begin), end_(end),
-        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
-  virtual ~RangeGenerator() {}
-
-  virtual ParamIteratorInterface<T>* Begin() const {
-    return new Iterator(this, begin_, 0, step_);
-  }
-  virtual ParamIteratorInterface<T>* End() const {
-    return new Iterator(this, end_, end_index_, step_);
-  }
-
- private:
-  class Iterator : public ParamIteratorInterface<T> {
-   public:
-    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
-             IncrementT step)
-        : base_(base), value_(value), index_(index), step_(step) {}
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
-      return base_;
-    }
-    virtual void Advance() {
-      value_ = value_ + step_;
-      index_++;
-    }
-    virtual ParamIteratorInterface<T>* Clone() const {
-      return new Iterator(*this);
-    }
-    virtual const T* Current() const { return &value_; }
-    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      const int other_index =
-          CheckedDowncastToActualType<const Iterator>(&other)->index_;
-      return index_ == other_index;
-    }
-
-   private:
-    Iterator(const Iterator& other)
-        : ParamIteratorInterface<T>(),
-          base_(other.base_), value_(other.value_), index_(other.index_),
-          step_(other.step_) {}
-
-    // No implementation - assignment is unsupported.
-    void operator=(const Iterator& other);
-
-    const ParamGeneratorInterface<T>* const base_;
-    T value_;
-    int index_;
-    const IncrementT step_;
-  };  // class RangeGenerator::Iterator
-
-  static int CalculateEndIndex(const T& begin,
-                               const T& end,
-                               const IncrementT& step) {
-    int end_index = 0;
-    for (T i = begin; i < end; i = i + step)
-      end_index++;
-    return end_index;
-  }
-
-  // No implementation - assignment is unsupported.
-  void operator=(const RangeGenerator& other);
-
-  const T begin_;
-  const T end_;
-  const IncrementT step_;
-  // The index for the end() iterator. All the elements in the generated
-  // sequence are indexed (0-based) to aid iterator comparison.
-  const int end_index_;
-};  // class RangeGenerator
-
-
-// Generates values from a pair of STL-style iterators. Used in the
-// ValuesIn() function. The elements are copied from the source range
-// since the source can be located on the stack, and the generator
-// is likely to persist beyond that stack frame.
-template <typename T>
-class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
- public:
-  template <typename ForwardIterator>
-  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
-      : container_(begin, end) {}
-  virtual ~ValuesInIteratorRangeGenerator() {}
-
-  virtual ParamIteratorInterface<T>* Begin() const {
-    return new Iterator(this, container_.begin());
-  }
-  virtual ParamIteratorInterface<T>* End() const {
-    return new Iterator(this, container_.end());
-  }
-
- private:
-  typedef typename ::std::vector<T> ContainerType;
-
-  class Iterator : public ParamIteratorInterface<T> {
-   public:
-    Iterator(const ParamGeneratorInterface<T>* base,
-             typename ContainerType::const_iterator iterator)
-        : base_(base), iterator_(iterator) {}
-    virtual ~Iterator() {}
-
-    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
-      return base_;
-    }
-    virtual void Advance() {
-      ++iterator_;
-      value_.reset();
-    }
-    virtual ParamIteratorInterface<T>* Clone() const {
-      return new Iterator(*this);
-    }
-    // We need to use cached value referenced by iterator_ because *iterator_
-    // can return a temporary object (and of type other then T), so just
-    // having "return &*iterator_;" doesn't work.
-    // value_ is updated here and not in Advance() because Advance()
-    // can advance iterator_ beyond the end of the range, and we cannot
-    // detect that fact. The client code, on the other hand, is
-    // responsible for not calling Current() on an out-of-range iterator.
-    virtual const T* Current() const {
-      if (value_.get() == NULL)
-        value_.reset(new T(*iterator_));
-      return value_.get();
-    }
-    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
-      // Having the same base generator guarantees that the other
-      // iterator is of the same type and we can downcast.
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
-          << "The program attempted to compare iterators "
-          << "from different generators." << std::endl;
-      return iterator_ ==
-          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
-    }
-
-   private:
-    Iterator(const Iterator& other)
-          // The explicit constructor call suppresses a false warning
-          // emitted by gcc when supplied with the -Wextra option.
-        : ParamIteratorInterface<T>(),
-          base_(other.base_),
-          iterator_(other.iterator_) {}
-
-    const ParamGeneratorInterface<T>* const base_;
-    typename ContainerType::const_iterator iterator_;
-    // A cached value of *iterator_. We keep it here to allow access by
-    // pointer in the wrapping iterator's operator->().
-    // value_ needs to be mutable to be accessed in Current().
-    // Use of scoped_ptr helps manage cached value's lifetime,
-    // which is bound by the lifespan of the iterator itself.
-    mutable scoped_ptr<const T> value_;
-  };  // class ValuesInIteratorRangeGenerator::Iterator
-
-  // No implementation - assignment is unsupported.
-  void operator=(const ValuesInIteratorRangeGenerator& other);
-
-  const ContainerType container_;
-};  // class ValuesInIteratorRangeGenerator
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Stores a parameter value and later creates tests parameterized with that
-// value.
-template <class TestClass>
-class ParameterizedTestFactory : public TestFactoryBase {
- public:
-  typedef typename TestClass::ParamType ParamType;
-  explicit ParameterizedTestFactory(ParamType parameter) :
-      parameter_(parameter) {}
-  virtual Test* CreateTest() {
-    TestClass::SetParam(&parameter_);
-    return new TestClass();
-  }
-
- private:
-  const ParamType parameter_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactoryBase is a base class for meta-factories that create
-// test factories for passing into MakeAndRegisterTestInfo function.
-template <class ParamType>
-class TestMetaFactoryBase {
- public:
-  virtual ~TestMetaFactoryBase() {}
-
-  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactory creates test factories for passing into
-// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
-// ownership of test factory pointer, same factory object cannot be passed
-// into that method twice. But ParameterizedTestCaseInfo is going to call
-// it for each Test/Parameter value combination. Thus it needs meta factory
-// creator class.
-template <class TestCase>
-class TestMetaFactory
-    : public TestMetaFactoryBase<typename TestCase::ParamType> {
- public:
-  typedef typename TestCase::ParamType ParamType;
-
-  TestMetaFactory() {}
-
-  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
-    return new ParameterizedTestFactory<TestCase>(parameter);
-  }
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfoBase is a generic interface
-// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
-// accumulates test information provided by TEST_P macro invocations
-// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
-// and uses that information to register all resulting test instances
-// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
-// a collection of pointers to the ParameterizedTestCaseInfo objects
-// and calls RegisterTests() on each of them when asked.
-class ParameterizedTestCaseInfoBase {
- public:
-  virtual ~ParameterizedTestCaseInfoBase() {}
-
-  // Base part of test case name for display purposes.
-  virtual const string& GetTestCaseName() const = 0;
-  // Test case id to verify identity.
-  virtual TypeId GetTestCaseTypeId() const = 0;
-  // UnitTest class invokes this method to register tests in this
-  // test case right before running them in RUN_ALL_TESTS macro.
-  // This method should not be called more then once on any single
-  // instance of a ParameterizedTestCaseInfoBase derived class.
-  virtual void RegisterTests() = 0;
-
- protected:
-  ParameterizedTestCaseInfoBase() {}
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
-// macro invocations for a particular test case and generators
-// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
-// test case. It registers tests with all values generated by all
-// generators when asked.
-template <class TestCase>
-class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
- public:
-  // ParamType and GeneratorCreationFunc are private types but are required
-  // for declarations of public methods AddTestPattern() and
-  // AddTestCaseInstantiation().
-  typedef typename TestCase::ParamType ParamType;
-  // A function that returns an instance of appropriate generator type.
-  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
-
-  explicit ParameterizedTestCaseInfo(const char* name)
-      : test_case_name_(name) {}
-
-  // Test case base name for display purposes.
-  virtual const string& GetTestCaseName() const { return test_case_name_; }
-  // Test case id to verify identity.
-  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
-  // TEST_P macro uses AddTestPattern() to record information
-  // about a single test in a LocalTestInfo structure.
-  // test_case_name is the base name of the test case (without invocation
-  // prefix). test_base_name is the name of an individual test without
-  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
-  // test case base name and DoBar is test base name.
-  void AddTestPattern(const char* test_case_name,
-                      const char* test_base_name,
-                      TestMetaFactoryBase<ParamType>* meta_factory) {
-    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
-                                                       test_base_name,
-                                                       meta_factory)));
-  }
-  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
-  // about a generator.
-  int AddTestCaseInstantiation(const string& instantiation_name,
-                               GeneratorCreationFunc* func,
-                               const char* /* file */,
-                               int /* line */) {
-    instantiations_.push_back(::std::make_pair(instantiation_name, func));
-    return 0;  // Return value used only to run this method in namespace scope.
-  }
-  // UnitTest class invokes this method to register tests in this test case
-  // test cases right before running tests in RUN_ALL_TESTS macro.
-  // This method should not be called more then once on any single
-  // instance of a ParameterizedTestCaseInfoBase derived class.
-  // UnitTest has a guard to prevent from calling this method more then once.
-  virtual void RegisterTests() {
-    for (typename TestInfoContainer::iterator test_it = tests_.begin();
-         test_it != tests_.end(); ++test_it) {
-      linked_ptr<TestInfo> test_info = *test_it;
-      for (typename InstantiationContainer::iterator gen_it =
-               instantiations_.begin(); gen_it != instantiations_.end();
-               ++gen_it) {
-        const string& instantiation_name = gen_it->first;
-        ParamGenerator<ParamType> generator((*gen_it->second)());
-
-        Message test_case_name_stream;
-        if ( !instantiation_name.empty() )
-          test_case_name_stream << instantiation_name << "/";
-        test_case_name_stream << test_info->test_case_base_name;
-
-        int i = 0;
-        for (typename ParamGenerator<ParamType>::iterator param_it =
-                 generator.begin();
-             param_it != generator.end(); ++param_it, ++i) {
-          Message test_name_stream;
-          test_name_stream << test_info->test_base_name << "/" << i;
-          MakeAndRegisterTestInfo(
-              test_case_name_stream.GetString().c_str(),
-              test_name_stream.GetString().c_str(),
-              NULL,  // No type parameter.
-              PrintToString(*param_it).c_str(),
-              GetTestCaseTypeId(),
-              TestCase::SetUpTestCase,
-              TestCase::TearDownTestCase,
-              test_info->test_meta_factory->CreateTestFactory(*param_it));
-        }  // for param_it
-      }  // for gen_it
-    }  // for test_it
-  }  // RegisterTests
-
- private:
-  // LocalTestInfo structure keeps information about a single test registered
-  // with TEST_P macro.
-  struct TestInfo {
-    TestInfo(const char* a_test_case_base_name,
-             const char* a_test_base_name,
-             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
-        test_case_base_name(a_test_case_base_name),
-        test_base_name(a_test_base_name),
-        test_meta_factory(a_test_meta_factory) {}
-
-    const string test_case_base_name;
-    const string test_base_name;
-    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
-  };
-  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
-  // Keeps pairs of <Instantiation name, Sequence generator creation function>
-  // received from INSTANTIATE_TEST_CASE_P macros.
-  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
-      InstantiationContainer;
-
-  const string test_case_name_;
-  TestInfoContainer tests_;
-  InstantiationContainer instantiations_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
-};  // class ParameterizedTestCaseInfo
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
-// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
-// macros use it to locate their corresponding ParameterizedTestCaseInfo
-// descriptors.
-class ParameterizedTestCaseRegistry {
- public:
-  ParameterizedTestCaseRegistry() {}
-  ~ParameterizedTestCaseRegistry() {
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
-         it != test_case_infos_.end(); ++it) {
-      delete *it;
-    }
-  }
-
-  // Looks up or creates and returns a structure containing information about
-  // tests and instantiations of a particular test case.
-  template <class TestCase>
-  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
-      const char* test_case_name,
-      const char* file,
-      int line) {
-    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
-         it != test_case_infos_.end(); ++it) {
-      if ((*it)->GetTestCaseName() == test_case_name) {
-        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
-          // Complain about incorrect usage of Google Test facilities
-          // and terminate the program since we cannot guaranty correct
-          // test case setup and tear-down in this case.
-          ReportInvalidTestCaseType(test_case_name,  file, line);
-          posix::Abort();
-        } else {
-          // At this point we are sure that the object we found is of the same
-          // type we are looking for, so we downcast it to that type
-          // without further checks.
-          typed_test_info = CheckedDowncastToActualType<
-              ParameterizedTestCaseInfo<TestCase> >(*it);
-        }
-        break;
-      }
-    }
-    if (typed_test_info == NULL) {
-      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
-      test_case_infos_.push_back(typed_test_info);
-    }
-    return typed_test_info;
-  }
-  void RegisterTests() {
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
-         it != test_case_infos_.end(); ++it) {
-      (*it)->RegisterTests();
-    }
-  }
-
- private:
-  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
-
-  TestCaseInfoContainer test_case_infos_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
-};
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  //  GTEST_HAS_PARAM_TEST
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-port.h b/unit_tests/gtest/include/gtest/internal/gtest-port.h
deleted file mode 100644
index 02aa14b..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-port.h
+++ /dev/null
@@ -1,1785 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan)
-//
-// Low-level types and utilities for porting Google Test to various
-// platforms.  They are subject to change without notice.  DO NOT USE
-// THEM IN USER CODE.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-// The user can define the following macros in the build script to
-// control Google Test's behavior.  If the user doesn't define a macro
-// in this list, Google Test will define it.
-//
-//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
-//                              is/isn't available.
-//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
-//                              are enabled.
-//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
-//                              is/isn't available (some systems define
-//                              ::string, which is different to std::string).
-//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
-//                              is/isn't available (some systems define
-//                              ::wstring, which is different to std::wstring).
-//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
-//                              expressions are/aren't available.
-//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
-//                              is/isn't available.
-//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
-//                              enabled.
-//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
-//                              std::wstring does/doesn't work (Google Test can
-//                              be used where std::wstring is unavailable).
-//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
-//                              is/isn't available.
-//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
-//                              compiler supports Microsoft's "Structured
-//                              Exception Handling".
-//   GTEST_HAS_STREAM_REDIRECTION
-//                            - Define it to 1/0 to indicate whether the
-//                              platform supports I/O stream redirection using
-//                              dup() and dup2().
-//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
-//                              Test's own tr1 tuple implementation should be
-//                              used.  Unused when the user sets
-//                              GTEST_HAS_TR1_TUPLE to 0.
-//   GTEST_LINKED_AS_SHARED_LIBRARY
-//                            - Define to 1 when compiling tests that use
-//                              Google Test as a shared library (known as
-//                              DLL on Windows).
-//   GTEST_CREATE_SHARED_LIBRARY
-//                            - Define to 1 when compiling Google Test itself
-//                              as a shared library.
-
-// This header defines the following utilities:
-//
-// Macros indicating the current platform (defined to 1 if compiled on
-// the given platform; otherwise undefined):
-//   GTEST_OS_AIX      - IBM AIX
-//   GTEST_OS_CYGWIN   - Cygwin
-//   GTEST_OS_HPUX     - HP-UX
-//   GTEST_OS_LINUX    - Linux
-//     GTEST_OS_LINUX_ANDROID - Google Android
-//   GTEST_OS_MAC      - Mac OS X
-//   GTEST_OS_NACL     - Google Native Client (NaCl)
-//   GTEST_OS_SOLARIS  - Sun Solaris
-//   GTEST_OS_SYMBIAN  - Symbian
-//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
-//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
-//     GTEST_OS_WINDOWS_MINGW    - MinGW
-//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
-//   GTEST_OS_ZOS      - z/OS
-//
-// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
-// most stable support.  Since core members of the Google Test project
-// don't have access to other platforms, support for them may be less
-// stable.  If you notice any problems on your platform, please notify
-// googletestframework at googlegroups.com (patches for fixing them are
-// even more welcome!).
-//
-// Note that it is possible that none of the GTEST_OS_* macros are defined.
-//
-// Macros indicating available Google Test features (defined to 1 if
-// the corresponding feature is supported; otherwise undefined):
-//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
-//                            tests)
-//   GTEST_HAS_DEATH_TEST   - death tests
-//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
-//   GTEST_HAS_TYPED_TEST   - typed tests
-//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
-//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
-//                            GTEST_HAS_POSIX_RE (see above) which users can
-//                            define themselves.
-//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
-//                            the above two are mutually exclusive.
-//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
-//
-// Macros for basic C++ coding:
-//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
-//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
-//                              variable don't have to be used.
-//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
-//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
-//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
-//
-// Synchronization:
-//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
-//                  - synchronization primitives.
-//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
-//                         synchronization primitives have real implementations
-//                         and Google Test is thread-safe; or 0 otherwise.
-//
-// Template meta programming:
-//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
-//   IteratorTraits - partial implementation of std::iterator_traits, which
-//                    is not available in libCstd when compiled with Sun C++.
-//
-// Smart pointers:
-//   scoped_ptr     - as in TR2.
-//
-// Regular expressions:
-//   RE             - a simple regular expression class using the POSIX
-//                    Extended Regular Expression syntax on UNIX-like
-//                    platforms, or a reduced regular exception syntax on
-//                    other platforms, including Windows.
-//
-// Logging:
-//   GTEST_LOG_()   - logs messages at the specified severity level.
-//   LogToStderr()  - directs all log messages to stderr.
-//   FlushInfoLog() - flushes informational log messages.
-//
-// Stdout and stderr capturing:
-//   CaptureStdout()     - starts capturing stdout.
-//   GetCapturedStdout() - stops capturing stdout and returns the captured
-//                         string.
-//   CaptureStderr()     - starts capturing stderr.
-//   GetCapturedStderr() - stops capturing stderr and returns the captured
-//                         string.
-//
-// Integer types:
-//   TypeWithSize   - maps an integer to a int type.
-//   Int32, UInt32, Int64, UInt64, TimeInMillis
-//                  - integers of known sizes.
-//   BiggestInt     - the biggest signed integer type.
-//
-// Command-line utilities:
-//   GTEST_FLAG()       - references a flag.
-//   GTEST_DECLARE_*()  - declares a flag.
-//   GTEST_DEFINE_*()   - defines a flag.
-//   GetArgvs()         - returns the command line as a vector of strings.
-//
-// Environment variable utilities:
-//   GetEnv()             - gets the value of an environment variable.
-//   BoolFromGTestEnv()   - parses a bool environment variable.
-//   Int32FromGTestEnv()  - parses an Int32 environment variable.
-//   StringFromGTestEnv() - parses a string environment variable.
-
-#include <ctype.h>   // for isspace, etc
-#include <stddef.h>  // for ptrdiff_t
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifndef _WIN32_WCE
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif  // !_WIN32_WCE
-
-#include <iostream>  // NOLINT
-#include <sstream>  // NOLINT
-#include <string>  // NOLINT
-
-#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
-#define GTEST_FLAG_PREFIX_ "gtest_"
-#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
-#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
-#define GTEST_NAME_ "Google Test"
-#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
-
-// Determines the version of gcc that is used to compile this.
-#ifdef __GNUC__
-// 40302 means version 4.3.2.
-# define GTEST_GCC_VER_ \
-    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
-#endif  // __GNUC__
-
-// Determines the platform on which Google Test is compiled.
-#ifdef __CYGWIN__
-# define GTEST_OS_CYGWIN 1
-#elif defined __SYMBIAN32__
-# define GTEST_OS_SYMBIAN 1
-#elif defined _WIN32
-# define GTEST_OS_WINDOWS 1
-# ifdef _WIN32_WCE
-#  define GTEST_OS_WINDOWS_MOBILE 1
-# elif defined(__MINGW__) || defined(__MINGW32__)
-#  define GTEST_OS_WINDOWS_MINGW 1
-# else
-#  define GTEST_OS_WINDOWS_DESKTOP 1
-# endif  // _WIN32_WCE
-#elif defined __APPLE__
-# define GTEST_OS_MAC 1
-#elif defined __linux__
-# define GTEST_OS_LINUX 1
-# ifdef ANDROID
-#  define GTEST_OS_LINUX_ANDROID 1
-# endif  // ANDROID
-#elif defined __MVS__
-# define GTEST_OS_ZOS 1
-#elif defined(__sun) && defined(__SVR4)
-# define GTEST_OS_SOLARIS 1
-#elif defined(_AIX)
-# define GTEST_OS_AIX 1
-#elif defined(__hpux)
-# define GTEST_OS_HPUX 1
-#elif defined __native_client__
-# define GTEST_OS_NACL 1
-#endif  // __CYGWIN__
-
-// Brings in definitions for functions used in the testing::internal::posix
-// namespace (read, write, close, chdir, isatty, stat). We do not currently
-// use them on Windows Mobile.
-#if !GTEST_OS_WINDOWS
-// This assumes that non-Windows OSes provide unistd.h. For OSes where this
-// is not the case, we need to include headers that provide the functions
-// mentioned above.
-# include <unistd.h>
-# if !GTEST_OS_NACL
-// TODO(vladl at google.com): Remove this condition when Native Client SDK adds
-// strings.h (tracked in
-// http://code.google.com/p/nativeclient/issues/detail?id=1175).
-#  include <strings.h>  // Native Client doesn't provide strings.h.
-# endif
-#elif !GTEST_OS_WINDOWS_MOBILE
-# include <direct.h>
-# include <io.h>
-#endif
-
-// Defines this to true iff Google Test can use POSIX regular expressions.
-#ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
-#endif
-
-#if GTEST_HAS_POSIX_RE
-
-// On some platforms, <regex.h> needs someone to define size_t, and
-// won't compile otherwise.  We can #include it here as we already
-// included <stdlib.h>, which is guaranteed to define size_t through
-// <stddef.h>.
-# include <regex.h>  // NOLINT
-
-# define GTEST_USES_POSIX_RE 1
-
-#elif GTEST_OS_WINDOWS
-
-// <regex.h> is not available on Windows.  Use our own simple regex
-// implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#else
-
-// <regex.h> may not be available on this platform.  Use our own
-// simple regex implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#endif  // GTEST_HAS_POSIX_RE
-
-#ifndef GTEST_HAS_EXCEPTIONS
-// The user didn't tell us whether exceptions are enabled, so we need
-// to figure it out.
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
-// macro to enable exceptions, so we'll do the same.
-// Assumes that exceptions are enabled by default.
-#  ifndef _HAS_EXCEPTIONS
-#   define _HAS_EXCEPTIONS 1
-#  endif  // _HAS_EXCEPTIONS
-#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
-# elif defined(__GNUC__) && __EXCEPTIONS
-// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
-#  define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__SUNPRO_CC)
-// Sun Pro CC supports exceptions.  However, there is no compile-time way of
-// detecting whether they are enabled or not.  Therefore, we assume that
-// they are enabled unless the user tells us otherwise.
-#  define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__IBMCPP__) && __EXCEPTIONS
-// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
-#  define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__HP_aCC)
-// Exception handling is in effect by default in HP aCC compiler. It has to
-// be turned of by +noeh compiler option if desired.
-#  define GTEST_HAS_EXCEPTIONS 1
-# else
-// For other compilers, we assume exceptions are disabled to be
-// conservative.
-#  define GTEST_HAS_EXCEPTIONS 0
-# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
-#endif  // GTEST_HAS_EXCEPTIONS
-
-#if !defined(GTEST_HAS_STD_STRING)
-// Even though we don't use this macro any longer, we keep it in case
-// some clients still depend on it.
-# define GTEST_HAS_STD_STRING 1
-#elif !GTEST_HAS_STD_STRING
-// The user told us that ::std::string isn't available.
-# error "Google Test cannot be used where ::std::string isn't available."
-#endif  // !defined(GTEST_HAS_STD_STRING)
-
-#ifndef GTEST_HAS_GLOBAL_STRING
-// The user didn't tell us whether ::string is available, so we need
-// to figure it out.
-
-# define GTEST_HAS_GLOBAL_STRING 0
-
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-#ifndef GTEST_HAS_STD_WSTRING
-// The user didn't tell us whether ::std::wstring is available, so we need
-// to figure it out.
-// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
-//   is available.
-
-// Cygwin 1.7 and below doesn't support ::std::wstring.
-// Solaris' libc++ doesn't support it either.  Android has
-// no support for it at least as recent as Froyo (2.2).
-# define GTEST_HAS_STD_WSTRING \
-    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
-
-#endif  // GTEST_HAS_STD_WSTRING
-
-#ifndef GTEST_HAS_GLOBAL_WSTRING
-// The user didn't tell us whether ::wstring is available, so we need
-// to figure it out.
-# define GTEST_HAS_GLOBAL_WSTRING \
-    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-// Determines whether RTTI is available.
-#ifndef GTEST_HAS_RTTI
-// The user didn't tell us whether RTTI is enabled, so we need to
-// figure it out.
-
-# ifdef _MSC_VER
-
-#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
-#   define GTEST_HAS_RTTI 1
-#  else
-#   define GTEST_HAS_RTTI 0
-#  endif
-
-// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
-
-#  ifdef __GXX_RTTI
-#   define GTEST_HAS_RTTI 1
-#  else
-#   define GTEST_HAS_RTTI 0
-#  endif  // __GXX_RTTI
-
-// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
-// both the typeid and dynamic_cast features are present.
-# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
-
-#  ifdef __RTTI_ALL__
-#   define GTEST_HAS_RTTI 1
-#  else
-#   define GTEST_HAS_RTTI 0
-#  endif
-
-# else
-
-// For all other compilers, we assume RTTI is enabled.
-#  define GTEST_HAS_RTTI 1
-
-# endif  // _MSC_VER
-
-#endif  // GTEST_HAS_RTTI
-
-// It's this header's responsibility to #include <typeinfo> when RTTI
-// is enabled.
-#if GTEST_HAS_RTTI
-# include <typeinfo>
-#endif
-
-// Determines whether Google Test can use the pthreads library.
-#ifndef GTEST_HAS_PTHREAD
-// The user didn't tell us explicitly, so we assume pthreads support is
-// available on Linux and Mac.
-//
-// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
-// to your compiler flags.
-# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
-#endif  // GTEST_HAS_PTHREAD
-
-#if GTEST_HAS_PTHREAD
-// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
-// true.
-# include <pthread.h>  // NOLINT
-
-// For timespec and nanosleep, used below.
-# include <time.h>  // NOLINT
-#endif
-
-// Determines whether Google Test can use tr1/tuple.  You can define
-// this macro to 0 to prevent Google Test from using tuple (any
-// feature depending on tuple with be disabled in this mode).
-#ifndef GTEST_HAS_TR1_TUPLE
-// The user didn't tell us not to do it, so we assume it's OK.
-# define GTEST_HAS_TR1_TUPLE 1
-#endif  // GTEST_HAS_TR1_TUPLE
-
-// Determines whether Google Test's own tr1 tuple implementation
-// should be used.
-#ifndef GTEST_USE_OWN_TR1_TUPLE
-// The user didn't tell us, so we need to figure it out.
-
-// We use our own TR1 tuple if we aren't sure the user has an
-// implementation of it already.  At this time, GCC 4.0.0+ and MSVC
-// 2010 are the only mainstream compilers that come with a TR1 tuple
-// implementation.  NVIDIA's CUDA NVCC compiler pretends to be GCC by
-// defining __GNUC__ and friends, but cannot compile GCC's tuple
-// implementation.  MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
-// Feature Pack download, which we cannot assume the user has.
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
-    || _MSC_VER >= 1600
-#  define GTEST_USE_OWN_TR1_TUPLE 0
-# else
-#  define GTEST_USE_OWN_TR1_TUPLE 1
-# endif
-
-#endif  // GTEST_USE_OWN_TR1_TUPLE
-
-// To avoid conditional compilation everywhere, we make it
-// gtest-port.h's responsibility to #include the header implementing
-// tr1/tuple.
-#if GTEST_HAS_TR1_TUPLE
-
-# if GTEST_USE_OWN_TR1_TUPLE
-#  include "gtest/internal/gtest-tuple.h"
-# elif GTEST_OS_SYMBIAN
-
-// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
-// use STLport's tuple implementation, which unfortunately doesn't
-// work as the copy of STLport distributed with Symbian is incomplete.
-// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
-// use its own tuple implementation.
-#  ifdef BOOST_HAS_TR1_TUPLE
-#   undef BOOST_HAS_TR1_TUPLE
-#  endif  // BOOST_HAS_TR1_TUPLE
-
-// This prevents <boost/tr1/detail/config.hpp>, which defines
-// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
-#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
-#  include <tuple>
-
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
-// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
-// not conform to the TR1 spec, which requires the header to be <tuple>.
-
-#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
-// which is #included by <tr1/tuple>, to not compile when RTTI is
-// disabled.  _TR1_FUNCTIONAL is the header guard for
-// <tr1/functional>.  Hence the following #define is a hack to prevent
-// <tr1/functional> from being included.
-#   define _TR1_FUNCTIONAL 1
-#   include <tr1/tuple>
-#   undef _TR1_FUNCTIONAL  // Allows the user to #include
-                        // <tr1/functional> if he chooses to.
-#  else
-#   include <tr1/tuple>  // NOLINT
-#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-
-# else
-// If the compiler is not GCC 4.0+, we assume the user is using a
-// spec-conforming TR1 implementation.
-#  include <tuple>  // NOLINT
-# endif  // GTEST_USE_OWN_TR1_TUPLE
-
-#endif  // GTEST_HAS_TR1_TUPLE
-
-// Determines whether clone(2) is supported.
-// Usually it will only be available on Linux, excluding
-// Linux on the Itanium architecture.
-// Also see http://linux.die.net/man/2/clone.
-#ifndef GTEST_HAS_CLONE
-// The user didn't tell us, so we need to figure it out.
-
-# if GTEST_OS_LINUX && !defined(__ia64__)
-#  define GTEST_HAS_CLONE 1
-# else
-#  define GTEST_HAS_CLONE 0
-# endif  // GTEST_OS_LINUX && !defined(__ia64__)
-
-#endif  // GTEST_HAS_CLONE
-
-// Determines whether to support stream redirection. This is used to test
-// output correctness and to implement death tests.
-#ifndef GTEST_HAS_STREAM_REDIRECTION
-// By default, we assume that stream redirection is supported on all
-// platforms except known mobile ones.
-# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
-#  define GTEST_HAS_STREAM_REDIRECTION 0
-# else
-#  define GTEST_HAS_STREAM_REDIRECTION 1
-# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
-#endif  // GTEST_HAS_STREAM_REDIRECTION
-
-// Determines whether to support death tests.
-// Google Test does not support death tests for VC 7.1 and earlier as
-// abort() in a VC 7.1 application compiled as GUI in debug config
-// pops up a dialog window that cannot be suppressed programmatically.
-#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
-     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
-     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
-# define GTEST_HAS_DEATH_TEST 1
-# include <vector>  // NOLINT
-#endif
-
-// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
-// all the compilers we care about are adequate for supporting
-// value-parameterized tests.
-#define GTEST_HAS_PARAM_TEST 1
-
-// Determines whether to support type-driven tests.
-
-// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
-// Sun Pro CC, IBM Visual Age, and HP aCC support.
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
-    defined(__IBMCPP__) || defined(__HP_aCC)
-# define GTEST_HAS_TYPED_TEST 1
-# define GTEST_HAS_TYPED_TEST_P 1
-#endif
-
-// Determines whether to support Combine(). This only makes sense when
-// value-parameterized tests are enabled.  The implementation doesn't
-// work on Sun Studio since it doesn't understand templated conversion
-// operators.
-#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
-# define GTEST_HAS_COMBINE 1
-#endif
-
-// Determines whether the system compiler uses UTF-16 for encoding wide strings.
-#define GTEST_WIDE_STRING_USES_UTF16_ \
-    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
-
-// Determines whether test results can be streamed to a socket.
-#if GTEST_OS_LINUX
-# define GTEST_CAN_STREAM_RESULTS_ 1
-#endif
-
-// Defines some utility macros.
-
-// The GNU compiler emits a warning if nested "if" statements are followed by
-// an "else" statement and braces are not used to explicitly disambiguate the
-// "else" binding.  This leads to problems with code like:
-//
-//   if (gate)
-//     ASSERT_*(condition) << "Some message";
-//
-// The "switch (0) case 0:" idiom is used to suppress this.
-#ifdef __INTEL_COMPILER
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
-#else
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
-#endif
-
-// Use this annotation at the end of a struct/class definition to
-// prevent the compiler from optimizing away instances that are never
-// used.  This is useful when all interesting logic happens inside the
-// c'tor and / or d'tor.  Example:
-//
-//   struct Foo {
-//     Foo() { ... }
-//   } GTEST_ATTRIBUTE_UNUSED_;
-//
-// Also use it after a variable or parameter declaration to tell the
-// compiler the variable/parameter does not have to be used.
-#if defined(__GNUC__) && !defined(COMPILER_ICC)
-# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
-#else
-# define GTEST_ATTRIBUTE_UNUSED_
-#endif
-
-// A macro to disallow operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_ASSIGN_(type)\
-  void operator=(type const &)
-
-// A macro to disallow copy constructor and operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
-  type(type const &);\
-  GTEST_DISALLOW_ASSIGN_(type)
-
-// Tell the compiler to warn about unused return values for functions declared
-// with this macro.  The macro should be used on function declarations
-// following the argument list:
-//
-//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
-#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
-# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
-#else
-# define GTEST_MUST_USE_RESULT_
-#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
-
-// Determine whether the compiler supports Microsoft's Structured Exception
-// Handling.  This is supported by several Windows compilers but generally
-// does not exist on any other system.
-#ifndef GTEST_HAS_SEH
-// The user didn't tell us, so we need to figure it out.
-
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// These two compilers are known to support SEH.
-#  define GTEST_HAS_SEH 1
-# else
-// Assume no SEH.
-#  define GTEST_HAS_SEH 0
-# endif
-
-#endif  // GTEST_HAS_SEH
-
-#ifdef _MSC_VER
-
-# if GTEST_LINKED_AS_SHARED_LIBRARY
-#  define GTEST_API_ __declspec(dllimport)
-# elif GTEST_CREATE_SHARED_LIBRARY
-#  define GTEST_API_ __declspec(dllexport)
-# endif
-
-#endif  // _MSC_VER
-
-#ifndef GTEST_API_
-# define GTEST_API_
-#endif
-
-#ifdef __GNUC__
-// Ask the compiler to never inline a given function.
-# define GTEST_NO_INLINE_ __attribute__((noinline))
-#else
-# define GTEST_NO_INLINE_
-#endif
-
-namespace testing {
-
-class Message;
-
-namespace internal {
-
-class String;
-
-// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
-// expression is true. For example, you could use it to verify the
-// size of a static array:
-//
-//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
-//                         content_type_names_incorrect_size);
-//
-// or to make sure a struct is smaller than a certain size:
-//
-//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
-//
-// The second argument to the macro is the name of the variable. If
-// the expression is false, most compilers will issue a warning/error
-// containing the name of the variable.
-
-template <bool>
-struct CompileAssert {
-};
-
-#define GTEST_COMPILE_ASSERT_(expr, msg) \
-  typedef ::testing::internal::CompileAssert<(bool(expr))> \
-      msg[bool(expr) ? 1 : -1]
-
-// Implementation details of GTEST_COMPILE_ASSERT_:
-//
-// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
-//   elements (and thus is invalid) when the expression is false.
-//
-// - The simpler definition
-//
-//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
-//
-//   does not work, as gcc supports variable-length arrays whose sizes
-//   are determined at run-time (this is gcc's extension and not part
-//   of the C++ standard).  As a result, gcc fails to reject the
-//   following code with the simple definition:
-//
-//     int foo;
-//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
-//                                      // not a compile-time constant.
-//
-// - By using the type CompileAssert<(bool(expr))>, we ensures that
-//   expr is a compile-time constant.  (Template arguments must be
-//   determined at compile-time.)
-//
-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
-//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
-//
-//     CompileAssert<bool(expr)>
-//
-//   instead, these compilers will refuse to compile
-//
-//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
-//
-//   (They seem to think the ">" in "5 > 0" marks the end of the
-//   template argument list.)
-//
-// - The array size is (bool(expr) ? 1 : -1), instead of simply
-//
-//     ((expr) ? 1 : -1).
-//
-//   This is to avoid running into a bug in MS VC 7.1, which
-//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
-
-// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
-//
-// This template is declared, but intentionally undefined.
-template <typename T1, typename T2>
-struct StaticAssertTypeEqHelper;
-
-template <typename T>
-struct StaticAssertTypeEqHelper<T, T> {};
-
-#if GTEST_HAS_GLOBAL_STRING
-typedef ::string string;
-#else
-typedef ::std::string string;
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-typedef ::wstring wstring;
-#elif GTEST_HAS_STD_WSTRING
-typedef ::std::wstring wstring;
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-// A helper for suppressing warnings on constant condition.  It just
-// returns 'condition'.
-GTEST_API_ bool IsTrue(bool condition);
-
-// Defines scoped_ptr.
-
-// This implementation of scoped_ptr is PARTIAL - it only contains
-// enough stuff to satisfy Google Test's need.
-template <typename T>
-class scoped_ptr {
- public:
-  typedef T element_type;
-
-  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
-  ~scoped_ptr() { reset(); }
-
-  T& operator*() const { return *ptr_; }
-  T* operator->() const { return ptr_; }
-  T* get() const { return ptr_; }
-
-  T* release() {
-    T* const ptr = ptr_;
-    ptr_ = NULL;
-    return ptr;
-  }
-
-  void reset(T* p = NULL) {
-    if (p != ptr_) {
-      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
-        delete ptr_;
-      }
-      ptr_ = p;
-    }
-  }
- private:
-  T* ptr_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
-};
-
-// Defines RE.
-
-// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
-// Regular Expression syntax.
-class GTEST_API_ RE {
- public:
-  // A copy constructor is required by the Standard to initialize object
-  // references from r-values.
-  RE(const RE& other) { Init(other.pattern()); }
-
-  // Constructs an RE from a string.
-  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
-
-#if GTEST_HAS_GLOBAL_STRING
-
-  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
-
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-  RE(const char* regex) { Init(regex); }  // NOLINT
-  ~RE();
-
-  // Returns the string representation of the regex.
-  const char* pattern() const { return pattern_; }
-
-  // FullMatch(str, re) returns true iff regular expression re matches
-  // the entire str.
-  // PartialMatch(str, re) returns true iff regular expression re
-  // matches a substring of str (including str itself).
-  //
-  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
-  // when str contains NUL characters.
-  static bool FullMatch(const ::std::string& str, const RE& re) {
-    return FullMatch(str.c_str(), re);
-  }
-  static bool PartialMatch(const ::std::string& str, const RE& re) {
-    return PartialMatch(str.c_str(), re);
-  }
-
-#if GTEST_HAS_GLOBAL_STRING
-
-  static bool FullMatch(const ::string& str, const RE& re) {
-    return FullMatch(str.c_str(), re);
-  }
-  static bool PartialMatch(const ::string& str, const RE& re) {
-    return PartialMatch(str.c_str(), re);
-  }
-
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-  static bool FullMatch(const char* str, const RE& re);
-  static bool PartialMatch(const char* str, const RE& re);
-
- private:
-  void Init(const char* regex);
-
-  // We use a const char* instead of a string, as Google Test may be used
-  // where string is not available.  We also do not use Google Test's own
-  // String type here, in order to simplify dependencies between the
-  // files.
-  const char* pattern_;
-  bool is_valid_;
-
-#if GTEST_USES_POSIX_RE
-
-  regex_t full_regex_;     // For FullMatch().
-  regex_t partial_regex_;  // For PartialMatch().
-
-#else  // GTEST_USES_SIMPLE_RE
-
-  const char* full_pattern_;  // For FullMatch();
-
-#endif
-
-  GTEST_DISALLOW_ASSIGN_(RE);
-};
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
-                                                               int line);
-
-// Defines logging utilities:
-//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
-//                          message itself is streamed into the macro.
-//   LogToStderr()  - directs all log messages to stderr.
-//   FlushInfoLog() - flushes informational log messages.
-
-enum GTestLogSeverity {
-  GTEST_INFO,
-  GTEST_WARNING,
-  GTEST_ERROR,
-  GTEST_FATAL
-};
-
-// Formats log entry severity, provides a stream object for streaming the
-// log message, and terminates the message with a newline when going out of
-// scope.
-class GTEST_API_ GTestLog {
- public:
-  GTestLog(GTestLogSeverity severity, const char* file, int line);
-
-  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
-  ~GTestLog();
-
-  ::std::ostream& GetStream() { return ::std::cerr; }
-
- private:
-  const GTestLogSeverity severity_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
-};
-
-#define GTEST_LOG_(severity) \
-    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
-                                  __FILE__, __LINE__).GetStream()
-
-inline void LogToStderr() {}
-inline void FlushInfoLog() { fflush(NULL); }
-
-// INTERNAL IMPLEMENTATION - DO NOT USE.
-//
-// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
-// is not satisfied.
-//  Synopsys:
-//    GTEST_CHECK_(boolean_condition);
-//     or
-//    GTEST_CHECK_(boolean_condition) << "Additional message";
-//
-//    This checks the condition and if the condition is not satisfied
-//    it prints message about the condition violation, including the
-//    condition itself, plus additional message streamed into it, if any,
-//    and then it aborts the program. It aborts the program irrespective of
-//    whether it is built in the debug mode or not.
-#define GTEST_CHECK_(condition) \
-    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
-    if (::testing::internal::IsTrue(condition)) \
-      ; \
-    else \
-      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
-
-// An all-mode assert to verify that the given POSIX-style function
-// call returns 0 (indicating success).  Known limitation: this
-// doesn't expand to a balanced 'if' statement, so enclose the macro
-// in {} if you need to use it as the only statement in an 'if'
-// branch.
-#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
-  if (const int gtest_error = (posix_call)) \
-    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
-                      << gtest_error
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Use ImplicitCast_ as a safe version of static_cast for upcasting in
-// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
-// const Foo*).  When you use ImplicitCast_, the compiler checks that
-// the cast is safe.  Such explicit ImplicitCast_s are necessary in
-// surprisingly many situations where C++ demands an exact type match
-// instead of an argument type convertable to a target type.
-//
-// The syntax for using ImplicitCast_ is the same as for static_cast:
-//
-//   ImplicitCast_<ToType>(expr)
-//
-// ImplicitCast_ would have been part of the C++ standard library,
-// but the proposal was submitted too late.  It will probably make
-// its way into the language in the future.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., implicit_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To>
-inline To ImplicitCast_(To x) { return x; }
-
-// When you upcast (that is, cast a pointer from type Foo to type
-// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
-// always succeed.  When you downcast (that is, cast a pointer from
-// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
-// how do you know the pointer is really of type SubclassOfFoo?  It
-// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
-// when you downcast, you should use this macro.  In debug mode, we
-// use dynamic_cast<> to double-check the downcast is legal (we die
-// if it's not).  In normal mode, we do the efficient static_cast<>
-// instead.  Thus, it's important to test in debug mode to make sure
-// the cast is legal!
-//    This is the only place in the code we should use dynamic_cast<>.
-// In particular, you SHOULDN'T be using dynamic_cast<> in order to
-// do RTTI (eg code like this:
-//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
-//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
-// You should design the code some other way not to need this.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., down_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
-inline To DownCast_(From* f) {  // so we only accept pointers
-  // Ensures that To is a sub-type of From *.  This test is here only
-  // for compile-time type checking, and has no overhead in an
-  // optimized build at run-time, as it will be optimized away
-  // completely.
-  if (false) {
-    const To to = NULL;
-    ::testing::internal::ImplicitCast_<From*>(to);
-  }
-
-#if GTEST_HAS_RTTI
-  // RTTI: debug mode only!
-  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
-#endif
-  return static_cast<To>(f);
-}
-
-// Downcasts the pointer of type Base to Derived.
-// Derived must be a subclass of Base. The parameter MUST
-// point to a class of type Derived, not any subclass of it.
-// When RTTI is available, the function performs a runtime
-// check to enforce this.
-template <class Derived, class Base>
-Derived* CheckedDowncastToActualType(Base* base) {
-#if GTEST_HAS_RTTI
-  GTEST_CHECK_(typeid(*base) == typeid(Derived));
-  return dynamic_cast<Derived*>(base);  // NOLINT
-#else
-  return static_cast<Derived*>(base);  // Poor man's downcast.
-#endif
-}
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Defines the stderr capturer:
-//   CaptureStdout     - starts capturing stdout.
-//   GetCapturedStdout - stops capturing stdout and returns the captured string.
-//   CaptureStderr     - starts capturing stderr.
-//   GetCapturedStderr - stops capturing stderr and returns the captured string.
-//
-GTEST_API_ void CaptureStdout();
-GTEST_API_ String GetCapturedStdout();
-GTEST_API_ void CaptureStderr();
-GTEST_API_ String GetCapturedStderr();
-
-#endif  // GTEST_HAS_STREAM_REDIRECTION
-
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments.  Set by InitGoogleTest().
-extern ::std::vector<String> g_argvs;
-
-// GTEST_HAS_DEATH_TEST implies we have ::std::string.
-const ::std::vector<String>& GetArgvs();
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-// Defines synchronization primitives.
-
-#if GTEST_HAS_PTHREAD
-
-// Sleeps for (roughly) n milli-seconds.  This function is only for
-// testing Google Test's own constructs.  Don't use it in user tests,
-// either directly or indirectly.
-inline void SleepMilliseconds(int n) {
-  const timespec time = {
-    0,                  // 0 seconds.
-    n * 1000L * 1000L,  // And n ms.
-  };
-  nanosleep(&time, NULL);
-}
-
-// Allows a controller thread to pause execution of newly created
-// threads until notified.  Instances of this class must be created
-// and destroyed in the controller thread.
-//
-// This class is only for testing Google Test's own constructs. Do not
-// use it in user tests, either directly or indirectly.
-class Notification {
- public:
-  Notification() : notified_(false) {}
-
-  // Notifies all threads created with this notification to start. Must
-  // be called from the controller thread.
-  void Notify() { notified_ = true; }
-
-  // Blocks until the controller thread notifies. Must be called from a test
-  // thread.
-  void WaitForNotification() {
-    while(!notified_) {
-      SleepMilliseconds(10);
-    }
-  }
-
- private:
-  volatile bool notified_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
-};
-
-// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
-// Consequently, it cannot select a correct instantiation of ThreadWithParam
-// in order to call its Run(). Introducing ThreadWithParamBase as a
-// non-templated base class for ThreadWithParam allows us to bypass this
-// problem.
-class ThreadWithParamBase {
- public:
-  virtual ~ThreadWithParamBase() {}
-  virtual void Run() = 0;
-};
-
-// pthread_create() accepts a pointer to a function type with the C linkage.
-// According to the Standard (7.5/1), function types with different linkages
-// are different even if they are otherwise identical.  Some compilers (for
-// example, SunStudio) treat them as different types.  Since class methods
-// cannot be defined with C-linkage we need to define a free C-function to
-// pass into pthread_create().
-extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
-  static_cast<ThreadWithParamBase*>(thread)->Run();
-  return NULL;
-}
-
-// Helper class for testing Google Test's multi-threading constructs.
-// To use it, write:
-//
-//   void ThreadFunc(int param) { /* Do things with param */ }
-//   Notification thread_can_start;
-//   ...
-//   // The thread_can_start parameter is optional; you can supply NULL.
-//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
-//   thread_can_start.Notify();
-//
-// These classes are only for testing Google Test's own constructs. Do
-// not use them in user tests, either directly or indirectly.
-template <typename T>
-class ThreadWithParam : public ThreadWithParamBase {
- public:
-  typedef void (*UserThreadFunc)(T);
-
-  ThreadWithParam(
-      UserThreadFunc func, T param, Notification* thread_can_start)
-      : func_(func),
-        param_(param),
-        thread_can_start_(thread_can_start),
-        finished_(false) {
-    ThreadWithParamBase* const base = this;
-    // The thread can be created only after all fields except thread_
-    // have been initialized.
-    GTEST_CHECK_POSIX_SUCCESS_(
-        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
-  }
-  ~ThreadWithParam() { Join(); }
-
-  void Join() {
-    if (!finished_) {
-      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
-      finished_ = true;
-    }
-  }
-
-  virtual void Run() {
-    if (thread_can_start_ != NULL)
-      thread_can_start_->WaitForNotification();
-    func_(param_);
-  }
-
- private:
-  const UserThreadFunc func_;  // User-supplied thread function.
-  const T param_;  // User-supplied parameter to the thread function.
-  // When non-NULL, used to block execution until the controller thread
-  // notifies.
-  Notification* const thread_can_start_;
-  bool finished_;  // true iff we know that the thread function has finished.
-  pthread_t thread_;  // The native thread object.
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
-};
-
-// MutexBase and Mutex implement mutex on pthreads-based platforms. They
-// are used in conjunction with class MutexLock:
-//
-//   Mutex mutex;
-//   ...
-//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
-//                            // of the current scope.
-//
-// MutexBase implements behavior for both statically and dynamically
-// allocated mutexes.  Do not use MutexBase directly.  Instead, write
-// the following to define a static mutex:
-//
-//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
-//
-// You can forward declare a static mutex like this:
-//
-//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
-//
-// To create a dynamic mutex, just define an object of type Mutex.
-class MutexBase {
- public:
-  // Acquires this mutex.
-  void Lock() {
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
-    owner_ = pthread_self();
-  }
-
-  // Releases this mutex.
-  void Unlock() {
-    // We don't protect writing to owner_ here, as it's the caller's
-    // responsibility to ensure that the current thread holds the
-    // mutex when this is called.
-    owner_ = 0;
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
-  }
-
-  // Does nothing if the current thread holds the mutex. Otherwise, crashes
-  // with high probability.
-  void AssertHeld() const {
-    GTEST_CHECK_(owner_ == pthread_self())
-        << "The current thread is not holding the mutex @" << this;
-  }
-
-  // A static mutex may be used before main() is entered.  It may even
-  // be used before the dynamic initialization stage.  Therefore we
-  // must be able to initialize a static mutex object at link time.
-  // This means MutexBase has to be a POD and its member variables
-  // have to be public.
- public:
-  pthread_mutex_t mutex_;  // The underlying pthread mutex.
-  pthread_t owner_;  // The thread holding the mutex; 0 means no one holds it.
-};
-
-// Forward-declares a static mutex.
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
-    extern ::testing::internal::MutexBase mutex
-
-// Defines and statically (i.e. at link time) initializes a static mutex.
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
-    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }
-
-// The Mutex class can only be used for mutexes created at runtime. It
-// shares its API with MutexBase otherwise.
-class Mutex : public MutexBase {
- public:
-  Mutex() {
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
-    owner_ = 0;
-  }
-  ~Mutex() {
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
-  }
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
-};
-
-// We cannot name this class MutexLock as the ctor declaration would
-// conflict with a macro named MutexLock, which is defined on some
-// platforms.  Hence the typedef trick below.
-class GTestMutexLock {
- public:
-  explicit GTestMutexLock(MutexBase* mutex)
-      : mutex_(mutex) { mutex_->Lock(); }
-
-  ~GTestMutexLock() { mutex_->Unlock(); }
-
- private:
-  MutexBase* const mutex_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
-};
-
-typedef GTestMutexLock MutexLock;
-
-// Helpers for ThreadLocal.
-
-// pthread_key_create() requires DeleteThreadLocalValue() to have
-// C-linkage.  Therefore it cannot be templatized to access
-// ThreadLocal<T>.  Hence the need for class
-// ThreadLocalValueHolderBase.
-class ThreadLocalValueHolderBase {
- public:
-  virtual ~ThreadLocalValueHolderBase() {}
-};
-
-// Called by pthread to delete thread-local data stored by
-// pthread_setspecific().
-extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
-  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
-}
-
-// Implements thread-local storage on pthreads-based systems.
-//
-//   // Thread 1
-//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
-//
-//   // Thread 2
-//   tl.set(150);  // Changes the value for thread 2 only.
-//   EXPECT_EQ(150, tl.get());
-//
-//   // Thread 1
-//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
-//   tl.set(200);
-//   EXPECT_EQ(200, tl.get());
-//
-// The template type argument T must have a public copy constructor.
-// In addition, the default ThreadLocal constructor requires T to have
-// a public default constructor.
-//
-// An object managed for a thread by a ThreadLocal instance is deleted
-// when the thread exits.  Or, if the ThreadLocal instance dies in
-// that thread, when the ThreadLocal dies.  It's the user's
-// responsibility to ensure that all other threads using a ThreadLocal
-// have exited when it dies, or the per-thread objects for those
-// threads will not be deleted.
-//
-// Google Test only uses global ThreadLocal objects.  That means they
-// will die after main() has returned.  Therefore, no per-thread
-// object managed by Google Test will be leaked as long as all threads
-// using Google Test have exited when main() returns.
-template <typename T>
-class ThreadLocal {
- public:
-  ThreadLocal() : key_(CreateKey()),
-                  default_() {}
-  explicit ThreadLocal(const T& value) : key_(CreateKey()),
-                                         default_(value) {}
-
-  ~ThreadLocal() {
-    // Destroys the managed object for the current thread, if any.
-    DeleteThreadLocalValue(pthread_getspecific(key_));
-
-    // Releases resources associated with the key.  This will *not*
-    // delete managed objects for other threads.
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
-  }
-
-  T* pointer() { return GetOrCreateValue(); }
-  const T* pointer() const { return GetOrCreateValue(); }
-  const T& get() const { return *pointer(); }
-  void set(const T& value) { *pointer() = value; }
-
- private:
-  // Holds a value of type T.
-  class ValueHolder : public ThreadLocalValueHolderBase {
-   public:
-    explicit ValueHolder(const T& value) : value_(value) {}
-
-    T* pointer() { return &value_; }
-
-   private:
-    T value_;
-    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
-  };
-
-  static pthread_key_t CreateKey() {
-    pthread_key_t key;
-    // When a thread exits, DeleteThreadLocalValue() will be called on
-    // the object managed for that thread.
-    GTEST_CHECK_POSIX_SUCCESS_(
-        pthread_key_create(&key, &DeleteThreadLocalValue));
-    return key;
-  }
-
-  T* GetOrCreateValue() const {
-    ThreadLocalValueHolderBase* const holder =
-        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
-    if (holder != NULL) {
-      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
-    }
-
-    ValueHolder* const new_holder = new ValueHolder(default_);
-    ThreadLocalValueHolderBase* const holder_base = new_holder;
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
-    return new_holder->pointer();
-  }
-
-  // A key pthreads uses for looking up per-thread values.
-  const pthread_key_t key_;
-  const T default_;  // The default value for each thread.
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
-};
-
-# define GTEST_IS_THREADSAFE 1
-
-#else  // GTEST_HAS_PTHREAD
-
-// A dummy implementation of synchronization primitives (mutex, lock,
-// and thread-local variable).  Necessary for compiling Google Test where
-// mutex is not supported - using Google Test in multiple threads is not
-// supported on such platforms.
-
-class Mutex {
- public:
-  Mutex() {}
-  void AssertHeld() const {}
-};
-
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
-  extern ::testing::internal::Mutex mutex
-
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
-
-class GTestMutexLock {
- public:
-  explicit GTestMutexLock(Mutex*) {}  // NOLINT
-};
-
-typedef GTestMutexLock MutexLock;
-
-template <typename T>
-class ThreadLocal {
- public:
-  ThreadLocal() : value_() {}
-  explicit ThreadLocal(const T& value) : value_(value) {}
-  T* pointer() { return &value_; }
-  const T* pointer() const { return &value_; }
-  const T& get() const { return value_; }
-  void set(const T& value) { value_ = value; }
- private:
-  T value_;
-};
-
-// The above synchronization primitives have dummy implementations.
-// Therefore Google Test is not thread-safe.
-# define GTEST_IS_THREADSAFE 0
-
-#endif  // GTEST_HAS_PTHREAD
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-GTEST_API_ size_t GetThreadCount();
-
-// Passing non-POD classes through ellipsis (...) crashes the ARM
-// compiler and generates a warning in Sun Studio.  The Nokia Symbian
-// and the IBM XL C/C++ compiler try to instantiate a copy constructor
-// for objects passed through ellipsis (...), failing for uncopyable
-// objects.  We define this to ensure that only POD is passed through
-// ellipsis on these systems.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_ELLIPSIS_NEEDS_POD_ 1
-#else
-# define GTEST_CAN_COMPARE_NULL 1
-#endif
-
-// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
-// const T& and const T* in a function template.  These compilers
-// _can_ decide between class template specializations for T and T*,
-// so a tr1::type_traits-like is_pointer works.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
-# define GTEST_NEEDS_IS_POINTER_ 1
-#endif
-
-template <bool bool_value>
-struct bool_constant {
-  typedef bool_constant<bool_value> type;
-  static const bool value = bool_value;
-};
-template <bool bool_value> const bool bool_constant<bool_value>::value;
-
-typedef bool_constant<false> false_type;
-typedef bool_constant<true> true_type;
-
-template <typename T>
-struct is_pointer : public false_type {};
-
-template <typename T>
-struct is_pointer<T*> : public true_type {};
-
-template <typename Iterator>
-struct IteratorTraits {
-  typedef typename Iterator::value_type value_type;
-};
-
-template <typename T>
-struct IteratorTraits<T*> {
-  typedef T value_type;
-};
-
-template <typename T>
-struct IteratorTraits<const T*> {
-  typedef T value_type;
-};
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_SEP_ "\\"
-# define GTEST_HAS_ALT_PATH_SEP_ 1
-// The biggest signed integer type the compiler supports.
-typedef __int64 BiggestInt;
-#else
-# define GTEST_PATH_SEP_ "/"
-# define GTEST_HAS_ALT_PATH_SEP_ 0
-typedef long long BiggestInt;  // NOLINT
-#endif  // GTEST_OS_WINDOWS
-
-// Utilities for char.
-
-// isspace(int ch) and friends accept an unsigned char or EOF.  char
-// may be signed, depending on the compiler (or compiler flags).
-// Therefore we need to cast a char to unsigned char before calling
-// isspace(), etc.
-
-inline bool IsAlpha(char ch) {
-  return isalpha(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsAlNum(char ch) {
-  return isalnum(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsDigit(char ch) {
-  return isdigit(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsLower(char ch) {
-  return islower(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsSpace(char ch) {
-  return isspace(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsUpper(char ch) {
-  return isupper(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsXDigit(char ch) {
-  return isxdigit(static_cast<unsigned char>(ch)) != 0;
-}
-
-inline char ToLower(char ch) {
-  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
-}
-inline char ToUpper(char ch) {
-  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
-}
-
-// The testing::internal::posix namespace holds wrappers for common
-// POSIX functions.  These wrappers hide the differences between
-// Windows/MSVC and POSIX systems.  Since some compilers define these
-// standard functions as macros, the wrapper cannot have the same name
-// as the wrapped function.
-
-namespace posix {
-
-// Functions with a different name on Windows.
-
-#if GTEST_OS_WINDOWS
-
-typedef struct _stat StatStruct;
-
-# ifdef __BORLANDC__
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
-  return stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-# else  // !__BORLANDC__
-#  if GTEST_OS_WINDOWS_MOBILE
-inline int IsATTY(int /* fd */) { return 0; }
-#  else
-inline int IsATTY(int fd) { return _isatty(fd); }
-#  endif  // GTEST_OS_WINDOWS_MOBILE
-inline int StrCaseCmp(const char* s1, const char* s2) {
-  return _stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return _strdup(src); }
-# endif  // __BORLANDC__
-
-# if GTEST_OS_WINDOWS_MOBILE
-inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
-// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
-// time and thus not defined there.
-# else
-inline int FileNo(FILE* file) { return _fileno(file); }
-inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
-inline int RmDir(const char* dir) { return _rmdir(dir); }
-inline bool IsDir(const StatStruct& st) {
-  return (_S_IFDIR & st.st_mode) != 0;
-}
-# endif  // GTEST_OS_WINDOWS_MOBILE
-
-#else
-
-typedef struct stat StatStruct;
-
-inline int FileNo(FILE* file) { return fileno(file); }
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
-  return strcasecmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-inline int RmDir(const char* dir) { return rmdir(dir); }
-inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
-
-#endif  // GTEST_OS_WINDOWS
-
-// Functions deprecated by MSVC 8.0.
-
-#ifdef _MSC_VER
-// Temporarily disable warning 4996 (deprecated function).
-# pragma warning(push)
-# pragma warning(disable:4996)
-#endif
-
-inline const char* StrNCpy(char* dest, const char* src, size_t n) {
-  return strncpy(dest, src, n);
-}
-
-// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
-// StrError() aren't needed on Windows CE at this time and thus not
-// defined there.
-
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int ChDir(const char* dir) { return chdir(dir); }
-#endif
-inline FILE* FOpen(const char* path, const char* mode) {
-  return fopen(path, mode);
-}
-#if !GTEST_OS_WINDOWS_MOBILE
-inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
-  return freopen(path, mode, stream);
-}
-inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
-#endif
-inline int FClose(FILE* fp) { return fclose(fp); }
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int Read(int fd, void* buf, unsigned int count) {
-  return static_cast<int>(read(fd, buf, count));
-}
-inline int Write(int fd, const void* buf, unsigned int count) {
-  return static_cast<int>(write(fd, buf, count));
-}
-inline int Close(int fd) { return close(fd); }
-inline const char* StrError(int errnum) { return strerror(errnum); }
-#endif
-inline const char* GetEnv(const char* name) {
-#if GTEST_OS_WINDOWS_MOBILE
-  // We are on Windows CE, which has no environment variables.
-  return NULL;
-#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
-  // Environment variables which we programmatically clear will be set to the
-  // empty string rather than unset (NULL).  Handle that case.
-  const char* const env = getenv(name);
-  return (env != NULL && env[0] != '\0') ? env : NULL;
-#else
-  return getenv(name);
-#endif
-}
-
-#ifdef _MSC_VER
-# pragma warning(pop)  // Restores the warning state.
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Windows CE has no C library. The abort() function is used in
-// several places in Google Test. This implementation provides a reasonable
-// imitation of standard behaviour.
-void Abort();
-#else
-inline void Abort() { abort(); }
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-}  // namespace posix
-
-// The maximum number a BiggestInt can represent.  This definition
-// works no matter BiggestInt is represented in one's complement or
-// two's complement.
-//
-// We cannot rely on numeric_limits in STL, as __int64 and long long
-// are not part of standard C++ and numeric_limits doesn't need to be
-// defined for them.
-const BiggestInt kMaxBiggestInt =
-    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
-
-// This template class serves as a compile-time function from size to
-// type.  It maps a size in bytes to a primitive type with that
-// size. e.g.
-//
-//   TypeWithSize<4>::UInt
-//
-// is typedef-ed to be unsigned int (unsigned integer made up of 4
-// bytes).
-//
-// Such functionality should belong to STL, but I cannot find it
-// there.
-//
-// Google Test uses this class in the implementation of floating-point
-// comparison.
-//
-// For now it only handles UInt (unsigned int) as that's all Google Test
-// needs.  Other types can be easily added in the future if need
-// arises.
-template <size_t size>
-class TypeWithSize {
- public:
-  // This prevents the user from using TypeWithSize<N> with incorrect
-  // values of N.
-  typedef void UInt;
-};
-
-// The specialization for size 4.
-template <>
-class TypeWithSize<4> {
- public:
-  // unsigned int has size 4 in both gcc and MSVC.
-  //
-  // As base/basictypes.h doesn't compile on Windows, we cannot use
-  // uint32, uint64, and etc here.
-  typedef int Int;
-  typedef unsigned int UInt;
-};
-
-// The specialization for size 8.
-template <>
-class TypeWithSize<8> {
- public:
-
-#if GTEST_OS_WINDOWS
-  typedef __int64 Int;
-  typedef unsigned __int64 UInt;
-#else
-  typedef long long Int;  // NOLINT
-  typedef unsigned long long UInt;  // NOLINT
-#endif  // GTEST_OS_WINDOWS
-};
-
-// Integer types of known sizes.
-typedef TypeWithSize<4>::Int Int32;
-typedef TypeWithSize<4>::UInt UInt32;
-typedef TypeWithSize<8>::Int Int64;
-typedef TypeWithSize<8>::UInt UInt64;
-typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
-
-// Utilities for command line flags and environment variables.
-
-// Macro for referencing flags.
-#define GTEST_FLAG(name) FLAGS_gtest_##name
-
-// Macros for declaring flags.
-#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
-#define GTEST_DECLARE_int32_(name) \
-    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
-#define GTEST_DECLARE_string_(name) \
-    GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)
-
-// Macros for defining flags.
-#define GTEST_DEFINE_bool_(name, default_val, doc) \
-    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_int32_(name, default_val, doc) \
-    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_string_(name, default_val, doc) \
-    GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
-
-// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
-// to *value and returns true; otherwise leaves *value unchanged and returns
-// false.
-// TODO(chandlerc): Find a better way to refactor flag and environment parsing
-// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
-// function.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value);
-
-// Parses a bool/Int32/string from the environment variable
-// corresponding to the given Google Test flag.
-bool BoolFromGTestEnv(const char* flag, bool default_val);
-GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
-const char* StringFromGTestEnv(const char* flag, const char* default_val);
-
-}  // namespace internal
-}  // namespace testing
-
-#ifdef __ICC
-#pragma warning enable 2304
-#endif
-
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-string.h b/unit_tests/gtest/include/gtest/internal/gtest-string.h
deleted file mode 100644
index 9657ce5..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-string.h
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares the String class and functions used internally by
-// Google Test.  They are subject to change without notice. They should not used
-// by code external to Google Test.
-//
-// This header file is #included by <gtest/internal/gtest-internal.h>.
-// It should not be #included by other files.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-#ifdef __BORLANDC__
-// string.h is not guaranteed to provide strcpy on C++ Builder.
-# include <mem.h>
-#endif
-
-#include <string.h>
-#include "gtest/internal/gtest-port.h"
-
-#include <string>
-
-namespace testing {
-namespace internal {
-
-// String - a UTF-8 string class.
-//
-// For historic reasons, we don't use std::string.
-//
-// TODO(wan at google.com): replace this class with std::string or
-// implement it in terms of the latter.
-//
-// Note that String can represent both NULL and the empty string,
-// while std::string cannot represent NULL.
-//
-// NULL and the empty string are considered different.  NULL is less
-// than anything (including the empty string) except itself.
-//
-// This class only provides minimum functionality necessary for
-// implementing Google Test.  We do not intend to implement a full-fledged
-// string class here.
-//
-// Since the purpose of this class is to provide a substitute for
-// std::string on platforms where it cannot be used, we define a copy
-// constructor and assignment operators such that we don't need
-// conditional compilation in a lot of places.
-//
-// In order to make the representation efficient, the d'tor of String
-// is not virtual.  Therefore DO NOT INHERIT FROM String.
-class GTEST_API_ String {
- public:
-  // Static utility methods
-
-  // Returns the input enclosed in double quotes if it's not NULL;
-  // otherwise returns "(null)".  For example, "\"Hello\"" is returned
-  // for input "Hello".
-  //
-  // This is useful for printing a C string in the syntax of a literal.
-  //
-  // Known issue: escape sequences are not handled yet.
-  static String ShowCStringQuoted(const char* c_str);
-
-  // Clones a 0-terminated C string, allocating memory using new.  The
-  // caller is responsible for deleting the return value using
-  // delete[].  Returns the cloned string, or NULL if the input is
-  // NULL.
-  //
-  // This is different from strdup() in string.h, which allocates
-  // memory using malloc().
-  static const char* CloneCString(const char* c_str);
-
-#if GTEST_OS_WINDOWS_MOBILE
-  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
-  // able to pass strings to Win32 APIs on CE we need to convert them
-  // to 'Unicode', UTF-16.
-
-  // Creates a UTF-16 wide string from the given ANSI string, allocating
-  // memory using new. The caller is responsible for deleting the return
-  // value using delete[]. Returns the wide string, or NULL if the
-  // input is NULL.
-  //
-  // The wide string is created using the ANSI codepage (CP_ACP) to
-  // match the behaviour of the ANSI versions of Win32 calls and the
-  // C runtime.
-  static LPCWSTR AnsiToUtf16(const char* c_str);
-
-  // Creates an ANSI string from the given wide string, allocating
-  // memory using new. The caller is responsible for deleting the return
-  // value using delete[]. Returns the ANSI string, or NULL if the
-  // input is NULL.
-  //
-  // The returned string is created using the ANSI codepage (CP_ACP) to
-  // match the behaviour of the ANSI versions of Win32 calls and the
-  // C runtime.
-  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
-#endif
-
-  // Compares two C strings.  Returns true iff they have the same content.
-  //
-  // Unlike strcmp(), this function can handle NULL argument(s).  A
-  // NULL C string is considered different to any non-NULL C string,
-  // including the empty string.
-  static bool CStringEquals(const char* lhs, const char* rhs);
-
-  // Converts a wide C string to a String using the UTF-8 encoding.
-  // NULL will be converted to "(null)".  If an error occurred during
-  // the conversion, "(failed to convert from wide string)" is
-  // returned.
-  static String ShowWideCString(const wchar_t* wide_c_str);
-
-  // Similar to ShowWideCString(), except that this function encloses
-  // the converted string in double quotes.
-  static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
-
-  // Compares two wide C strings.  Returns true iff they have the same
-  // content.
-  //
-  // Unlike wcscmp(), this function can handle NULL argument(s).  A
-  // NULL C string is considered different to any non-NULL C string,
-  // including the empty string.
-  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
-
-  // Compares two C strings, ignoring case.  Returns true iff they
-  // have the same content.
-  //
-  // Unlike strcasecmp(), this function can handle NULL argument(s).
-  // A NULL C string is considered different to any non-NULL C string,
-  // including the empty string.
-  static bool CaseInsensitiveCStringEquals(const char* lhs,
-                                           const char* rhs);
-
-  // Compares two wide C strings, ignoring case.  Returns true iff they
-  // have the same content.
-  //
-  // Unlike wcscasecmp(), this function can handle NULL argument(s).
-  // A NULL C string is considered different to any non-NULL wide C string,
-  // including the empty string.
-  // NB: The implementations on different platforms slightly differ.
-  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
-  // environment variable. On GNU platform this method uses wcscasecmp
-  // which compares according to LC_CTYPE category of the current locale.
-  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
-  // current locale.
-  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
-                                               const wchar_t* rhs);
-
-  // Formats a list of arguments to a String, using the same format
-  // spec string as for printf.
-  //
-  // We do not use the StringPrintf class as it is not universally
-  // available.
-  //
-  // The result is limited to 4096 characters (including the tailing
-  // 0).  If 4096 characters are not enough to format the input,
-  // "<buffer exceeded>" is returned.
-  static String Format(const char* format, ...);
-
-  // C'tors
-
-  // The default c'tor constructs a NULL string.
-  String() : c_str_(NULL), length_(0) {}
-
-  // Constructs a String by cloning a 0-terminated C string.
-  String(const char* a_c_str) {  // NOLINT
-    if (a_c_str == NULL) {
-      c_str_ = NULL;
-      length_ = 0;
-    } else {
-      ConstructNonNull(a_c_str, strlen(a_c_str));
-    }
-  }
-
-  // Constructs a String by copying a given number of chars from a
-  // buffer.  E.g. String("hello", 3) creates the string "hel",
-  // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "",
-  // and String(NULL, 1) results in access violation.
-  String(const char* buffer, size_t a_length) {
-    ConstructNonNull(buffer, a_length);
-  }
-
-  // The copy c'tor creates a new copy of the string.  The two
-  // String objects do not share content.
-  String(const String& str) : c_str_(NULL), length_(0) { *this = str; }
-
-  // D'tor.  String is intended to be a final class, so the d'tor
-  // doesn't need to be virtual.
-  ~String() { delete[] c_str_; }
-
-  // Allows a String to be implicitly converted to an ::std::string or
-  // ::string, and vice versa.  Converting a String containing a NULL
-  // pointer to ::std::string or ::string is undefined behavior.
-  // Converting a ::std::string or ::string containing an embedded NUL
-  // character to a String will result in the prefix up to the first
-  // NUL character.
-  String(const ::std::string& str) {
-    ConstructNonNull(str.c_str(), str.length());
-  }
-
-  operator ::std::string() const { return ::std::string(c_str(), length()); }
-
-#if GTEST_HAS_GLOBAL_STRING
-  String(const ::string& str) {
-    ConstructNonNull(str.c_str(), str.length());
-  }
-
-  operator ::string() const { return ::string(c_str(), length()); }
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-  // Returns true iff this is an empty string (i.e. "").
-  bool empty() const { return (c_str() != NULL) && (length() == 0); }
-
-  // Compares this with another String.
-  // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-  // if this is greater than rhs.
-  int Compare(const String& rhs) const;
-
-  // Returns true iff this String equals the given C string.  A NULL
-  // string and a non-NULL string are considered not equal.
-  bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }
-
-  // Returns true iff this String is less than the given String.  A
-  // NULL string is considered less than "".
-  bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
-
-  // Returns true iff this String doesn't equal the given C string.  A NULL
-  // string and a non-NULL string are considered not equal.
-  bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }
-
-  // Returns true iff this String ends with the given suffix.  *Any*
-  // String is considered to end with a NULL or empty suffix.
-  bool EndsWith(const char* suffix) const;
-
-  // Returns true iff this String ends with the given suffix, not considering
-  // case. Any String is considered to end with a NULL or empty suffix.
-  bool EndsWithCaseInsensitive(const char* suffix) const;
-
-  // Returns the length of the encapsulated string, or 0 if the
-  // string is NULL.
-  size_t length() const { return length_; }
-
-  // Gets the 0-terminated C string this String object represents.
-  // The String object still owns the string.  Therefore the caller
-  // should NOT delete the return value.
-  const char* c_str() const { return c_str_; }
-
-  // Assigns a C string to this object.  Self-assignment works.
-  const String& operator=(const char* a_c_str) {
-    return *this = String(a_c_str);
-  }
-
-  // Assigns a String object to this object.  Self-assignment works.
-  const String& operator=(const String& rhs) {
-    if (this != &rhs) {
-      delete[] c_str_;
-      if (rhs.c_str() == NULL) {
-        c_str_ = NULL;
-        length_ = 0;
-      } else {
-        ConstructNonNull(rhs.c_str(), rhs.length());
-      }
-    }
-
-    return *this;
-  }
-
- private:
-  // Constructs a non-NULL String from the given content.  This
-  // function can only be called when c_str_ has not been allocated.
-  // ConstructNonNull(NULL, 0) results in an empty string ("").
-  // ConstructNonNull(NULL, non_zero) is undefined behavior.
-  void ConstructNonNull(const char* buffer, size_t a_length) {
-    char* const str = new char[a_length + 1];
-    memcpy(str, buffer, a_length);
-    str[a_length] = '\0';
-    c_str_ = str;
-    length_ = a_length;
-  }
-
-  const char* c_str_;
-  size_t length_;
-};  // class String
-
-// Streams a String to an ostream.  Each '\0' character in the String
-// is replaced with "\\0".
-inline ::std::ostream& operator<<(::std::ostream& os, const String& str) {
-  if (str.c_str() == NULL) {
-    os << "(null)";
-  } else {
-    const char* const c_str = str.c_str();
-    for (size_t i = 0; i != str.length(); i++) {
-      if (c_str[i] == '\0') {
-        os << "\\0";
-      } else {
-        os << c_str[i];
-      }
-    }
-  }
-  return os;
-}
-
-// Gets the content of the stringstream's buffer as a String.  Each '\0'
-// character in the buffer is replaced with "\\0".
-GTEST_API_ String StringStreamToString(::std::stringstream* stream);
-
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-}  // namespace internal
-}  // namespace testing
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning enable 2304
-#endif
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-tuple.h b/unit_tests/gtest/include/gtest/internal/gtest-tuple.h
deleted file mode 100644
index d1af50e..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-tuple.h
+++ /dev/null
@@ -1,968 +0,0 @@
-// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
-
-// Copyright 2009 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-
-#include <utility>  // For ::std::pair.
-
-// The compiler used in Symbian has a bug that prevents us from declaring the
-// tuple template as a friend (it complains that tuple is redefined).  This
-// hack bypasses the bug by declaring the members that should otherwise be
-// private as public.
-// Sun Studio versions < 12 also have the above bug.
-#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
-#else
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
-    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
-   private:
-#endif
-
-// GTEST_n_TUPLE_(T) is the type of an n-tuple.
-#define GTEST_0_TUPLE_(T) tuple<>
-#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
-    void, void, void>
-#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
-    void, void, void>
-#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
-    void, void, void>
-#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
-    void, void, void>
-#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
-    void, void, void>
-#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
-    void, void, void>
-#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
-    void, void, void>
-#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
-    T##7, void, void>
-#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
-    T##7, T##8, void>
-#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
-    T##7, T##8, T##9>
-
-// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
-#define GTEST_0_TYPENAMES_(T)
-#define GTEST_1_TYPENAMES_(T) typename T##0
-#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
-#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
-#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3
-#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4
-#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4, typename T##5
-#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4, typename T##5, typename T##6
-#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
-#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4, typename T##5, typename T##6, \
-    typename T##7, typename T##8
-#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
-    typename T##3, typename T##4, typename T##5, typename T##6, \
-    typename T##7, typename T##8, typename T##9
-
-// In theory, defining stuff in the ::std namespace is undefined
-// behavior.  We can do this as we are playing the role of a standard
-// library vendor.
-namespace std {
-namespace tr1 {
-
-template <typename T0 = void, typename T1 = void, typename T2 = void,
-    typename T3 = void, typename T4 = void, typename T5 = void,
-    typename T6 = void, typename T7 = void, typename T8 = void,
-    typename T9 = void>
-class tuple;
-
-// Anything in namespace gtest_internal is Google Test's INTERNAL
-// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
-namespace gtest_internal {
-
-// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
-template <typename T>
-struct ByRef { typedef const T& type; };  // NOLINT
-template <typename T>
-struct ByRef<T&> { typedef T& type; };  // NOLINT
-
-// A handy wrapper for ByRef.
-#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
-
-// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
-// is the same as tr1::add_reference<T>::type.
-template <typename T>
-struct AddRef { typedef T& type; };  // NOLINT
-template <typename T>
-struct AddRef<T&> { typedef T& type; };  // NOLINT
-
-// A handy wrapper for AddRef.
-#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
-
-// A helper for implementing get<k>().
-template <int k> class Get;
-
-// A helper for implementing tuple_element<k, T>.  kIndexValid is true
-// iff k < the number of fields in tuple type T.
-template <bool kIndexValid, int kIndex, class Tuple>
-struct TupleElement;
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
-
-}  // namespace gtest_internal
-
-template <>
-class tuple<> {
- public:
-  tuple() {}
-  tuple(const tuple& /* t */)  {}
-  tuple& operator=(const tuple& /* t */) { return *this; }
-};
-
-template <GTEST_1_TYPENAMES_(T)>
-class GTEST_1_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
-
-  tuple(const tuple& t) : f0_(t.f0_) {}
-
-  template <GTEST_1_TYPENAMES_(U)>
-  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_1_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_1_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    return *this;
-  }
-
-  T0 f0_;
-};
-
-template <GTEST_2_TYPENAMES_(T)>
-class GTEST_2_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
-      f1_(f1) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
-
-  template <GTEST_2_TYPENAMES_(U)>
-  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
-  template <typename U0, typename U1>
-  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_2_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-  template <typename U0, typename U1>
-  tuple& operator=(const ::std::pair<U0, U1>& p) {
-    f0_ = p.first;
-    f1_ = p.second;
-    return *this;
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_2_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-};
-
-template <GTEST_3_TYPENAMES_(T)>
-class GTEST_3_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
-  template <GTEST_3_TYPENAMES_(U)>
-  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_3_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_3_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-};
-
-template <GTEST_4_TYPENAMES_(T)>
-class GTEST_4_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
-      f3_(f3) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
-
-  template <GTEST_4_TYPENAMES_(U)>
-  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_4_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_4_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-};
-
-template <GTEST_5_TYPENAMES_(T)>
-class GTEST_5_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
-      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_) {}
-
-  template <GTEST_5_TYPENAMES_(U)>
-  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_5_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_5_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-};
-
-template <GTEST_6_TYPENAMES_(T)>
-class GTEST_6_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
-      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
-      f5_(f5) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_), f5_(t.f5_) {}
-
-  template <GTEST_6_TYPENAMES_(U)>
-  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_6_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_6_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    f5_ = t.f5_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-  T5 f5_;
-};
-
-template <GTEST_7_TYPENAMES_(T)>
-class GTEST_7_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
-      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
-  template <GTEST_7_TYPENAMES_(U)>
-  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_7_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_7_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    f5_ = t.f5_;
-    f6_ = t.f6_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-  T5 f5_;
-  T6 f6_;
-};
-
-template <GTEST_8_TYPENAMES_(T)>
-class GTEST_8_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
-      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
-      f5_(f5), f6_(f6), f7_(f7) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
-  template <GTEST_8_TYPENAMES_(U)>
-  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_8_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_8_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    f5_ = t.f5_;
-    f6_ = t.f6_;
-    f7_ = t.f7_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-  T5 f5_;
-  T6 f6_;
-  T7 f7_;
-};
-
-template <GTEST_9_TYPENAMES_(T)>
-class GTEST_9_TUPLE_(T) {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
-      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
-      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
-  template <GTEST_9_TYPENAMES_(U)>
-  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_9_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_9_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    f5_ = t.f5_;
-    f6_ = t.f6_;
-    f7_ = t.f7_;
-    f8_ = t.f8_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-  T5 f5_;
-  T6 f6_;
-  T7 f7_;
-  T8 f8_;
-};
-
-template <GTEST_10_TYPENAMES_(T)>
-class tuple {
- public:
-  template <int k> friend class gtest_internal::Get;
-
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
-      f9_() {}
-
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
-      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
-      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
-
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
-
-  template <GTEST_10_TYPENAMES_(U)>
-  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
-      f9_(t.f9_) {}
-
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
-  template <GTEST_10_TYPENAMES_(U)>
-  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
-    return CopyFrom(t);
-  }
-
-  GTEST_DECLARE_TUPLE_AS_FRIEND_
-
-  template <GTEST_10_TYPENAMES_(U)>
-  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
-    f0_ = t.f0_;
-    f1_ = t.f1_;
-    f2_ = t.f2_;
-    f3_ = t.f3_;
-    f4_ = t.f4_;
-    f5_ = t.f5_;
-    f6_ = t.f6_;
-    f7_ = t.f7_;
-    f8_ = t.f8_;
-    f9_ = t.f9_;
-    return *this;
-  }
-
-  T0 f0_;
-  T1 f1_;
-  T2 f2_;
-  T3 f3_;
-  T4 f4_;
-  T5 f5_;
-  T6 f6_;
-  T7 f7_;
-  T8 f8_;
-  T9 f9_;
-};
-
-// 6.1.3.2 Tuple creation functions.
-
-// Known limitations: we don't support passing an
-// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
-// implement tie().
-
-inline tuple<> make_tuple() { return tuple<>(); }
-
-template <GTEST_1_TYPENAMES_(T)>
-inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
-  return GTEST_1_TUPLE_(T)(f0);
-}
-
-template <GTEST_2_TYPENAMES_(T)>
-inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
-  return GTEST_2_TUPLE_(T)(f0, f1);
-}
-
-template <GTEST_3_TYPENAMES_(T)>
-inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
-  return GTEST_3_TUPLE_(T)(f0, f1, f2);
-}
-
-template <GTEST_4_TYPENAMES_(T)>
-inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3) {
-  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
-}
-
-template <GTEST_5_TYPENAMES_(T)>
-inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4) {
-  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
-}
-
-template <GTEST_6_TYPENAMES_(T)>
-inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4, const T5& f5) {
-  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
-}
-
-template <GTEST_7_TYPENAMES_(T)>
-inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
-  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
-}
-
-template <GTEST_8_TYPENAMES_(T)>
-inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
-  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
-}
-
-template <GTEST_9_TYPENAMES_(T)>
-inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
-    const T8& f8) {
-  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
-}
-
-template <GTEST_10_TYPENAMES_(T)>
-inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
-    const T8& f8, const T9& f9) {
-  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
-}
-
-// 6.1.3.3 Tuple helper classes.
-
-template <typename Tuple> struct tuple_size;
-
-template <GTEST_0_TYPENAMES_(T)>
-struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
-
-template <GTEST_1_TYPENAMES_(T)>
-struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
-
-template <GTEST_2_TYPENAMES_(T)>
-struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
-
-template <GTEST_3_TYPENAMES_(T)>
-struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
-
-template <GTEST_4_TYPENAMES_(T)>
-struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
-
-template <GTEST_5_TYPENAMES_(T)>
-struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
-
-template <GTEST_6_TYPENAMES_(T)>
-struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
-
-template <GTEST_7_TYPENAMES_(T)>
-struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
-
-template <GTEST_8_TYPENAMES_(T)>
-struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
-
-template <GTEST_9_TYPENAMES_(T)>
-struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
-
-template <int k, class Tuple>
-struct tuple_element {
-  typedef typename gtest_internal::TupleElement<
-      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
-};
-
-#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
-
-// 6.1.3.4 Element access.
-
-namespace gtest_internal {
-
-template <>
-class Get<0> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
-  Field(Tuple& t) { return t.f0_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
-  ConstField(const Tuple& t) { return t.f0_; }
-};
-
-template <>
-class Get<1> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
-  Field(Tuple& t) { return t.f1_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
-  ConstField(const Tuple& t) { return t.f1_; }
-};
-
-template <>
-class Get<2> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
-  Field(Tuple& t) { return t.f2_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
-  ConstField(const Tuple& t) { return t.f2_; }
-};
-
-template <>
-class Get<3> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
-  Field(Tuple& t) { return t.f3_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
-  ConstField(const Tuple& t) { return t.f3_; }
-};
-
-template <>
-class Get<4> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
-  Field(Tuple& t) { return t.f4_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
-  ConstField(const Tuple& t) { return t.f4_; }
-};
-
-template <>
-class Get<5> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
-  Field(Tuple& t) { return t.f5_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
-  ConstField(const Tuple& t) { return t.f5_; }
-};
-
-template <>
-class Get<6> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
-  Field(Tuple& t) { return t.f6_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
-  ConstField(const Tuple& t) { return t.f6_; }
-};
-
-template <>
-class Get<7> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
-  Field(Tuple& t) { return t.f7_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
-  ConstField(const Tuple& t) { return t.f7_; }
-};
-
-template <>
-class Get<8> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
-  Field(Tuple& t) { return t.f8_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
-  ConstField(const Tuple& t) { return t.f8_; }
-};
-
-template <>
-class Get<9> {
- public:
-  template <class Tuple>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
-  Field(Tuple& t) { return t.f9_; }  // NOLINT
-
-  template <class Tuple>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
-  ConstField(const Tuple& t) { return t.f9_; }
-};
-
-}  // namespace gtest_internal
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
-get(GTEST_10_TUPLE_(T)& t) {
-  return gtest_internal::Get<k>::Field(t);
-}
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
-get(const GTEST_10_TUPLE_(T)& t) {
-  return gtest_internal::Get<k>::ConstField(t);
-}
-
-// 6.1.3.5 Relational operators
-
-// We only implement == and !=, as we don't have a need for the rest yet.
-
-namespace gtest_internal {
-
-// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
-// first k fields of t1 equals the first k fields of t2.
-// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
-// k1 != k2.
-template <int kSize1, int kSize2>
-struct SameSizeTuplePrefixComparator;
-
-template <>
-struct SameSizeTuplePrefixComparator<0, 0> {
-  template <class Tuple1, class Tuple2>
-  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
-    return true;
-  }
-};
-
-template <int k>
-struct SameSizeTuplePrefixComparator<k, k> {
-  template <class Tuple1, class Tuple2>
-  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
-    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
-        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
-  }
-};
-
-}  // namespace gtest_internal
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator==(const GTEST_10_TUPLE_(T)& t,
-                       const GTEST_10_TUPLE_(U)& u) {
-  return gtest_internal::SameSizeTuplePrefixComparator<
-      tuple_size<GTEST_10_TUPLE_(T)>::value,
-      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
-}
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
-                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
-
-// 6.1.4 Pairs.
-// Unimplemented.
-
-}  // namespace tr1
-}  // namespace std
-
-#undef GTEST_0_TUPLE_
-#undef GTEST_1_TUPLE_
-#undef GTEST_2_TUPLE_
-#undef GTEST_3_TUPLE_
-#undef GTEST_4_TUPLE_
-#undef GTEST_5_TUPLE_
-#undef GTEST_6_TUPLE_
-#undef GTEST_7_TUPLE_
-#undef GTEST_8_TUPLE_
-#undef GTEST_9_TUPLE_
-#undef GTEST_10_TUPLE_
-
-#undef GTEST_0_TYPENAMES_
-#undef GTEST_1_TYPENAMES_
-#undef GTEST_2_TYPENAMES_
-#undef GTEST_3_TYPENAMES_
-#undef GTEST_4_TYPENAMES_
-#undef GTEST_5_TYPENAMES_
-#undef GTEST_6_TYPENAMES_
-#undef GTEST_7_TYPENAMES_
-#undef GTEST_8_TYPENAMES_
-#undef GTEST_9_TYPENAMES_
-#undef GTEST_10_TYPENAMES_
-
-#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
-#undef GTEST_BY_REF_
-#undef GTEST_ADD_REF_
-#undef GTEST_TUPLE_ELEMENT_
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-type-util.h b/unit_tests/gtest/include/gtest/internal/gtest-type-util.h
deleted file mode 100644
index b7b01b0..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-type-util.h
+++ /dev/null
@@ -1,3330 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py gtest-type-util.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Type utilities needed for implementing typed and type-parameterized
-// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
-//
-// Currently we support at most 50 types in a list, and at most 50
-// type-parameterized tests in one type-parameterized test case.
-// Please contact googletestframework at googlegroups.com if you need
-// more.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-string.h"
-
-// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
-// libstdc++ (which is where cxxabi.h comes from).
-# ifdef __GLIBCXX__
-#  include <cxxabi.h>
-# elif defined(__HP_aCC)
-#  include <acxx_demangle.h>
-# endif  // __GLIBCXX__
-
-namespace testing {
-namespace internal {
-
-// GetTypeName<T>() returns a human-readable name of type T.
-// NB: This function is also used in Google Mock, so don't move it inside of
-// the typed-test-only section below.
-template <typename T>
-String GetTypeName() {
-# if GTEST_HAS_RTTI
-
-  const char* const name = typeid(T).name();
-#  if defined(__GLIBCXX__) || defined(__HP_aCC)
-  int status = 0;
-  // gcc's implementation of typeid(T).name() mangles the type name,
-  // so we have to demangle it.
-#   ifdef __GLIBCXX__
-  using abi::__cxa_demangle;
-#   endif // __GLIBCXX__
-  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
-  const String name_str(status == 0 ? readable_name : name);
-  free(readable_name);
-  return name_str;
-#  else
-  return name;
-#  endif  // __GLIBCXX__ || __HP_aCC
-
-# else
-
-  return "<type>";
-
-# endif  // GTEST_HAS_RTTI
-}
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
-// type.  This can be used as a compile-time assertion to ensure that
-// two types are equal.
-
-template <typename T1, typename T2>
-struct AssertTypeEq;
-
-template <typename T>
-struct AssertTypeEq<T, T> {
-  typedef bool type;
-};
-
-// A unique type used as the default value for the arguments of class
-// template Types.  This allows us to simulate variadic templates
-// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
-// support directly.
-struct None {};
-
-// The following family of struct and struct templates are used to
-// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
-// represents a type list with N types (T1, T2, ..., and TN) in it.
-// Except for Types0, every struct in the family has two member types:
-// Head for the first type in the list, and Tail for the rest of the
-// list.
-
-// The empty type list.
-struct Types0 {};
-
-// Type lists of length 1, 2, 3, and so on.
-
-template <typename T1>
-struct Types1 {
-  typedef T1 Head;
-  typedef Types0 Tail;
-};
-template <typename T1, typename T2>
-struct Types2 {
-  typedef T1 Head;
-  typedef Types1<T2> Tail;
-};
-
-template <typename T1, typename T2, typename T3>
-struct Types3 {
-  typedef T1 Head;
-  typedef Types2<T2, T3> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types4 {
-  typedef T1 Head;
-  typedef Types3<T2, T3, T4> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types5 {
-  typedef T1 Head;
-  typedef Types4<T2, T3, T4, T5> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6>
-struct Types6 {
-  typedef T1 Head;
-  typedef Types5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7>
-struct Types7 {
-  typedef T1 Head;
-  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8>
-struct Types8 {
-  typedef T1 Head;
-  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9>
-struct Types9 {
-  typedef T1 Head;
-  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types10 {
-  typedef T1 Head;
-  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11>
-struct Types11 {
-  typedef T1 Head;
-  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12>
-struct Types12 {
-  typedef T1 Head;
-  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13>
-struct Types13 {
-  typedef T1 Head;
-  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14>
-struct Types14 {
-  typedef T1 Head;
-  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types15 {
-  typedef T1 Head;
-  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16>
-struct Types16 {
-  typedef T1 Head;
-  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17>
-struct Types17 {
-  typedef T1 Head;
-  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18>
-struct Types18 {
-  typedef T1 Head;
-  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19>
-struct Types19 {
-  typedef T1 Head;
-  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types20 {
-  typedef T1 Head;
-  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21>
-struct Types21 {
-  typedef T1 Head;
-  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22>
-struct Types22 {
-  typedef T1 Head;
-  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23>
-struct Types23 {
-  typedef T1 Head;
-  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24>
-struct Types24 {
-  typedef T1 Head;
-  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types25 {
-  typedef T1 Head;
-  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26>
-struct Types26 {
-  typedef T1 Head;
-  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27>
-struct Types27 {
-  typedef T1 Head;
-  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28>
-struct Types28 {
-  typedef T1 Head;
-  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29>
-struct Types29 {
-  typedef T1 Head;
-  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types30 {
-  typedef T1 Head;
-  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31>
-struct Types31 {
-  typedef T1 Head;
-  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32>
-struct Types32 {
-  typedef T1 Head;
-  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33>
-struct Types33 {
-  typedef T1 Head;
-  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34>
-struct Types34 {
-  typedef T1 Head;
-  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types35 {
-  typedef T1 Head;
-  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36>
-struct Types36 {
-  typedef T1 Head;
-  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37>
-struct Types37 {
-  typedef T1 Head;
-  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38>
-struct Types38 {
-  typedef T1 Head;
-  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39>
-struct Types39 {
-  typedef T1 Head;
-  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types40 {
-  typedef T1 Head;
-  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41>
-struct Types41 {
-  typedef T1 Head;
-  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42>
-struct Types42 {
-  typedef T1 Head;
-  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43>
-struct Types43 {
-  typedef T1 Head;
-  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44>
-struct Types44 {
-  typedef T1 Head;
-  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types45 {
-  typedef T1 Head;
-  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46>
-struct Types46 {
-  typedef T1 Head;
-  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45, T46> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47>
-struct Types47 {
-  typedef T1 Head;
-  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45, T46, T47> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48>
-struct Types48 {
-  typedef T1 Head;
-  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45, T46, T47, T48> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49>
-struct Types49 {
-  typedef T1 Head;
-  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49, typename T50>
-struct Types50 {
-  typedef T1 Head;
-  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-      T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-}  // namespace internal
-
-// We don't want to require the users to write TypesN<...> directly,
-// as that would require them to count the length.  Types<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Types<int>
-// will appear as Types<int, None, None, ..., None> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Types<T1, ..., TN>, and Google Test will translate
-// that to TypesN<T1, ..., TN> internally to make error messages
-// readable.  The translation is done by the 'type' member of the
-// Types template.
-template <typename T1 = internal::None, typename T2 = internal::None,
-    typename T3 = internal::None, typename T4 = internal::None,
-    typename T5 = internal::None, typename T6 = internal::None,
-    typename T7 = internal::None, typename T8 = internal::None,
-    typename T9 = internal::None, typename T10 = internal::None,
-    typename T11 = internal::None, typename T12 = internal::None,
-    typename T13 = internal::None, typename T14 = internal::None,
-    typename T15 = internal::None, typename T16 = internal::None,
-    typename T17 = internal::None, typename T18 = internal::None,
-    typename T19 = internal::None, typename T20 = internal::None,
-    typename T21 = internal::None, typename T22 = internal::None,
-    typename T23 = internal::None, typename T24 = internal::None,
-    typename T25 = internal::None, typename T26 = internal::None,
-    typename T27 = internal::None, typename T28 = internal::None,
-    typename T29 = internal::None, typename T30 = internal::None,
-    typename T31 = internal::None, typename T32 = internal::None,
-    typename T33 = internal::None, typename T34 = internal::None,
-    typename T35 = internal::None, typename T36 = internal::None,
-    typename T37 = internal::None, typename T38 = internal::None,
-    typename T39 = internal::None, typename T40 = internal::None,
-    typename T41 = internal::None, typename T42 = internal::None,
-    typename T43 = internal::None, typename T44 = internal::None,
-    typename T45 = internal::None, typename T46 = internal::None,
-    typename T47 = internal::None, typename T48 = internal::None,
-    typename T49 = internal::None, typename T50 = internal::None>
-struct Types {
-  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Types<internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types0 type;
-};
-template <typename T1>
-struct Types<T1, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types1<T1> type;
-};
-template <typename T1, typename T2>
-struct Types<T1, T2, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types2<T1, T2> type;
-};
-template <typename T1, typename T2, typename T3>
-struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types3<T1, T2, T3> type;
-};
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types4<T1, T2, T3, T4> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types5<T1, T2, T3, T4, T5> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6>
-struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7>
-struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
-      T12> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
-      T26> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
-      T40> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None, internal::None> {
-  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None, internal::None> {
-  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
-    internal::None, internal::None, internal::None, internal::None,
-    internal::None> {
-  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
-    T46, internal::None, internal::None, internal::None, internal::None> {
-  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
-    T46, T47, internal::None, internal::None, internal::None> {
-  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46, T47> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
-    T46, T47, T48, internal::None, internal::None> {
-  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
-    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
-    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
-    T46, T47, T48, T49, internal::None> {
-  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-namespace internal {
-
-# define GTEST_TEMPLATE_ template <typename T> class
-
-// The template "selector" struct TemplateSel<Tmpl> is used to
-// represent Tmpl, which must be a class template with one type
-// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
-// as the type Tmpl<T>.  This allows us to actually instantiate the
-// template "selected" by TemplateSel<Tmpl>.
-//
-// This trick is necessary for simulating typedef for class templates,
-// which C++ doesn't support directly.
-template <GTEST_TEMPLATE_ Tmpl>
-struct TemplateSel {
-  template <typename T>
-  struct Bind {
-    typedef Tmpl<T> type;
-  };
-};
-
-# define GTEST_BIND_(TmplSel, T) \
-  TmplSel::template Bind<T>::type
-
-// A unique struct template used as the default value for the
-// arguments of class template Templates.  This allows us to simulate
-// variadic templates (e.g. Templates<int>, Templates<int, double>,
-// and etc), which C++ doesn't support directly.
-template <typename T>
-struct NoneT {};
-
-// The following family of struct and struct templates are used to
-// represent template lists.  In particular, TemplatesN<T1, T2, ...,
-// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
-// for Templates0, every struct in the family has two member types:
-// Head for the selector of the first template in the list, and Tail
-// for the rest of the list.
-
-// The empty template list.
-struct Templates0 {};
-
-// Template lists of length 1, 2, 3, and so on.
-
-template <GTEST_TEMPLATE_ T1>
-struct Templates1 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates0 Tail;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates2 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates1<T2> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates3 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates2<T2, T3> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4>
-struct Templates4 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates3<T2, T3, T4> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates5 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates4<T2, T3, T4, T5> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates6 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7>
-struct Templates7 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates8 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates9 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10>
-struct Templates10 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates11 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates12 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13>
-struct Templates13 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates14 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates15 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16>
-struct Templates16 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates17 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates18 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19>
-struct Templates19 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates20 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates21 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22>
-struct Templates22 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates23 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates24 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25>
-struct Templates25 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates26 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates27 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28>
-struct Templates28 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates29 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates30 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31>
-struct Templates31 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates32 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates33 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34>
-struct Templates34 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates35 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates36 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37>
-struct Templates37 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates38 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates39 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40>
-struct Templates40 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates41 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates42 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43>
-struct Templates43 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates44 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates45 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46>
-struct Templates46 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45, T46> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates47 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45, T46, T47> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates48 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45, T46, T47, T48> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
-    GTEST_TEMPLATE_ T49>
-struct Templates49 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
-    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
-struct Templates50 {
-  typedef TemplateSel<T1> Head;
-  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
-      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-// We don't want to require the users to write TemplatesN<...> directly,
-// as that would require them to count the length.  Templates<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Templates<list>
-// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Templates<T1, ..., TN>, and Google Test will translate
-// that to TemplatesN<T1, ..., TN> internally to make error messages
-// readable.  The translation is done by the 'type' member of the
-// Templates template.
-template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
-    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
-    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
-    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
-    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
-    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
-    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
-    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
-    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
-    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
-    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
-    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
-    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
-    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
-    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
-    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
-    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
-    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
-    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
-    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
-    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
-    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
-    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
-    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
-    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
-struct Templates {
-  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT> {
-  typedef Templates0 type;
-};
-template <GTEST_TEMPLATE_ T1>
-struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT> {
-  typedef Templates1<T1> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT> {
-  typedef Templates2<T1, T2> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates3<T1, T2, T3> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4>
-struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates4<T1, T2, T3, T4> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates5<T1, T2, T3, T4, T5> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT> {
-  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT> {
-  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT> {
-  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT> {
-  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT> {
-  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT> {
-  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT> {
-  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT> {
-  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    T45, T46, NoneT, NoneT, NoneT, NoneT> {
-  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45, T46> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    T45, T46, T47, NoneT, NoneT, NoneT> {
-  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45, T46, T47> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    T45, T46, T47, T48, NoneT, NoneT> {
-  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
-    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
-    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
-    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
-    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
-    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
-    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
-    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
-    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
-    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
-    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
-    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
-    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
-    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
-    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
-    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
-    GTEST_TEMPLATE_ T49>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
-    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
-    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
-    T45, T46, T47, T48, T49, NoneT> {
-  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
-      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
-      T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-// The TypeList template makes it possible to use either a single type
-// or a Types<...> list in TYPED_TEST_CASE() and
-// INSTANTIATE_TYPED_TEST_CASE_P().
-
-template <typename T>
-struct TypeList { typedef Types1<T> type; };
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
-    typename T6, typename T7, typename T8, typename T9, typename T10,
-    typename T11, typename T12, typename T13, typename T14, typename T15,
-    typename T16, typename T17, typename T18, typename T19, typename T20,
-    typename T21, typename T22, typename T23, typename T24, typename T25,
-    typename T26, typename T27, typename T28, typename T29, typename T30,
-    typename T31, typename T32, typename T33, typename T34, typename T35,
-    typename T36, typename T37, typename T38, typename T39, typename T40,
-    typename T41, typename T42, typename T43, typename T44, typename T45,
-    typename T46, typename T47, typename T48, typename T49, typename T50>
-struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
-    T44, T45, T46, T47, T48, T49, T50> > {
-  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
-      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
-      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
-};
-
-#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/unit_tests/gtest/src/gtest-all.cc b/unit_tests/gtest/src/gtest-all.cc
index 0a9cee5..a9a03b2 100644
--- a/unit_tests/gtest/src/gtest-all.cc
+++ b/unit_tests/gtest/src/gtest-all.cc
@@ -39,10 +39,9554 @@
 #include "gtest/gtest.h"
 
 // The following lines pull in the real gtest *.cc files.
-#include "src/gtest.cc"
-#include "src/gtest-death-test.cc"
-#include "src/gtest-filepath.cc"
-#include "src/gtest-port.cc"
-#include "src/gtest-printers.cc"
-#include "src/gtest-test-part.cc"
-#include "src/gtest-typed-test.cc"
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
+// Copyright 2005, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2007, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008, Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008 Google 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-death-test.cc b/unit_tests/gtest/src/gtest-death-test.cc
deleted file mode 100644
index 8b2e413..0000000
--- a/unit_tests/gtest/src/gtest-death-test.cc
+++ /dev/null
@@ -1,1234 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
-//
-// This file implements death tests.
-
-#include "gtest/gtest-death-test.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_DEATH_TEST
-
-# if GTEST_OS_MAC
-#  include <crt_externs.h>
-# endif  // GTEST_OS_MAC
-
-# include <errno.h>
-# include <fcntl.h>
-# include <limits.h>
-# include <stdarg.h>
-
-# if GTEST_OS_WINDOWS
-#  include <windows.h>
-# else
-#  include <sys/mman.h>
-#  include <sys/wait.h>
-# endif  // GTEST_OS_WINDOWS
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation.  It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error.  This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-// Constants.
-
-// The default death test style.
-static const char kDefaultDeathTestStyle[] = "fast";
-
-GTEST_DEFINE_string_(
-    death_test_style,
-    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
-    "Indicates how to run a death test in a forked child process: "
-    "\"threadsafe\" (child process re-executes the test binary "
-    "from the beginning, running only the specific death test) or "
-    "\"fast\" (child process runs the death test immediately "
-    "after forking).");
-
-GTEST_DEFINE_bool_(
-    death_test_use_fork,
-    internal::BoolFromGTestEnv("death_test_use_fork", false),
-    "Instructs to use fork()/_exit() instead of clone() in death tests. "
-    "Ignored and always uses fork() on POSIX systems where clone() is not "
-    "implemented. Useful when running under valgrind or similar tools if "
-    "those do not support clone(). Valgrind 3.3.1 will just fail if "
-    "it sees an unsupported combination of clone() flags. "
-    "It is not recommended to use this flag w/o valgrind though it will "
-    "work in 99% of the cases. Once valgrind is fixed, this flag will "
-    "most likely be removed.");
-
-namespace internal {
-GTEST_DEFINE_string_(
-    internal_run_death_test, "",
-    "Indicates the file, line number, temporal index of "
-    "the single death test to run, and a file descriptor to "
-    "which a success code may be sent, all separated by "
-    "colons.  This flag is specified if and only if the current "
-    "process is a sub-process launched for running a thread-safe "
-    "death test.  FOR INTERNAL USE ONLY.");
-}  // namespace internal
-
-#if GTEST_HAS_DEATH_TEST
-
-// ExitedWithCode constructor.
-ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
-}
-
-// ExitedWithCode function-call operator.
-bool ExitedWithCode::operator()(int exit_status) const {
-# if GTEST_OS_WINDOWS
-
-  return exit_status == exit_code_;
-
-# else
-
-  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
-
-# endif  // GTEST_OS_WINDOWS
-}
-
-# if !GTEST_OS_WINDOWS
-// KilledBySignal constructor.
-KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
-}
-
-// KilledBySignal function-call operator.
-bool KilledBySignal::operator()(int exit_status) const {
-  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
-}
-# endif  // !GTEST_OS_WINDOWS
-
-namespace internal {
-
-// Utilities needed for death tests.
-
-// Generates a textual description of a given exit code, in the format
-// specified by wait(2).
-static String ExitSummary(int exit_code) {
-  Message m;
-
-# if GTEST_OS_WINDOWS
-
-  m << "Exited with exit status " << exit_code;
-
-# else
-
-  if (WIFEXITED(exit_code)) {
-    m << "Exited with exit status " << WEXITSTATUS(exit_code);
-  } else if (WIFSIGNALED(exit_code)) {
-    m << "Terminated by signal " << WTERMSIG(exit_code);
-  }
-#  ifdef WCOREDUMP
-  if (WCOREDUMP(exit_code)) {
-    m << " (core dumped)";
-  }
-#  endif
-# endif  // GTEST_OS_WINDOWS
-
-  return m.GetString();
-}
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-bool ExitedUnsuccessfully(int exit_status) {
-  return !ExitedWithCode(0)(exit_status);
-}
-
-# if !GTEST_OS_WINDOWS
-// Generates a textual failure message when a death test finds more than
-// one thread running, or cannot determine the number of threads, prior
-// to executing the given statement.  It is the responsibility of the
-// caller not to pass a thread_count of 1.
-static String DeathTestThreadWarning(size_t thread_count) {
-  Message msg;
-  msg << "Death tests use fork(), which is unsafe particularly"
-      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
-  if (thread_count == 0)
-    msg << "couldn't detect the number of threads.";
-  else
-    msg << "detected " << thread_count << " threads.";
-  return msg.GetString();
-}
-# endif  // !GTEST_OS_WINDOWS
-
-// Flag characters for reporting a death test that did not die.
-static const char kDeathTestLived = 'L';
-static const char kDeathTestReturned = 'R';
-static const char kDeathTestThrew = 'T';
-static const char kDeathTestInternalError = 'I';
-
-// An enumeration describing all of the possible ways that a death test can
-// conclude.  DIED means that the process died while executing the test
-// code; LIVED means that process lived beyond the end of the test code;
-// RETURNED means that the test statement attempted to execute a return
-// statement, which is not allowed; THREW means that the test statement
-// returned control by throwing an exception.  IN_PROGRESS means the test
-// has not yet concluded.
-// TODO(vladl at google.com): Unify names and possibly values for
-// AbortReason, DeathTestOutcome, and flag characters above.
-enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
-
-// Routine for aborting the program which is safe to call from an
-// exec-style death test child process, in which case the error
-// message is propagated back to the parent process.  Otherwise, the
-// message is simply printed to stderr.  In either case, the program
-// then exits with status 1.
-void DeathTestAbort(const String& message) {
-  // On a POSIX system, this function may be called from a threadsafe-style
-  // death test child process, which operates on a very small stack.  Use
-  // the heap for any additional non-minuscule memory requirements.
-  const InternalRunDeathTestFlag* const flag =
-      GetUnitTestImpl()->internal_run_death_test_flag();
-  if (flag != NULL) {
-    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
-    fputc(kDeathTestInternalError, parent);
-    fprintf(parent, "%s", message.c_str());
-    fflush(parent);
-    _exit(1);
-  } else {
-    fprintf(stderr, "%s", message.c_str());
-    fflush(stderr);
-    posix::Abort();
-  }
-}
-
-// A replacement for CHECK that calls DeathTestAbort if the assertion
-// fails.
-# define GTEST_DEATH_TEST_CHECK_(expression) \
-  do { \
-    if (!::testing::internal::IsTrue(expression)) { \
-      DeathTestAbort(::testing::internal::String::Format( \
-          "CHECK failed: File %s, line %d: %s", \
-          __FILE__, __LINE__, #expression)); \
-    } \
-  } while (::testing::internal::AlwaysFalse())
-
-// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
-// evaluating any system call that fulfills two conditions: it must return
-// -1 on failure, and set errno to EINTR when it is interrupted and
-// should be tried again.  The macro expands to a loop that repeatedly
-// evaluates the expression as long as it evaluates to -1 and sets
-// errno to EINTR.  If the expression evaluates to -1 but errno is
-// something other than EINTR, DeathTestAbort is called.
-# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
-  do { \
-    int gtest_retval; \
-    do { \
-      gtest_retval = (expression); \
-    } while (gtest_retval == -1 && errno == EINTR); \
-    if (gtest_retval == -1) { \
-      DeathTestAbort(::testing::internal::String::Format( \
-          "CHECK failed: File %s, line %d: %s != -1", \
-          __FILE__, __LINE__, #expression)); \
-    } \
-  } while (::testing::internal::AlwaysFalse())
-
-// Returns the message describing the last system error in errno.
-String GetLastErrnoDescription() {
-    return String(errno == 0 ? "" : posix::StrError(errno));
-}
-
-// This is called from a death test parent process to read a failure
-// message from the death test child process and log it with the FATAL
-// severity. On Windows, the message is read from a pipe handle. On other
-// platforms, it is read from a file descriptor.
-static void FailFromInternalError(int fd) {
-  Message error;
-  char buffer[256];
-  int num_read;
-
-  do {
-    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
-      buffer[num_read] = '\0';
-      error << buffer;
-    }
-  } while (num_read == -1 && errno == EINTR);
-
-  if (num_read == 0) {
-    GTEST_LOG_(FATAL) << error.GetString();
-  } else {
-    const int last_error = errno;
-    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
-                      << GetLastErrnoDescription() << " [" << last_error << "]";
-  }
-}
-
-// Death test constructor.  Increments the running death test count
-// for the current test.
-DeathTest::DeathTest() {
-  TestInfo* const info = GetUnitTestImpl()->current_test_info();
-  if (info == NULL) {
-    DeathTestAbort("Cannot run a death test outside of a TEST or "
-                   "TEST_F construct");
-  }
-}
-
-// Creates and returns a death test by dispatching to the current
-// death test factory.
-bool DeathTest::Create(const char* statement, const RE* regex,
-                       const char* file, int line, DeathTest** test) {
-  return GetUnitTestImpl()->death_test_factory()->Create(
-      statement, regex, file, line, test);
-}
-
-const char* DeathTest::LastMessage() {
-  return last_death_test_message_.c_str();
-}
-
-void DeathTest::set_last_death_test_message(const String& message) {
-  last_death_test_message_ = message;
-}
-
-String DeathTest::last_death_test_message_;
-
-// Provides cross platform implementation for some death functionality.
-class DeathTestImpl : public DeathTest {
- protected:
-  DeathTestImpl(const char* a_statement, const RE* a_regex)
-      : statement_(a_statement),
-        regex_(a_regex),
-        spawned_(false),
-        status_(-1),
-        outcome_(IN_PROGRESS),
-        read_fd_(-1),
-        write_fd_(-1) {}
-
-  // read_fd_ is expected to be closed and cleared by a derived class.
-  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
-
-  void Abort(AbortReason reason);
-  virtual bool Passed(bool status_ok);
-
-  const char* statement() const { return statement_; }
-  const RE* regex() const { return regex_; }
-  bool spawned() const { return spawned_; }
-  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
-  int status() const { return status_; }
-  void set_status(int a_status) { status_ = a_status; }
-  DeathTestOutcome outcome() const { return outcome_; }
-  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
-  int read_fd() const { return read_fd_; }
-  void set_read_fd(int fd) { read_fd_ = fd; }
-  int write_fd() const { return write_fd_; }
-  void set_write_fd(int fd) { write_fd_ = fd; }
-
-  // Called in the parent process only. Reads the result code of the death
-  // test child process via a pipe, interprets it to set the outcome_
-  // member, and closes read_fd_.  Outputs diagnostics and terminates in
-  // case of unexpected codes.
-  void ReadAndInterpretStatusByte();
-
- private:
-  // The textual content of the code this object is testing.  This class
-  // doesn't own this string and should not attempt to delete it.
-  const char* const statement_;
-  // The regular expression which test output must match.  DeathTestImpl
-  // doesn't own this object and should not attempt to delete it.
-  const RE* const regex_;
-  // True if the death test child process has been successfully spawned.
-  bool spawned_;
-  // The exit status of the child process.
-  int status_;
-  // How the death test concluded.
-  DeathTestOutcome outcome_;
-  // Descriptor to the read end of the pipe to the child process.  It is
-  // always -1 in the child process.  The child keeps its write end of the
-  // pipe in write_fd_.
-  int read_fd_;
-  // Descriptor to the child's write end of the pipe to the parent process.
-  // It is always -1 in the parent process.  The parent keeps its end of the
-  // pipe in read_fd_.
-  int write_fd_;
-};
-
-// Called in the parent process only. Reads the result code of the death
-// test child process via a pipe, interprets it to set the outcome_
-// member, and closes read_fd_.  Outputs diagnostics and terminates in
-// case of unexpected codes.
-void DeathTestImpl::ReadAndInterpretStatusByte() {
-  char flag;
-  int bytes_read;
-
-  // The read() here blocks until data is available (signifying the
-  // failure of the death test) or until the pipe is closed (signifying
-  // its success), so it's okay to call this in the parent before
-  // the child process has exited.
-  do {
-    bytes_read = posix::Read(read_fd(), &flag, 1);
-  } while (bytes_read == -1 && errno == EINTR);
-
-  if (bytes_read == 0) {
-    set_outcome(DIED);
-  } else if (bytes_read == 1) {
-    switch (flag) {
-      case kDeathTestReturned:
-        set_outcome(RETURNED);
-        break;
-      case kDeathTestThrew:
-        set_outcome(THREW);
-        break;
-      case kDeathTestLived:
-        set_outcome(LIVED);
-        break;
-      case kDeathTestInternalError:
-        FailFromInternalError(read_fd());  // Does not return.
-        break;
-      default:
-        GTEST_LOG_(FATAL) << "Death test child process reported "
-                          << "unexpected status byte ("
-                          << static_cast<unsigned int>(flag) << ")";
-    }
-  } else {
-    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
-                      << GetLastErrnoDescription();
-  }
-  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
-  set_read_fd(-1);
-}
-
-// Signals that the death test code which should have exited, didn't.
-// Should be called only in a death test child process.
-// Writes a status byte to the child's status file descriptor, then
-// calls _exit(1).
-void DeathTestImpl::Abort(AbortReason reason) {
-  // The parent process considers the death test to be a failure if
-  // it finds any data in our pipe.  So, here we write a single flag byte
-  // to the pipe, then exit.
-  const char status_ch =
-      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
-      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
-
-  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
-  // We are leaking the descriptor here because on some platforms (i.e.,
-  // when built as Windows DLL), destructors of global objects will still
-  // run after calling _exit(). On such systems, write_fd_ will be
-  // indirectly closed from the destructor of UnitTestImpl, causing double
-  // close if it is also closed here. On debug configurations, double close
-  // may assert. As there are no in-process buffers to flush here, we are
-  // relying on the OS to close the descriptor after the process terminates
-  // when the destructors are not run.
-  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
-}
-
-// Returns an indented copy of stderr output for a death test.
-// This makes distinguishing death test output lines from regular log lines
-// much easier.
-static ::std::string FormatDeathTestOutput(const ::std::string& output) {
-  ::std::string ret;
-  for (size_t at = 0; ; ) {
-    const size_t line_end = output.find('\n', at);
-    ret += "[  DEATH   ] ";
-    if (line_end == ::std::string::npos) {
-      ret += output.substr(at);
-      break;
-    }
-    ret += output.substr(at, line_end + 1 - at);
-    at = line_end + 1;
-  }
-  return ret;
-}
-
-// Assesses the success or failure of a death test, using both private
-// members which have previously been set, and one argument:
-//
-// Private data members:
-//   outcome:  An enumeration describing how the death test
-//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
-//             fails in the latter three cases.
-//   status:   The exit status of the child process. On *nix, it is in the
-//             in the format specified by wait(2). On Windows, this is the
-//             value supplied to the ExitProcess() API or a numeric code
-//             of the exception that terminated the program.
-//   regex:    A regular expression object to be applied to
-//             the test's captured standard error output; the death test
-//             fails if it does not match.
-//
-// Argument:
-//   status_ok: true if exit_status is acceptable in the context of
-//              this particular death test, which fails if it is false
-//
-// Returns true iff all of the above conditions are met.  Otherwise, the
-// first failing condition, in the order given above, is the one that is
-// reported. Also sets the last death test message string.
-bool DeathTestImpl::Passed(bool status_ok) {
-  if (!spawned())
-    return false;
-
-  const String error_message = GetCapturedStderr();
-
-  bool success = false;
-  Message buffer;
-
-  buffer << "Death test: " << statement() << "\n";
-  switch (outcome()) {
-    case LIVED:
-      buffer << "    Result: failed to die.\n"
-             << " Error msg:\n" << FormatDeathTestOutput(error_message);
-      break;
-    case THREW:
-      buffer << "    Result: threw an exception.\n"
-             << " Error msg:\n" << FormatDeathTestOutput(error_message);
-      break;
-    case RETURNED:
-      buffer << "    Result: illegal return in test statement.\n"
-             << " Error msg:\n" << FormatDeathTestOutput(error_message);
-      break;
-    case DIED:
-      if (status_ok) {
-        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
-        if (matched) {
-          success = true;
-        } else {
-          buffer << "    Result: died but not with expected error.\n"
-                 << "  Expected: " << regex()->pattern() << "\n"
-                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
-        }
-      } else {
-        buffer << "    Result: died but not with expected exit code:\n"
-               << "            " << ExitSummary(status()) << "\n"
-               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
-      }
-      break;
-    case IN_PROGRESS:
-    default:
-      GTEST_LOG_(FATAL)
-          << "DeathTest::Passed somehow called before conclusion of test";
-  }
-
-  DeathTest::set_last_death_test_message(buffer.GetString());
-  return success;
-}
-
-# if GTEST_OS_WINDOWS
-// WindowsDeathTest implements death tests on Windows. Due to the
-// specifics of starting new processes on Windows, death tests there are
-// always threadsafe, and Google Test considers the
-// --gtest_death_test_style=fast setting to be equivalent to
-// --gtest_death_test_style=threadsafe there.
-//
-// A few implementation notes:  Like the Linux version, the Windows
-// implementation uses pipes for child-to-parent communication. But due to
-// the specifics of pipes on Windows, some extra steps are required:
-//
-// 1. The parent creates a communication pipe and stores handles to both
-//    ends of it.
-// 2. The parent starts the child and provides it with the information
-//    necessary to acquire the handle to the write end of the pipe.
-// 3. The child acquires the write end of the pipe and signals the parent
-//    using a Windows event.
-// 4. Now the parent can release the write end of the pipe on its side. If
-//    this is done before step 3, the object's reference count goes down to
-//    0 and it is destroyed, preventing the child from acquiring it. The
-//    parent now has to release it, or read operations on the read end of
-//    the pipe will not return when the child terminates.
-// 5. The parent reads child's output through the pipe (outcome code and
-//    any possible error messages) from the pipe, and its stderr and then
-//    determines whether to fail the test.
-//
-// Note: to distinguish Win32 API calls from the local method and function
-// calls, the former are explicitly resolved in the global namespace.
-//
-class WindowsDeathTest : public DeathTestImpl {
- public:
-  WindowsDeathTest(const char* a_statement,
-                   const RE* a_regex,
-                   const char* file,
-                   int line)
-      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
-
-  // All of these virtual functions are inherited from DeathTest.
-  virtual int Wait();
-  virtual TestRole AssumeRole();
-
- private:
-  // The name of the file in which the death test is located.
-  const char* const file_;
-  // The line number on which the death test is located.
-  const int line_;
-  // Handle to the write end of the pipe to the child process.
-  AutoHandle write_handle_;
-  // Child process handle.
-  AutoHandle child_handle_;
-  // Event the child process uses to signal the parent that it has
-  // acquired the handle to the write end of the pipe. After seeing this
-  // event the parent can release its own handles to make sure its
-  // ReadFile() calls return when the child terminates.
-  AutoHandle event_handle_;
-};
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists.  As a side effect, sets the
-// outcome data member.
-int WindowsDeathTest::Wait() {
-  if (!spawned())
-    return 0;
-
-  // Wait until the child either signals that it has acquired the write end
-  // of the pipe or it dies.
-  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
-  switch (::WaitForMultipleObjects(2,
-                                   wait_handles,
-                                   FALSE,  // Waits for any of the handles.
-                                   INFINITE)) {
-    case WAIT_OBJECT_0:
-    case WAIT_OBJECT_0 + 1:
-      break;
-    default:
-      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
-  }
-
-  // The child has acquired the write end of the pipe or exited.
-  // We release the handle on our side and continue.
-  write_handle_.Reset();
-  event_handle_.Reset();
-
-  ReadAndInterpretStatusByte();
-
-  // Waits for the child process to exit if it haven't already. This
-  // returns immediately if the child has already exited, regardless of
-  // whether previous calls to WaitForMultipleObjects synchronized on this
-  // handle or not.
-  GTEST_DEATH_TEST_CHECK_(
-      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
-                                             INFINITE));
-  DWORD status_code;
-  GTEST_DEATH_TEST_CHECK_(
-      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
-  child_handle_.Reset();
-  set_status(static_cast<int>(status_code));
-  return status();
-}
-
-// The AssumeRole process for a Windows death test.  It creates a child
-// process with the same executable as the current process to run the
-// death test.  The child process is given the --gtest_filter and
-// --gtest_internal_run_death_test flags such that it knows to run the
-// current death test only.
-DeathTest::TestRole WindowsDeathTest::AssumeRole() {
-  const UnitTestImpl* const impl = GetUnitTestImpl();
-  const InternalRunDeathTestFlag* const flag =
-      impl->internal_run_death_test_flag();
-  const TestInfo* const info = impl->current_test_info();
-  const int death_test_index = info->result()->death_test_count();
-
-  if (flag != NULL) {
-    // ParseInternalRunDeathTestFlag() has performed all the necessary
-    // processing.
-    set_write_fd(flag->write_fd());
-    return EXECUTE_TEST;
-  }
-
-  // WindowsDeathTest uses an anonymous pipe to communicate results of
-  // a death test.
-  SECURITY_ATTRIBUTES handles_are_inheritable = {
-    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
-  HANDLE read_handle, write_handle;
-  GTEST_DEATH_TEST_CHECK_(
-      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
-                   0)  // Default buffer size.
-      != FALSE);
-  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
-                                O_RDONLY));
-  write_handle_.Reset(write_handle);
-  event_handle_.Reset(::CreateEvent(
-      &handles_are_inheritable,
-      TRUE,    // The event will automatically reset to non-signaled state.
-      FALSE,   // The initial state is non-signalled.
-      NULL));  // The even is unnamed.
-  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
-  const String filter_flag = String::Format("--%s%s=%s.%s",
-                                            GTEST_FLAG_PREFIX_, kFilterFlag,
-                                            info->test_case_name(),
-                                            info->name());
-  const String internal_flag = String::Format(
-    "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
-      GTEST_FLAG_PREFIX_,
-      kInternalRunDeathTestFlag,
-      file_, line_,
-      death_test_index,
-      static_cast<unsigned int>(::GetCurrentProcessId()),
-      // size_t has the same with as pointers on both 32-bit and 64-bit
-      // Windows platforms.
-      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
-      reinterpret_cast<size_t>(write_handle),
-      reinterpret_cast<size_t>(event_handle_.Get()));
-
-  char executable_path[_MAX_PATH + 1];  // NOLINT
-  GTEST_DEATH_TEST_CHECK_(
-      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
-                                            executable_path,
-                                            _MAX_PATH));
-
-  String command_line = String::Format("%s %s \"%s\"",
-                                       ::GetCommandLineA(),
-                                       filter_flag.c_str(),
-                                       internal_flag.c_str());
-
-  DeathTest::set_last_death_test_message("");
-
-  CaptureStderr();
-  // Flush the log buffers since the log streams are shared with the child.
-  FlushInfoLog();
-
-  // The child process will share the standard handles with the parent.
-  STARTUPINFOA startup_info;
-  memset(&startup_info, 0, sizeof(STARTUPINFO));
-  startup_info.dwFlags = STARTF_USESTDHANDLES;
-  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
-  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
-  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
-
-  PROCESS_INFORMATION process_info;
-  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
-      executable_path,
-      const_cast<char*>(command_line.c_str()),
-      NULL,   // Retuned process handle is not inheritable.
-      NULL,   // Retuned thread handle is not inheritable.
-      TRUE,   // Child inherits all inheritable handles (for write_handle_).
-      0x0,    // Default creation flags.
-      NULL,   // Inherit the parent's environment.
-      UnitTest::GetInstance()->original_working_dir(),
-      &startup_info,
-      &process_info) != FALSE);
-  child_handle_.Reset(process_info.hProcess);
-  ::CloseHandle(process_info.hThread);
-  set_spawned(true);
-  return OVERSEE_TEST;
-}
-# else  // We are not on Windows.
-
-// ForkingDeathTest provides implementations for most of the abstract
-// methods of the DeathTest interface.  Only the AssumeRole method is
-// left undefined.
-class ForkingDeathTest : public DeathTestImpl {
- public:
-  ForkingDeathTest(const char* statement, const RE* regex);
-
-  // All of these virtual functions are inherited from DeathTest.
-  virtual int Wait();
-
- protected:
-  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
-
- private:
-  // PID of child process during death test; 0 in the child process itself.
-  pid_t child_pid_;
-};
-
-// Constructs a ForkingDeathTest.
-ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
-    : DeathTestImpl(a_statement, a_regex),
-      child_pid_(-1) {}
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists.  As a side effect, sets the
-// outcome data member.
-int ForkingDeathTest::Wait() {
-  if (!spawned())
-    return 0;
-
-  ReadAndInterpretStatusByte();
-
-  int status_value;
-  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
-  set_status(status_value);
-  return status_value;
-}
-
-// A concrete death test class that forks, then immediately runs the test
-// in the child process.
-class NoExecDeathTest : public ForkingDeathTest {
- public:
-  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
-      ForkingDeathTest(a_statement, a_regex) { }
-  virtual TestRole AssumeRole();
-};
-
-// The AssumeRole process for a fork-and-run death test.  It implements a
-// straightforward fork, with a simple pipe to transmit the status byte.
-DeathTest::TestRole NoExecDeathTest::AssumeRole() {
-  const size_t thread_count = GetThreadCount();
-  if (thread_count != 1) {
-    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
-  }
-
-  int pipe_fd[2];
-  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
-
-  DeathTest::set_last_death_test_message("");
-  CaptureStderr();
-  // When we fork the process below, the log file buffers are copied, but the
-  // file descriptors are shared.  We flush all log files here so that closing
-  // the file descriptors in the child process doesn't throw off the
-  // synchronization between descriptors and buffers in the parent process.
-  // This is as close to the fork as possible to avoid a race condition in case
-  // there are multiple threads running before the death test, and another
-  // thread writes to the log file.
-  FlushInfoLog();
-
-  const pid_t child_pid = fork();
-  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
-  set_child_pid(child_pid);
-  if (child_pid == 0) {
-    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
-    set_write_fd(pipe_fd[1]);
-    // Redirects all logging to stderr in the child process to prevent
-    // concurrent writes to the log files.  We capture stderr in the parent
-    // process and append the child process' output to a log.
-    LogToStderr();
-    // Event forwarding to the listeners of event listener API mush be shut
-    // down in death test subprocesses.
-    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
-    return EXECUTE_TEST;
-  } else {
-    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
-    set_read_fd(pipe_fd[0]);
-    set_spawned(true);
-    return OVERSEE_TEST;
-  }
-}
-
-// A concrete death test class that forks and re-executes the main
-// program from the beginning, with command-line flags set that cause
-// only this specific death test to be run.
-class ExecDeathTest : public ForkingDeathTest {
- public:
-  ExecDeathTest(const char* a_statement, const RE* a_regex,
-                const char* file, int line) :
-      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
-  virtual TestRole AssumeRole();
- private:
-  // The name of the file in which the death test is located.
-  const char* const file_;
-  // The line number on which the death test is located.
-  const int line_;
-};
-
-// Utility class for accumulating command-line arguments.
-class Arguments {
- public:
-  Arguments() {
-    args_.push_back(NULL);
-  }
-
-  ~Arguments() {
-    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
-         ++i) {
-      free(*i);
-    }
-  }
-  void AddArgument(const char* argument) {
-    args_.insert(args_.end() - 1, posix::StrDup(argument));
-  }
-
-  template <typename Str>
-  void AddArguments(const ::std::vector<Str>& arguments) {
-    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
-         i != arguments.end();
-         ++i) {
-      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
-    }
-  }
-  char* const* Argv() {
-    return &args_[0];
-  }
- private:
-  std::vector<char*> args_;
-};
-
-// A struct that encompasses the arguments to the child process of a
-// threadsafe-style death test process.
-struct ExecDeathTestArgs {
-  char* const* argv;  // Command-line arguments for the child's call to exec
-  int close_fd;       // File descriptor to close; the read end of a pipe
-};
-
-#  if GTEST_OS_MAC
-inline char** GetEnviron() {
-  // When Google Test is built as a framework on MacOS X, the environ variable
-  // is unavailable. Apple's documentation (man environ) recommends using
-  // _NSGetEnviron() instead.
-  return *_NSGetEnviron();
-}
-#  else
-// Some POSIX platforms expect you to declare environ. extern "C" makes
-// it reside in the global namespace.
-extern "C" char** environ;
-inline char** GetEnviron() { return environ; }
-#  endif  // GTEST_OS_MAC
-
-// The main function for a threadsafe-style death test child process.
-// This function is called in a clone()-ed process and thus must avoid
-// any potentially unsafe operations like malloc or libc functions.
-static int ExecDeathTestChildMain(void* child_arg) {
-  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
-  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
-
-  // We need to execute the test program in the same environment where
-  // it was originally invoked.  Therefore we change to the original
-  // working directory first.
-  const char* const original_dir =
-      UnitTest::GetInstance()->original_working_dir();
-  // We can safely call chdir() as it's a direct system call.
-  if (chdir(original_dir) != 0) {
-    DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
-                                  original_dir,
-                                  GetLastErrnoDescription().c_str()));
-    return EXIT_FAILURE;
-  }
-
-  // We can safely call execve() as it's a direct system call.  We
-  // cannot use execvp() as it's a libc function and thus potentially
-  // unsafe.  Since execve() doesn't search the PATH, the user must
-  // invoke the test program via a valid path that contains at least
-  // one path separator.
-  execve(args->argv[0], args->argv, GetEnviron());
-  DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
-                                args->argv[0],
-                                original_dir,
-                                GetLastErrnoDescription().c_str()));
-  return EXIT_FAILURE;
-}
-
-// Two utility routines that together determine the direction the stack
-// grows.
-// This could be accomplished more elegantly by a single recursive
-// function, but we want to guard against the unlikely possibility of
-// a smart compiler optimizing the recursion away.
-//
-// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
-// StackLowerThanAddress into StackGrowsDown, which then doesn't give
-// correct answer.
-bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
-bool StackLowerThanAddress(const void* ptr) {
-  int dummy;
-  return &dummy < ptr;
-}
-
-bool StackGrowsDown() {
-  int dummy;
-  return StackLowerThanAddress(&dummy);
-}
-
-// A threadsafe implementation of fork(2) for threadsafe-style death tests
-// that uses clone(2).  It dies with an error message if anything goes
-// wrong.
-static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
-  ExecDeathTestArgs args = { argv, close_fd };
-  pid_t child_pid = -1;
-
-#  if GTEST_HAS_CLONE
-  const bool use_fork = GTEST_FLAG(death_test_use_fork);
-
-  if (!use_fork) {
-    static const bool stack_grows_down = StackGrowsDown();
-    const size_t stack_size = getpagesize();
-    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
-    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
-                             MAP_ANON | MAP_PRIVATE, -1, 0);
-    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
-    void* const stack_top =
-        static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
-
-    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
-
-    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
-  }
-#  else
-  const bool use_fork = true;
-#  endif  // GTEST_HAS_CLONE
-
-  if (use_fork && (child_pid = fork()) == 0) {
-      ExecDeathTestChildMain(&args);
-      _exit(0);
-  }
-
-  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
-  return child_pid;
-}
-
-// The AssumeRole process for a fork-and-exec death test.  It re-executes the
-// main program from the beginning, setting the --gtest_filter
-// and --gtest_internal_run_death_test flags to cause only the current
-// death test to be re-run.
-DeathTest::TestRole ExecDeathTest::AssumeRole() {
-  const UnitTestImpl* const impl = GetUnitTestImpl();
-  const InternalRunDeathTestFlag* const flag =
-      impl->internal_run_death_test_flag();
-  const TestInfo* const info = impl->current_test_info();
-  const int death_test_index = info->result()->death_test_count();
-
-  if (flag != NULL) {
-    set_write_fd(flag->write_fd());
-    return EXECUTE_TEST;
-  }
-
-  int pipe_fd[2];
-  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
-  // Clear the close-on-exec flag on the write end of the pipe, lest
-  // it be closed when the child process does an exec:
-  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
-
-  const String filter_flag =
-      String::Format("--%s%s=%s.%s",
-                     GTEST_FLAG_PREFIX_, kFilterFlag,
-                     info->test_case_name(), info->name());
-  const String internal_flag =
-      String::Format("--%s%s=%s|%d|%d|%d",
-                     GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
-                     file_, line_, death_test_index, pipe_fd[1]);
-  Arguments args;
-  args.AddArguments(GetArgvs());
-  args.AddArgument(filter_flag.c_str());
-  args.AddArgument(internal_flag.c_str());
-
-  DeathTest::set_last_death_test_message("");
-
-  CaptureStderr();
-  // See the comment in NoExecDeathTest::AssumeRole for why the next line
-  // is necessary.
-  FlushInfoLog();
-
-  const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
-  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
-  set_child_pid(child_pid);
-  set_read_fd(pipe_fd[0]);
-  set_spawned(true);
-  return OVERSEE_TEST;
-}
-
-# endif  // !GTEST_OS_WINDOWS
-
-// Creates a concrete DeathTest-derived class that depends on the
-// --gtest_death_test_style flag, and sets the pointer pointed to
-// by the "test" argument to its address.  If the test should be
-// skipped, sets that pointer to NULL.  Returns true, unless the
-// flag is set to an invalid value.
-bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
-                                     const char* file, int line,
-                                     DeathTest** test) {
-  UnitTestImpl* const impl = GetUnitTestImpl();
-  const InternalRunDeathTestFlag* const flag =
-      impl->internal_run_death_test_flag();
-  const int death_test_index = impl->current_test_info()
-      ->increment_death_test_count();
-
-  if (flag != NULL) {
-    if (death_test_index > flag->index()) {
-      DeathTest::set_last_death_test_message(String::Format(
-          "Death test count (%d) somehow exceeded expected maximum (%d)",
-          death_test_index, flag->index()));
-      return false;
-    }
-
-    if (!(flag->file() == file && flag->line() == line &&
-          flag->index() == death_test_index)) {
-      *test = NULL;
-      return true;
-    }
-  }
-
-# if GTEST_OS_WINDOWS
-
-  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
-      GTEST_FLAG(death_test_style) == "fast") {
-    *test = new WindowsDeathTest(statement, regex, file, line);
-  }
-
-# else
-
-  if (GTEST_FLAG(death_test_style) == "threadsafe") {
-    *test = new ExecDeathTest(statement, regex, file, line);
-  } else if (GTEST_FLAG(death_test_style) == "fast") {
-    *test = new NoExecDeathTest(statement, regex);
-  }
-
-# endif  // GTEST_OS_WINDOWS
-
-  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
-    DeathTest::set_last_death_test_message(String::Format(
-        "Unknown death test style \"%s\" encountered",
-        GTEST_FLAG(death_test_style).c_str()));
-    return false;
-  }
-
-  return true;
-}
-
-// Splits a given string on a given delimiter, populating a given
-// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
-// ::std::string, so we can use it here.
-static void SplitString(const ::std::string& str, char delimiter,
-                        ::std::vector< ::std::string>* dest) {
-  ::std::vector< ::std::string> parsed;
-  ::std::string::size_type pos = 0;
-  while (::testing::internal::AlwaysTrue()) {
-    const ::std::string::size_type colon = str.find(delimiter, pos);
-    if (colon == ::std::string::npos) {
-      parsed.push_back(str.substr(pos));
-      break;
-    } else {
-      parsed.push_back(str.substr(pos, colon - pos));
-      pos = colon + 1;
-    }
-  }
-  dest->swap(parsed);
-}
-
-# if GTEST_OS_WINDOWS
-// Recreates the pipe and event handles from the provided parameters,
-// signals the event, and returns a file descriptor wrapped around the pipe
-// handle. This function is called in the child process only.
-int GetStatusFileDescriptor(unsigned int parent_process_id,
-                            size_t write_handle_as_size_t,
-                            size_t event_handle_as_size_t) {
-  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
-                                                   FALSE,  // Non-inheritable.
-                                                   parent_process_id));
-  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
-    DeathTestAbort(String::Format("Unable to open parent process %u",
-                                  parent_process_id));
-  }
-
-  // TODO(vladl at google.com): Replace the following check with a
-  // compile-time assertion when available.
-  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
-
-  const HANDLE write_handle =
-      reinterpret_cast<HANDLE>(write_handle_as_size_t);
-  HANDLE dup_write_handle;
-
-  // The newly initialized handle is accessible only in in the parent
-  // process. To obtain one accessible within the child, we need to use
-  // DuplicateHandle.
-  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
-                         ::GetCurrentProcess(), &dup_write_handle,
-                         0x0,    // Requested privileges ignored since
-                                 // DUPLICATE_SAME_ACCESS is used.
-                         FALSE,  // Request non-inheritable handler.
-                         DUPLICATE_SAME_ACCESS)) {
-    DeathTestAbort(String::Format(
-        "Unable to duplicate the pipe handle %Iu from the parent process %u",
-        write_handle_as_size_t, parent_process_id));
-  }
-
-  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
-  HANDLE dup_event_handle;
-
-  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
-                         ::GetCurrentProcess(), &dup_event_handle,
-                         0x0,
-                         FALSE,
-                         DUPLICATE_SAME_ACCESS)) {
-    DeathTestAbort(String::Format(
-        "Unable to duplicate the event handle %Iu from the parent process %u",
-        event_handle_as_size_t, parent_process_id));
-  }
-
-  const int write_fd =
-      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
-  if (write_fd == -1) {
-    DeathTestAbort(String::Format(
-        "Unable to convert pipe handle %Iu to a file descriptor",
-        write_handle_as_size_t));
-  }
-
-  // Signals the parent that the write end of the pipe has been acquired
-  // so the parent can release its own write end.
-  ::SetEvent(dup_event_handle);
-
-  return write_fd;
-}
-# endif  // GTEST_OS_WINDOWS
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
-  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
-
-  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
-  // can use it here.
-  int line = -1;
-  int index = -1;
-  ::std::vector< ::std::string> fields;
-  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
-  int write_fd = -1;
-
-# if GTEST_OS_WINDOWS
-
-  unsigned int parent_process_id = 0;
-  size_t write_handle_as_size_t = 0;
-  size_t event_handle_as_size_t = 0;
-
-  if (fields.size() != 6
-      || !ParseNaturalNumber(fields[1], &line)
-      || !ParseNaturalNumber(fields[2], &index)
-      || !ParseNaturalNumber(fields[3], &parent_process_id)
-      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
-      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
-    DeathTestAbort(String::Format(
-        "Bad --gtest_internal_run_death_test flag: %s",
-        GTEST_FLAG(internal_run_death_test).c_str()));
-  }
-  write_fd = GetStatusFileDescriptor(parent_process_id,
-                                     write_handle_as_size_t,
-                                     event_handle_as_size_t);
-# else
-
-  if (fields.size() != 4
-      || !ParseNaturalNumber(fields[1], &line)
-      || !ParseNaturalNumber(fields[2], &index)
-      || !ParseNaturalNumber(fields[3], &write_fd)) {
-    DeathTestAbort(String::Format(
-        "Bad --gtest_internal_run_death_test flag: %s",
-        GTEST_FLAG(internal_run_death_test).c_str()));
-  }
-
-# endif  // GTEST_OS_WINDOWS
-
-  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
-}
-
-}  // namespace internal
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-filepath.cc b/unit_tests/gtest/src/gtest-filepath.cc
deleted file mode 100644
index 91b2571..0000000
--- a/unit_tests/gtest/src/gtest-filepath.cc
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: keith.ray at gmail.com (Keith Ray)
-
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-port.h"
-
-#include <stdlib.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h>
-#elif GTEST_OS_WINDOWS
-# include <direct.h>
-# include <io.h>
-#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL
-// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h
-# include <sys/syslimits.h>
-#else
-# include <limits.h>
-# include <climits>  // Some Linux distributions define PATH_MAX here.
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_MAX_ _MAX_PATH
-#elif defined(PATH_MAX)
-# define GTEST_PATH_MAX_ PATH_MAX
-#elif defined(_XOPEN_PATH_MAX)
-# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
-#else
-# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
-#endif  // GTEST_OS_WINDOWS
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-// On Windows, '\\' is the standard path separator, but many tools and the
-// Windows API also accept '/' as an alternate path separator. Unless otherwise
-// noted, a file path can contain either kind of path separators, or a mixture
-// of them.
-const char kPathSeparator = '\\';
-const char kAlternatePathSeparator = '/';
-const char kPathSeparatorString[] = "\\";
-const char kAlternatePathSeparatorString[] = "/";
-# if GTEST_OS_WINDOWS_MOBILE
-// Windows CE doesn't have a current directory. You should not use
-// the current directory in tests on Windows CE, but this at least
-// provides a reasonable fallback.
-const char kCurrentDirectoryString[] = "\\";
-// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
-const DWORD kInvalidFileAttributes = 0xffffffff;
-# else
-const char kCurrentDirectoryString[] = ".\\";
-# endif  // GTEST_OS_WINDOWS_MOBILE
-#else
-const char kPathSeparator = '/';
-const char kPathSeparatorString[] = "/";
-const char kCurrentDirectoryString[] = "./";
-#endif  // GTEST_OS_WINDOWS
-
-// Returns whether the given character is a valid path separator.
-static bool IsPathSeparator(char c) {
-#if GTEST_HAS_ALT_PATH_SEP_
-  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
-#else
-  return c == kPathSeparator;
-#endif
-}
-
-// Returns the current working directory, or "" if unsuccessful.
-FilePath FilePath::GetCurrentDir() {
-#if GTEST_OS_WINDOWS_MOBILE
-  // Windows CE doesn't have a current directory, so we just return
-  // something reasonable.
-  return FilePath(kCurrentDirectoryString);
-#elif GTEST_OS_WINDOWS
-  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
-  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#else
-  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
-  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#endif  // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns a copy of the FilePath with the case-insensitive extension removed.
-// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
-// FilePath("dir/file"). If a case-insensitive extension is not
-// found, returns a copy of the original FilePath.
-FilePath FilePath::RemoveExtension(const char* extension) const {
-  String dot_extension(String::Format(".%s", extension));
-  if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
-    return FilePath(String(pathname_.c_str(), pathname_.length() - 4));
-  }
-  return *this;
-}
-
-// Returns a pointer to the last occurence of a valid path separator in
-// the FilePath. On Windows, for example, both '/' and '\' are valid path
-// separators. Returns NULL if no path separator was found.
-const char* FilePath::FindLastPathSeparator() const {
-  const char* const last_sep = strrchr(c_str(), kPathSeparator);
-#if GTEST_HAS_ALT_PATH_SEP_
-  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
-  // Comparing two pointers of which only one is NULL is undefined.
-  if (last_alt_sep != NULL &&
-      (last_sep == NULL || last_alt_sep > last_sep)) {
-    return last_alt_sep;
-  }
-#endif
-  return last_sep;
-}
-
-// Returns a copy of the FilePath with the directory part removed.
-// Example: FilePath("path/to/file").RemoveDirectoryName() returns
-// FilePath("file"). If there is no directory part ("just_a_file"), it returns
-// the FilePath unmodified. If there is no file part ("just_a_dir/") it
-// returns an empty FilePath ("").
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveDirectoryName() const {
-  const char* const last_sep = FindLastPathSeparator();
-  return last_sep ? FilePath(String(last_sep + 1)) : *this;
-}
-
-// RemoveFileName returns the directory path with the filename removed.
-// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
-// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
-// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
-// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveFileName() const {
-  const char* const last_sep = FindLastPathSeparator();
-  String dir;
-  if (last_sep) {
-    dir = String(c_str(), last_sep + 1 - c_str());
-  } else {
-    dir = kCurrentDirectoryString;
-  }
-  return FilePath(dir);
-}
-
-// Helper functions for naming files in a directory for xml output.
-
-// Given directory = "dir", base_name = "test", number = 0,
-// extension = "xml", returns "dir/test.xml". If number is greater
-// than zero (e.g., 12), returns "dir/test_12.xml".
-// On Windows platform, uses \ as the separator rather than /.
-FilePath FilePath::MakeFileName(const FilePath& directory,
-                                const FilePath& base_name,
-                                int number,
-                                const char* extension) {
-  String file;
-  if (number == 0) {
-    file = String::Format("%s.%s", base_name.c_str(), extension);
-  } else {
-    file = String::Format("%s_%d.%s", base_name.c_str(), number, extension);
-  }
-  return ConcatPaths(directory, FilePath(file));
-}
-
-// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
-// On Windows, uses \ as the separator rather than /.
-FilePath FilePath::ConcatPaths(const FilePath& directory,
-                               const FilePath& relative_path) {
-  if (directory.IsEmpty())
-    return relative_path;
-  const FilePath dir(directory.RemoveTrailingPathSeparator());
-  return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
-                                 relative_path.c_str()));
-}
-
-// Returns true if pathname describes something findable in the file-system,
-// either a file, directory, or whatever.
-bool FilePath::FileOrDirectoryExists() const {
-#if GTEST_OS_WINDOWS_MOBILE
-  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
-  const DWORD attributes = GetFileAttributes(unicode);
-  delete [] unicode;
-  return attributes != kInvalidFileAttributes;
-#else
-  posix::StatStruct file_stat;
-  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
-#endif  // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns true if pathname describes a directory in the file-system
-// that exists.
-bool FilePath::DirectoryExists() const {
-  bool result = false;
-#if GTEST_OS_WINDOWS
-  // Don't strip off trailing separator if path is a root directory on
-  // Windows (like "C:\\").
-  const FilePath& path(IsRootDirectory() ? *this :
-                                           RemoveTrailingPathSeparator());
-#else
-  const FilePath& path(*this);
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
-  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
-  const DWORD attributes = GetFileAttributes(unicode);
-  delete [] unicode;
-  if ((attributes != kInvalidFileAttributes) &&
-      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
-    result = true;
-  }
-#else
-  posix::StatStruct file_stat;
-  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
-      posix::IsDir(file_stat);
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-  return result;
-}
-
-// Returns true if pathname describes a root directory. (Windows has one
-// root directory per disk drive.)
-bool FilePath::IsRootDirectory() const {
-#if GTEST_OS_WINDOWS
-  // TODO(wan at google.com): on Windows a network share like
-  // \\server\share can be a root directory, although it cannot be the
-  // current directory.  Handle this properly.
-  return pathname_.length() == 3 && IsAbsolutePath();
-#else
-  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
-#endif
-}
-
-// Returns true if pathname describes an absolute path.
-bool FilePath::IsAbsolutePath() const {
-  const char* const name = pathname_.c_str();
-#if GTEST_OS_WINDOWS
-  return pathname_.length() >= 3 &&
-     ((name[0] >= 'a' && name[0] <= 'z') ||
-      (name[0] >= 'A' && name[0] <= 'Z')) &&
-     name[1] == ':' &&
-     IsPathSeparator(name[2]);
-#else
-  return IsPathSeparator(name[0]);
-#endif
-}
-
-// Returns a pathname for a file that does not currently exist. The pathname
-// will be directory/base_name.extension or
-// directory/base_name_<number>.extension if directory/base_name.extension
-// already exists. The number will be incremented until a pathname is found
-// that does not already exist.
-// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
-// There could be a race condition if two or more processes are calling this
-// function at the same time -- they could both pick the same filename.
-FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
-                                          const FilePath& base_name,
-                                          const char* extension) {
-  FilePath full_pathname;
-  int number = 0;
-  do {
-    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
-  } while (full_pathname.FileOrDirectoryExists());
-  return full_pathname;
-}
-
-// Returns true if FilePath ends with a path separator, which indicates that
-// it is intended to represent a directory. Returns false otherwise.
-// This does NOT check that a directory (or file) actually exists.
-bool FilePath::IsDirectory() const {
-  return !pathname_.empty() &&
-         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
-}
-
-// Create directories so that path exists. Returns true if successful or if
-// the directories already exist; returns false if unable to create directories
-// for any reason.
-bool FilePath::CreateDirectoriesRecursively() const {
-  if (!this->IsDirectory()) {
-    return false;
-  }
-
-  if (pathname_.length() == 0 || this->DirectoryExists()) {
-    return true;
-  }
-
-  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
-  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
-}
-
-// Create the directory so that path exists. Returns true if successful or
-// if the directory already exists; returns false if unable to create the
-// directory for any reason, including if the parent directory does not
-// exist. Not named "CreateDirectory" because that's a macro on Windows.
-bool FilePath::CreateFolder() const {
-#if GTEST_OS_WINDOWS_MOBILE
-  FilePath removed_sep(this->RemoveTrailingPathSeparator());
-  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
-  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
-  delete [] unicode;
-#elif GTEST_OS_WINDOWS
-  int result = _mkdir(pathname_.c_str());
-#else
-  int result = mkdir(pathname_.c_str(), 0777);
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-  if (result == -1) {
-    return this->DirectoryExists();  // An error is OK if the directory exists.
-  }
-  return true;  // No error.
-}
-
-// If input name has a trailing separator character, remove it and return the
-// name, otherwise return the name string unmodified.
-// On Windows platform, uses \ as the separator, other platforms use /.
-FilePath FilePath::RemoveTrailingPathSeparator() const {
-  return IsDirectory()
-      ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))
-      : *this;
-}
-
-// Removes any redundant separators that might be in the pathname.
-// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
-// redundancies that might be in a pathname involving "." or "..".
-// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
-void FilePath::Normalize() {
-  if (pathname_.c_str() == NULL) {
-    pathname_ = "";
-    return;
-  }
-  const char* src = pathname_.c_str();
-  char* const dest = new char[pathname_.length() + 1];
-  char* dest_ptr = dest;
-  memset(dest_ptr, 0, pathname_.length() + 1);
-
-  while (*src != '\0') {
-    *dest_ptr = *src;
-    if (!IsPathSeparator(*src)) {
-      src++;
-    } else {
-#if GTEST_HAS_ALT_PATH_SEP_
-      if (*dest_ptr == kAlternatePathSeparator) {
-        *dest_ptr = kPathSeparator;
-      }
-#endif
-      while (IsPathSeparator(*src))
-        src++;
-    }
-    dest_ptr++;
-  }
-  *dest_ptr = '\0';
-  pathname_ = dest;
-  delete[] dest;
-}
-
-}  // namespace internal
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-internal-inl.h b/unit_tests/gtest/src/gtest-internal-inl.h
deleted file mode 100644
index 65a2101..0000000
--- a/unit_tests/gtest/src/gtest-internal-inl.h
+++ /dev/null
@@ -1,1038 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Utility functions and classes used by the Google C++ testing framework.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// This file contains purely Google Test's internal implementation.  Please
-// DO NOT #INCLUDE IT IN A USER PROGRAM.
-
-#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
-#define GTEST_SRC_GTEST_INTERNAL_INL_H_
-
-// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
-// part of Google Test's implementation; otherwise it's undefined.
-#if !GTEST_IMPLEMENTATION_
-// A user is trying to include this from his code - just say no.
-# error "gtest-internal-inl.h is part of Google Test's internal implementation."
-# error "It must not be included except by Google Test itself."
-#endif  // GTEST_IMPLEMENTATION_
-
-#ifndef _WIN32_WCE
-# include <errno.h>
-#endif  // !_WIN32_WCE
-#include <stddef.h>
-#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
-#include <string.h>  // For memmove.
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_WINDOWS
-# include <windows.h>  // NOLINT
-#endif  // GTEST_OS_WINDOWS
-
-#include "gtest/gtest.h"  // NOLINT
-#include "gtest/gtest-spi.h"
-
-namespace testing {
-
-// Declares the flags.
-//
-// We don't want the users to modify this flag in the code, but want
-// Google Test's own unit tests to be able to access it. Therefore we
-// declare it here as opposed to in gtest.h.
-GTEST_DECLARE_bool_(death_test_use_fork);
-
-namespace internal {
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library.  This is solely for testing GetTestTypeId().
-GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
-const char kBreakOnFailureFlag[] = "break_on_failure";
-const char kCatchExceptionsFlag[] = "catch_exceptions";
-const char kColorFlag[] = "color";
-const char kFilterFlag[] = "filter";
-const char kListTestsFlag[] = "list_tests";
-const char kOutputFlag[] = "output";
-const char kPrintTimeFlag[] = "print_time";
-const char kRandomSeedFlag[] = "random_seed";
-const char kRepeatFlag[] = "repeat";
-const char kShuffleFlag[] = "shuffle";
-const char kStackTraceDepthFlag[] = "stack_trace_depth";
-const char kStreamResultToFlag[] = "stream_result_to";
-const char kThrowOnFailureFlag[] = "throw_on_failure";
-
-// A valid random seed must be in [1, kMaxRandomSeed].
-const int kMaxRandomSeed = 99999;
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-GTEST_API_ extern bool g_help_flag;
-
-// Returns the current time in milliseconds.
-GTEST_API_ TimeInMillis GetTimeInMillis();
-
-// Returns true iff Google Test should use colors in the output.
-GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
-
-// Formats the given time in milliseconds as seconds.
-GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
-
-// Parses a string for an Int32 flag, in the form of "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true.  On failure, returns false without changing *value.
-GTEST_API_ bool ParseInt32Flag(
-    const char* str, const char* flag, Int32* value);
-
-// Returns a random seed in range [1, kMaxRandomSeed] based on the
-// given --gtest_random_seed flag value.
-inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
-  const unsigned int raw_seed = (random_seed_flag == 0) ?
-      static_cast<unsigned int>(GetTimeInMillis()) :
-      static_cast<unsigned int>(random_seed_flag);
-
-  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
-  // it's easy to type.
-  const int normalized_seed =
-      static_cast<int>((raw_seed - 1U) %
-                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
-  return normalized_seed;
-}
-
-// Returns the first valid random seed after 'seed'.  The behavior is
-// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
-// considered to be 1.
-inline int GetNextRandomSeed(int seed) {
-  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
-      << "Invalid random seed " << seed << " - must be in [1, "
-      << kMaxRandomSeed << "].";
-  const int next_seed = seed + 1;
-  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
-}
-
-// This class saves the values of all Google Test flags in its c'tor, and
-// restores them in its d'tor.
-class GTestFlagSaver {
- public:
-  // The c'tor.
-  GTestFlagSaver() {
-    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
-    break_on_failure_ = GTEST_FLAG(break_on_failure);
-    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
-    color_ = GTEST_FLAG(color);
-    death_test_style_ = GTEST_FLAG(death_test_style);
-    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
-    filter_ = GTEST_FLAG(filter);
-    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
-    list_tests_ = GTEST_FLAG(list_tests);
-    output_ = GTEST_FLAG(output);
-    print_time_ = GTEST_FLAG(print_time);
-    random_seed_ = GTEST_FLAG(random_seed);
-    repeat_ = GTEST_FLAG(repeat);
-    shuffle_ = GTEST_FLAG(shuffle);
-    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
-    stream_result_to_ = GTEST_FLAG(stream_result_to);
-    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
-  }
-
-  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
-  ~GTestFlagSaver() {
-    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
-    GTEST_FLAG(break_on_failure) = break_on_failure_;
-    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
-    GTEST_FLAG(color) = color_;
-    GTEST_FLAG(death_test_style) = death_test_style_;
-    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
-    GTEST_FLAG(filter) = filter_;
-    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
-    GTEST_FLAG(list_tests) = list_tests_;
-    GTEST_FLAG(output) = output_;
-    GTEST_FLAG(print_time) = print_time_;
-    GTEST_FLAG(random_seed) = random_seed_;
-    GTEST_FLAG(repeat) = repeat_;
-    GTEST_FLAG(shuffle) = shuffle_;
-    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
-    GTEST_FLAG(stream_result_to) = stream_result_to_;
-    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
-  }
- private:
-  // Fields for saving the original values of flags.
-  bool also_run_disabled_tests_;
-  bool break_on_failure_;
-  bool catch_exceptions_;
-  String color_;
-  String death_test_style_;
-  bool death_test_use_fork_;
-  String filter_;
-  String internal_run_death_test_;
-  bool list_tests_;
-  String output_;
-  bool print_time_;
-  bool pretty_;
-  internal::Int32 random_seed_;
-  internal::Int32 repeat_;
-  bool shuffle_;
-  internal::Int32 stack_trace_depth_;
-  String stream_result_to_;
-  bool throw_on_failure_;
-} GTEST_ATTRIBUTE_UNUSED_;
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded();
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (e.g., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-GTEST_API_ bool ShouldShard(const char* total_shards_str,
-                            const char* shard_index_str,
-                            bool in_subprocess_for_death_test);
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error and
-// and aborts.
-GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-GTEST_API_ bool ShouldRunTestOnShard(
-    int total_shards, int shard_index, int test_id);
-
-// STL container utilities.
-
-// Returns the number of elements in the given container that satisfy
-// the given predicate.
-template <class Container, typename Predicate>
-inline int CountIf(const Container& c, Predicate predicate) {
-  // Implemented as an explicit loop since std::count_if() in libCstd on
-  // Solaris has a non-standard signature.
-  int count = 0;
-  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
-    if (predicate(*it))
-      ++count;
-  }
-  return count;
-}
-
-// Applies a function/functor to each element in the container.
-template <class Container, typename Functor>
-void ForEach(const Container& c, Functor functor) {
-  std::for_each(c.begin(), c.end(), functor);
-}
-
-// Returns the i-th element of the vector, or default_value if i is not
-// in range [0, v.size()).
-template <typename E>
-inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
-  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
-}
-
-// Performs an in-place shuffle of a range of the vector's elements.
-// 'begin' and 'end' are element indices as an STL-style range;
-// i.e. [begin, end) are shuffled, where 'end' == size() means to
-// shuffle to the end of the vector.
-template <typename E>
-void ShuffleRange(internal::Random* random, int begin, int end,
-                  std::vector<E>* v) {
-  const int size = static_cast<int>(v->size());
-  GTEST_CHECK_(0 <= begin && begin <= size)
-      << "Invalid shuffle range start " << begin << ": must be in range [0, "
-      << size << "].";
-  GTEST_CHECK_(begin <= end && end <= size)
-      << "Invalid shuffle range finish " << end << ": must be in range ["
-      << begin << ", " << size << "].";
-
-  // Fisher-Yates shuffle, from
-  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
-  for (int range_width = end - begin; range_width >= 2; range_width--) {
-    const int last_in_range = begin + range_width - 1;
-    const int selected = begin + random->Generate(range_width);
-    std::swap((*v)[selected], (*v)[last_in_range]);
-  }
-}
-
-// Performs an in-place shuffle of the vector's elements.
-template <typename E>
-inline void Shuffle(internal::Random* random, std::vector<E>* v) {
-  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
-}
-
-// A function for deleting an object.  Handy for being used as a
-// functor.
-template <typename T>
-static void Delete(T* x) {
-  delete x;
-}
-
-// A predicate that checks the key of a TestProperty against a known key.
-//
-// TestPropertyKeyIs is copyable.
-class TestPropertyKeyIs {
- public:
-  // Constructor.
-  //
-  // TestPropertyKeyIs has NO default constructor.
-  explicit TestPropertyKeyIs(const char* key)
-      : key_(key) {}
-
-  // Returns true iff the test name of test property matches on key_.
-  bool operator()(const TestProperty& test_property) const {
-    return String(test_property.key()).Compare(key_) == 0;
-  }
-
- private:
-  String key_;
-};
-
-// Class UnitTestOptions.
-//
-// This class contains functions for processing options the user
-// specifies when running the tests.  It has only static members.
-//
-// In most cases, the user can specify an option using either an
-// environment variable or a command line flag.  E.g. you can set the
-// test filter using either GTEST_FILTER or --gtest_filter.  If both
-// the variable and the flag are present, the latter overrides the
-// former.
-class GTEST_API_ UnitTestOptions {
- public:
-  // Functions for processing the gtest_output flag.
-
-  // Returns the output format, or "" for normal printed output.
-  static String GetOutputFormat();
-
-  // Returns the absolute path of the requested output file, or the
-  // default (test_detail.xml in the original working directory) if
-  // none was explicitly specified.
-  static String GetAbsolutePathToOutputFile();
-
-  // Functions for processing the gtest_filter flag.
-
-  // Returns true iff the wildcard pattern matches the string.  The
-  // first ':' or '\0' character in pattern marks the end of it.
-  //
-  // This recursive algorithm isn't very efficient, but is clear and
-  // works well enough for matching test names, which are short.
-  static bool PatternMatchesString(const char *pattern, const char *str);
-
-  // Returns true iff the user-specified filter matches the test case
-  // name and the test name.
-  static bool FilterMatchesTest(const String &test_case_name,
-                                const String &test_name);
-
-#if GTEST_OS_WINDOWS
-  // Function for supporting the gtest_catch_exception flag.
-
-  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
-  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
-  // This function is useful as an __except condition.
-  static int GTestShouldProcessSEH(DWORD exception_code);
-#endif  // GTEST_OS_WINDOWS
-
-  // Returns true if "name" matches the ':' separated list of glob-style
-  // filters in "filter".
-  static bool MatchesFilter(const String& name, const char* filter);
-};
-
-// Returns the current application's name, removing directory path if that
-// is present.  Used by UnitTestOptions::GetOutputFile.
-GTEST_API_ FilePath GetCurrentExecutableName();
-
-// The role interface for getting the OS stack trace as a string.
-class OsStackTraceGetterInterface {
- public:
-  OsStackTraceGetterInterface() {}
-  virtual ~OsStackTraceGetterInterface() {}
-
-  // Returns the current OS stack trace as a String.  Parameters:
-  //
-  //   max_depth  - the maximum number of stack frames to be included
-  //                in the trace.
-  //   skip_count - the number of top frames to be skipped; doesn't count
-  //                against max_depth.
-  virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
-
-  // UponLeavingGTest() should be called immediately before Google Test calls
-  // user code. It saves some information about the current stack that
-  // CurrentStackTrace() will use to find and hide Google Test stack frames.
-  virtual void UponLeavingGTest() = 0;
-
- private:
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
-};
-
-// A working implementation of the OsStackTraceGetterInterface interface.
-class OsStackTraceGetter : public OsStackTraceGetterInterface {
- public:
-  OsStackTraceGetter() : caller_frame_(NULL) {}
-  virtual String CurrentStackTrace(int max_depth, int skip_count);
-  virtual void UponLeavingGTest();
-
-  // This string is inserted in place of stack frames that are part of
-  // Google Test's implementation.
-  static const char* const kElidedFramesMarker;
-
- private:
-  Mutex mutex_;  // protects all internal state
-
-  // We save the stack frame below the frame that calls user code.
-  // We do this because the address of the frame immediately below
-  // the user code changes between the call to UponLeavingGTest()
-  // and any calls to CurrentStackTrace() from within the user code.
-  void* caller_frame_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
-};
-
-// Information about a Google Test trace point.
-struct TraceInfo {
-  const char* file;
-  int line;
-  String message;
-};
-
-// This is the default global test part result reporter used in UnitTestImpl.
-// This class should only be used by UnitTestImpl.
-class DefaultGlobalTestPartResultReporter
-  : public TestPartResultReporterInterface {
- public:
-  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
-  // Implements the TestPartResultReporterInterface. Reports the test part
-  // result in the current test.
-  virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
-  UnitTestImpl* const unit_test_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
-};
-
-// This is the default per thread test part result reporter used in
-// UnitTestImpl. This class should only be used by UnitTestImpl.
-class DefaultPerThreadTestPartResultReporter
-    : public TestPartResultReporterInterface {
- public:
-  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
-  // Implements the TestPartResultReporterInterface. The implementation just
-  // delegates to the current global test part result reporter of *unit_test_.
-  virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
-  UnitTestImpl* const unit_test_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
-};
-
-// The private implementation of the UnitTest class.  We don't protect
-// the methods under a mutex, as this class is not accessible by a
-// user and the UnitTest class that delegates work to this class does
-// proper locking.
-class GTEST_API_ UnitTestImpl {
- public:
-  explicit UnitTestImpl(UnitTest* parent);
-  virtual ~UnitTestImpl();
-
-  // There are two different ways to register your own TestPartResultReporter.
-  // You can register your own repoter to listen either only for test results
-  // from the current thread or for results from all threads.
-  // By default, each per-thread test result repoter just passes a new
-  // TestPartResult to the global test result reporter, which registers the
-  // test part result for the currently running test.
-
-  // Returns the global test part result reporter.
-  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
-
-  // Sets the global test part result reporter.
-  void SetGlobalTestPartResultReporter(
-      TestPartResultReporterInterface* reporter);
-
-  // Returns the test part result reporter for the current thread.
-  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
-
-  // Sets the test part result reporter for the current thread.
-  void SetTestPartResultReporterForCurrentThread(
-      TestPartResultReporterInterface* reporter);
-
-  // Gets the number of successful test cases.
-  int successful_test_case_count() const;
-
-  // Gets the number of failed test cases.
-  int failed_test_case_count() const;
-
-  // Gets the number of all test cases.
-  int total_test_case_count() const;
-
-  // Gets the number of all test cases that contain at least one test
-  // that should run.
-  int test_case_to_run_count() const;
-
-  // Gets the number of successful tests.
-  int successful_test_count() const;
-
-  // Gets the number of failed tests.
-  int failed_test_count() const;
-
-  // Gets the number of disabled tests.
-  int disabled_test_count() const;
-
-  // Gets the number of all tests.
-  int total_test_count() const;
-
-  // Gets the number of tests that should run.
-  int test_to_run_count() const;
-
-  // Gets the elapsed time, in milliseconds.
-  TimeInMillis elapsed_time() const { return elapsed_time_; }
-
-  // Returns true iff the unit test passed (i.e. all test cases passed).
-  bool Passed() const { return !Failed(); }
-
-  // Returns true iff the unit test failed (i.e. some test case failed
-  // or something outside of all tests failed).
-  bool Failed() const {
-    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
-  }
-
-  // Gets the i-th test case among all the test cases. i can range from 0 to
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.
-  const TestCase* GetTestCase(int i) const {
-    const int index = GetElementOr(test_case_indices_, i, -1);
-    return index < 0 ? NULL : test_cases_[i];
-  }
-
-  // Gets the i-th test case among all the test cases. i can range from 0 to
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.
-  TestCase* GetMutableTestCase(int i) {
-    const int index = GetElementOr(test_case_indices_, i, -1);
-    return index < 0 ? NULL : test_cases_[index];
-  }
-
-  // Provides access to the event listener list.
-  TestEventListeners* listeners() { return &listeners_; }
-
-  // Returns the TestResult for the test that's currently running, or
-  // the TestResult for the ad hoc test if no test is running.
-  TestResult* current_test_result();
-
-  // Returns the TestResult for the ad hoc test.
-  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
-
-  // Sets the OS stack trace getter.
-  //
-  // Does nothing if the input and the current OS stack trace getter
-  // are the same; otherwise, deletes the old getter and makes the
-  // input the current getter.
-  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
-
-  // Returns the current OS stack trace getter if it is not NULL;
-  // otherwise, creates an OsStackTraceGetter, makes it the current
-  // getter, and returns it.
-  OsStackTraceGetterInterface* os_stack_trace_getter();
-
-  // Returns the current OS stack trace as a String.
-  //
-  // The maximum number of stack frames to be included is specified by
-  // the gtest_stack_trace_depth flag.  The skip_count parameter
-  // specifies the number of top frames to be skipped, which doesn't
-  // count against the number of frames to be included.
-  //
-  // For example, if Foo() calls Bar(), which in turn calls
-  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
-  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-  String CurrentOsStackTraceExceptTop(int skip_count);
-
-  // Finds and returns a TestCase with the given name.  If one doesn't
-  // exist, creates one and returns it.
-  //
-  // Arguments:
-  //
-  //   test_case_name: name of the test case
-  //   type_param:     the name of the test's type parameter, or NULL if
-  //                   this is not a typed or a type-parameterized test.
-  //   set_up_tc:      pointer to the function that sets up the test case
-  //   tear_down_tc:   pointer to the function that tears down the test case
-  TestCase* GetTestCase(const char* test_case_name,
-                        const char* type_param,
-                        Test::SetUpTestCaseFunc set_up_tc,
-                        Test::TearDownTestCaseFunc tear_down_tc);
-
-  // Adds a TestInfo to the unit test.
-  //
-  // Arguments:
-  //
-  //   set_up_tc:    pointer to the function that sets up the test case
-  //   tear_down_tc: pointer to the function that tears down the test case
-  //   test_info:    the TestInfo object
-  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
-                   Test::TearDownTestCaseFunc tear_down_tc,
-                   TestInfo* test_info) {
-    // In order to support thread-safe death tests, we need to
-    // remember the original working directory when the test program
-    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
-    // the user may have changed the current directory before calling
-    // RUN_ALL_TESTS().  Therefore we capture the current directory in
-    // AddTestInfo(), which is called to register a TEST or TEST_F
-    // before main() is reached.
-    if (original_working_dir_.IsEmpty()) {
-      original_working_dir_.Set(FilePath::GetCurrentDir());
-      GTEST_CHECK_(!original_working_dir_.IsEmpty())
-          << "Failed to get the current working directory.";
-    }
-
-    GetTestCase(test_info->test_case_name(),
-                test_info->type_param(),
-                set_up_tc,
-                tear_down_tc)->AddTestInfo(test_info);
-  }
-
-#if GTEST_HAS_PARAM_TEST
-  // Returns ParameterizedTestCaseRegistry object used to keep track of
-  // value-parameterized tests and instantiate and register them.
-  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
-    return parameterized_test_registry_;
-  }
-#endif  // GTEST_HAS_PARAM_TEST
-
-  // Sets the TestCase object for the test that's currently running.
-  void set_current_test_case(TestCase* a_current_test_case) {
-    current_test_case_ = a_current_test_case;
-  }
-
-  // Sets the TestInfo object for the test that's currently running.  If
-  // current_test_info is NULL, the assertion results will be stored in
-  // ad_hoc_test_result_.
-  void set_current_test_info(TestInfo* a_current_test_info) {
-    current_test_info_ = a_current_test_info;
-  }
-
-  // Registers all parameterized tests defined using TEST_P and
-  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
-  // combination. This method can be called more then once; it has guards
-  // protecting from registering the tests more then once.  If
-  // value-parameterized tests are disabled, RegisterParameterizedTests is
-  // present but does nothing.
-  void RegisterParameterizedTests();
-
-  // Runs all tests in this UnitTest object, prints the result, and
-  // returns true if all tests are successful.  If any exception is
-  // thrown during a test, this test is considered to be failed, but
-  // the rest of the tests will still be run.
-  bool RunAllTests();
-
-  // Clears the results of all tests, except the ad hoc tests.
-  void ClearNonAdHocTestResult() {
-    ForEach(test_cases_, TestCase::ClearTestCaseResult);
-  }
-
-  // Clears the results of ad-hoc test assertions.
-  void ClearAdHocTestResult() {
-    ad_hoc_test_result_.Clear();
-  }
-
-  enum ReactionToSharding {
-    HONOR_SHARDING_PROTOCOL,
-    IGNORE_SHARDING_PROTOCOL
-  };
-
-  // Matches the full name of each test against the user-specified
-  // filter to decide whether the test should run, then records the
-  // result in each TestCase and TestInfo object.
-  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
-  // based on sharding variables in the environment.
-  // Returns the number of tests that should run.
-  int FilterTests(ReactionToSharding shard_tests);
-
-  // Prints the names of the tests matching the user-specified filter flag.
-  void ListTestsMatchingFilter();
-
-  const TestCase* current_test_case() const { return current_test_case_; }
-  TestInfo* current_test_info() { return current_test_info_; }
-  const TestInfo* current_test_info() const { return current_test_info_; }
-
-  // Returns the vector of environments that need to be set-up/torn-down
-  // before/after the tests are run.
-  std::vector<Environment*>& environments() { return environments_; }
-
-  // Getters for the per-thread Google Test trace stack.
-  std::vector<TraceInfo>& gtest_trace_stack() {
-    return *(gtest_trace_stack_.pointer());
-  }
-  const std::vector<TraceInfo>& gtest_trace_stack() const {
-    return gtest_trace_stack_.get();
-  }
-
-#if GTEST_HAS_DEATH_TEST
-  void InitDeathTestSubprocessControlInfo() {
-    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
-  }
-  // Returns a pointer to the parsed --gtest_internal_run_death_test
-  // flag, or NULL if that flag was not specified.
-  // This information is useful only in a death test child process.
-  // Must not be called before a call to InitGoogleTest.
-  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
-    return internal_run_death_test_flag_.get();
-  }
-
-  // Returns a pointer to the current death test factory.
-  internal::DeathTestFactory* death_test_factory() {
-    return death_test_factory_.get();
-  }
-
-  void SuppressTestEventsIfInSubprocess();
-
-  friend class ReplaceDeathTestFactory;
-#endif  // GTEST_HAS_DEATH_TEST
-
-  // Initializes the event listener performing XML output as specified by
-  // UnitTestOptions. Must not be called before InitGoogleTest.
-  void ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
-  // Initializes the event listener for streaming test results to a socket.
-  // Must not be called before InitGoogleTest.
-  void ConfigureStreamingOutput();
-#endif
-
-  // Performs initialization dependent upon flag values obtained in
-  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
-  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
-  // this function is also called from RunAllTests.  Since this function can be
-  // called more than once, it has to be idempotent.
-  void PostFlagParsingInit();
-
-  // Gets the random seed used at the start of the current test iteration.
-  int random_seed() const { return random_seed_; }
-
-  // Gets the random number generator.
-  internal::Random* random() { return &random_; }
-
-  // Shuffles all test cases, and the tests within each test case,
-  // making sure that death tests are still run first.
-  void ShuffleTests();
-
-  // Restores the test cases and tests to their order before the first shuffle.
-  void UnshuffleTests();
-
-  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
-  // UnitTest::Run() starts.
-  bool catch_exceptions() const { return catch_exceptions_; }
-
- private:
-  friend class ::testing::UnitTest;
-
-  // Used by UnitTest::Run() to capture the state of
-  // GTEST_FLAG(catch_exceptions) at the moment it starts.
-  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
-
-  // The UnitTest object that owns this implementation object.
-  UnitTest* const parent_;
-
-  // The working directory when the first TEST() or TEST_F() was
-  // executed.
-  internal::FilePath original_working_dir_;
-
-  // The default test part result reporters.
-  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
-  DefaultPerThreadTestPartResultReporter
-      default_per_thread_test_part_result_reporter_;
-
-  // Points to (but doesn't own) the global test part result reporter.
-  TestPartResultReporterInterface* global_test_part_result_repoter_;
-
-  // Protects read and write access to global_test_part_result_reporter_.
-  internal::Mutex global_test_part_result_reporter_mutex_;
-
-  // Points to (but doesn't own) the per-thread test part result reporter.
-  internal::ThreadLocal<TestPartResultReporterInterface*>
-      per_thread_test_part_result_reporter_;
-
-  // The vector of environments that need to be set-up/torn-down
-  // before/after the tests are run.
-  std::vector<Environment*> environments_;
-
-  // The vector of TestCases in their original order.  It owns the
-  // elements in the vector.
-  std::vector<TestCase*> test_cases_;
-
-  // Provides a level of indirection for the test case list to allow
-  // easy shuffling and restoring the test case order.  The i-th
-  // element of this vector is the index of the i-th test case in the
-  // shuffled order.
-  std::vector<int> test_case_indices_;
-
-#if GTEST_HAS_PARAM_TEST
-  // ParameterizedTestRegistry object used to register value-parameterized
-  // tests.
-  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
-
-  // Indicates whether RegisterParameterizedTests() has been called already.
-  bool parameterized_tests_registered_;
-#endif  // GTEST_HAS_PARAM_TEST
-
-  // Index of the last death test case registered.  Initially -1.
-  int last_death_test_case_;
-
-  // This points to the TestCase for the currently running test.  It
-  // changes as Google Test goes through one test case after another.
-  // When no test is running, this is set to NULL and Google Test
-  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
-  TestCase* current_test_case_;
-
-  // This points to the TestInfo for the currently running test.  It
-  // changes as Google Test goes through one test after another.  When
-  // no test is running, this is set to NULL and Google Test stores
-  // assertion results in ad_hoc_test_result_.  Initially NULL.
-  TestInfo* current_test_info_;
-
-  // Normally, a user only writes assertions inside a TEST or TEST_F,
-  // or inside a function called by a TEST or TEST_F.  Since Google
-  // Test keeps track of which test is current running, it can
-  // associate such an assertion with the test it belongs to.
-  //
-  // If an assertion is encountered when no TEST or TEST_F is running,
-  // Google Test attributes the assertion result to an imaginary "ad hoc"
-  // test, and records the result in ad_hoc_test_result_.
-  TestResult ad_hoc_test_result_;
-
-  // The list of event listeners that can be used to track events inside
-  // Google Test.
-  TestEventListeners listeners_;
-
-  // The OS stack trace getter.  Will be deleted when the UnitTest
-  // object is destructed.  By default, an OsStackTraceGetter is used,
-  // but the user can set this field to use a custom getter if that is
-  // desired.
-  OsStackTraceGetterInterface* os_stack_trace_getter_;
-
-  // True iff PostFlagParsingInit() has been called.
-  bool post_flag_parse_init_performed_;
-
-  // The random number seed used at the beginning of the test run.
-  int random_seed_;
-
-  // Our random number generator.
-  internal::Random random_;
-
-  // How long the test took to run, in milliseconds.
-  TimeInMillis elapsed_time_;
-
-#if GTEST_HAS_DEATH_TEST
-  // The decomposed components of the gtest_internal_run_death_test flag,
-  // parsed when RUN_ALL_TESTS is called.
-  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
-  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
-#endif  // GTEST_HAS_DEATH_TEST
-
-  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
-  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
-
-  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
-  // starts.
-  bool catch_exceptions_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
-};  // class UnitTestImpl
-
-// Convenience function for accessing the global UnitTest
-// implementation object.
-inline UnitTestImpl* GetUnitTestImpl() {
-  return UnitTest::GetInstance()->impl();
-}
-
-#if GTEST_USES_SIMPLE_RE
-
-// Internal helper functions for implementing the simple regular
-// expression matcher.
-GTEST_API_ bool IsInSet(char ch, const char* str);
-GTEST_API_ bool IsAsciiDigit(char ch);
-GTEST_API_ bool IsAsciiPunct(char ch);
-GTEST_API_ bool IsRepeat(char ch);
-GTEST_API_ bool IsAsciiWhiteSpace(char ch);
-GTEST_API_ bool IsAsciiWordChar(char ch);
-GTEST_API_ bool IsValidEscape(char ch);
-GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
-GTEST_API_ bool ValidateRegex(const char* regex);
-GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
-GTEST_API_ bool MatchRepetitionAndRegexAtHead(
-    bool escaped, char ch, char repeat, const char* regex, const char* str);
-GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
-
-#endif  // GTEST_USES_SIMPLE_RE
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
-
-#if GTEST_HAS_DEATH_TEST
-
-// Returns the message describing the last system error, regardless of the
-// platform.
-GTEST_API_ String GetLastErrnoDescription();
-
-# if GTEST_OS_WINDOWS
-// Provides leak-safe Windows kernel handle ownership.
-class AutoHandle {
- public:
-  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
-  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
-
-  ~AutoHandle() { Reset(); }
-
-  HANDLE Get() const { return handle_; }
-  void Reset() { Reset(INVALID_HANDLE_VALUE); }
-  void Reset(HANDLE handle) {
-    if (handle != handle_) {
-      if (handle_ != INVALID_HANDLE_VALUE)
-        ::CloseHandle(handle_);
-      handle_ = handle;
-    }
-  }
-
- private:
-  HANDLE handle_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
-};
-# endif  // GTEST_OS_WINDOWS
-
-// Attempts to parse a string into a positive integer pointed to by the
-// number parameter.  Returns true if that is possible.
-// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
-// it here.
-template <typename Integer>
-bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
-  // Fail fast if the given string does not begin with a digit;
-  // this bypasses strtoXXX's "optional leading whitespace and plus
-  // or minus sign" semantics, which are undesirable here.
-  if (str.empty() || !IsDigit(str[0])) {
-    return false;
-  }
-  errno = 0;
-
-  char* end;
-  // BiggestConvertible is the largest integer type that system-provided
-  // string-to-number conversion routines can return.
-
-# if GTEST_OS_WINDOWS && !defined(__GNUC__)
-
-  // MSVC and C++ Builder define __int64 instead of the standard long long.
-  typedef unsigned __int64 BiggestConvertible;
-  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
-
-# else
-
-  typedef unsigned long long BiggestConvertible;  // NOLINT
-  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
-
-# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
-
-  const bool parse_success = *end == '\0' && errno == 0;
-
-  // TODO(vladl at google.com): Convert this to compile time assertion when it is
-  // available.
-  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
-
-  const Integer result = static_cast<Integer>(parsed);
-  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
-    *number = result;
-    return true;
-  }
-  return false;
-}
-#endif  // GTEST_HAS_DEATH_TEST
-
-// TestResult contains some private methods that should be hidden from
-// Google Test user but are required for testing. This class allow our tests
-// to access them.
-//
-// This class is supplied only for the purpose of testing Google Test's own
-// constructs. Do not use it in user tests, either directly or indirectly.
-class TestResultAccessor {
- public:
-  static void RecordProperty(TestResult* test_result,
-                             const TestProperty& property) {
-    test_result->RecordProperty(property);
-  }
-
-  static void ClearTestPartResults(TestResult* test_result) {
-    test_result->ClearTestPartResults();
-  }
-
-  static const std::vector<testing::TestPartResult>& test_part_results(
-      const TestResult& test_result) {
-    return test_result.test_part_results();
-  }
-};
-
-}  // namespace internal
-}  // namespace testing
-
-#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
diff --git a/unit_tests/gtest/src/gtest-port.cc b/unit_tests/gtest/src/gtest-port.cc
deleted file mode 100644
index 6cb716f..0000000
--- a/unit_tests/gtest/src/gtest-port.cc
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#include "gtest/internal/gtest-port.h"
-
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h>  // For TerminateProcess()
-#elif GTEST_OS_WINDOWS
-# include <io.h>
-# include <sys/stat.h>
-#else
-# include <unistd.h>
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_MAC
-# include <mach/mach_init.h>
-# include <mach/task.h>
-# include <mach/vm_map.h>
-#endif  // GTEST_OS_MAC
-
-#include "gtest/gtest-spi.h"
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation.  It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error.  This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-
-namespace testing {
-namespace internal {
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
-const int kStdOutFileno = 1;
-const int kStdErrFileno = 2;
-#else
-const int kStdOutFileno = STDOUT_FILENO;
-const int kStdErrFileno = STDERR_FILENO;
-#endif  // _MSC_VER
-
-#if GTEST_OS_MAC
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-size_t GetThreadCount() {
-  const task_t task = mach_task_self();
-  mach_msg_type_number_t thread_count;
-  thread_act_array_t thread_list;
-  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
-  if (status == KERN_SUCCESS) {
-    // task_threads allocates resources in thread_list and we need to free them
-    // to avoid leaks.
-    vm_deallocate(task,
-                  reinterpret_cast<vm_address_t>(thread_list),
-                  sizeof(thread_t) * thread_count);
-    return static_cast<size_t>(thread_count);
-  } else {
-    return 0;
-  }
-}
-
-#else
-
-size_t GetThreadCount() {
-  // There's no portable way to detect the number of threads, so we just
-  // return 0 to indicate that we cannot detect it.
-  return 0;
-}
-
-#endif  // GTEST_OS_MAC
-
-#if GTEST_USES_POSIX_RE
-
-// Implements RE.  Currently only needed for death tests.
-
-RE::~RE() {
-  if (is_valid_) {
-    // regfree'ing an invalid regex might crash because the content
-    // of the regex is undefined. Since the regex's are essentially
-    // the same, one cannot be valid (or invalid) without the other
-    // being so too.
-    regfree(&partial_regex_);
-    regfree(&full_regex_);
-  }
-  free(const_cast<char*>(pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
-  if (!re.is_valid_) return false;
-
-  regmatch_t match;
-  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
-  if (!re.is_valid_) return false;
-
-  regmatch_t match;
-  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
-  pattern_ = posix::StrDup(regex);
-
-  // Reserves enough bytes to hold the regular expression used for a
-  // full match.
-  const size_t full_regex_len = strlen(regex) + 10;
-  char* const full_pattern = new char[full_regex_len];
-
-  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
-  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
-  // We want to call regcomp(&partial_regex_, ...) even if the
-  // previous expression returns false.  Otherwise partial_regex_ may
-  // not be properly initialized can may cause trouble when it's
-  // freed.
-  //
-  // Some implementation of POSIX regex (e.g. on at least some
-  // versions of Cygwin) doesn't accept the empty string as a valid
-  // regex.  We change it to an equivalent form "()" to be safe.
-  if (is_valid_) {
-    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
-    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
-  }
-  EXPECT_TRUE(is_valid_)
-      << "Regular expression \"" << regex
-      << "\" is not a valid POSIX Extended regular expression.";
-
-  delete[] full_pattern;
-}
-
-#elif GTEST_USES_SIMPLE_RE
-
-// Returns true iff ch appears anywhere in str (excluding the
-// terminating '\0' character).
-bool IsInSet(char ch, const char* str) {
-  return ch != '\0' && strchr(str, ch) != NULL;
-}
-
-// Returns true iff ch belongs to the given classification.  Unlike
-// similar functions in <ctype.h>, these aren't affected by the
-// current locale.
-bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
-bool IsAsciiPunct(char ch) {
-  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
-}
-bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
-bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
-bool IsAsciiWordChar(char ch) {
-  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
-      ('0' <= ch && ch <= '9') || ch == '_';
-}
-
-// Returns true iff "\\c" is a supported escape sequence.
-bool IsValidEscape(char c) {
-  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
-}
-
-// Returns true iff the given atom (specified by escaped and pattern)
-// matches ch.  The result is undefined if the atom is invalid.
-bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
-  if (escaped) {  // "\\p" where p is pattern_char.
-    switch (pattern_char) {
-      case 'd': return IsAsciiDigit(ch);
-      case 'D': return !IsAsciiDigit(ch);
-      case 'f': return ch == '\f';
-      case 'n': return ch == '\n';
-      case 'r': return ch == '\r';
-      case 's': return IsAsciiWhiteSpace(ch);
-      case 'S': return !IsAsciiWhiteSpace(ch);
-      case 't': return ch == '\t';
-      case 'v': return ch == '\v';
-      case 'w': return IsAsciiWordChar(ch);
-      case 'W': return !IsAsciiWordChar(ch);
-    }
-    return IsAsciiPunct(pattern_char) && pattern_char == ch;
-  }
-
-  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
-}
-
-// Helper function used by ValidateRegex() to format error messages.
-String FormatRegexSyntaxError(const char* regex, int index) {
-  return (Message() << "Syntax error at index " << index
-          << " in simple regular expression \"" << regex << "\": ").GetString();
-}
-
-// Generates non-fatal failures and returns false if regex is invalid;
-// otherwise returns true.
-bool ValidateRegex(const char* regex) {
-  if (regex == NULL) {
-    // TODO(wan at google.com): fix the source file location in the
-    // assertion failures to match where the regex is used in user
-    // code.
-    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
-    return false;
-  }
-
-  bool is_valid = true;
-
-  // True iff ?, *, or + can follow the previous atom.
-  bool prev_repeatable = false;
-  for (int i = 0; regex[i]; i++) {
-    if (regex[i] == '\\') {  // An escape sequence
-      i++;
-      if (regex[i] == '\0') {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
-                      << "'\\' cannot appear at the end.";
-        return false;
-      }
-
-      if (!IsValidEscape(regex[i])) {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
-                      << "invalid escape sequence \"\\" << regex[i] << "\".";
-        is_valid = false;
-      }
-      prev_repeatable = true;
-    } else {  // Not an escape sequence.
-      const char ch = regex[i];
-
-      if (ch == '^' && i > 0) {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
-                      << "'^' can only appear at the beginning.";
-        is_valid = false;
-      } else if (ch == '$' && regex[i + 1] != '\0') {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
-                      << "'$' can only appear at the end.";
-        is_valid = false;
-      } else if (IsInSet(ch, "()[]{}|")) {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
-                      << "'" << ch << "' is unsupported.";
-        is_valid = false;
-      } else if (IsRepeat(ch) && !prev_repeatable) {
-        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
-                      << "'" << ch << "' can only follow a repeatable token.";
-        is_valid = false;
-      }
-
-      prev_repeatable = !IsInSet(ch, "^$?*+");
-    }
-  }
-
-  return is_valid;
-}
-
-// Matches a repeated regex atom followed by a valid simple regular
-// expression.  The regex atom is defined as c if escaped is false,
-// or \c otherwise.  repeat is the repetition meta character (?, *,
-// or +).  The behavior is undefined if str contains too many
-// characters to be indexable by size_t, in which case the test will
-// probably time out anyway.  We are fine with this limitation as
-// std::string has it too.
-bool MatchRepetitionAndRegexAtHead(
-    bool escaped, char c, char repeat, const char* regex,
-    const char* str) {
-  const size_t min_count = (repeat == '+') ? 1 : 0;
-  const size_t max_count = (repeat == '?') ? 1 :
-      static_cast<size_t>(-1) - 1;
-  // We cannot call numeric_limits::max() as it conflicts with the
-  // max() macro on Windows.
-
-  for (size_t i = 0; i <= max_count; ++i) {
-    // We know that the atom matches each of the first i characters in str.
-    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
-      // We have enough matches at the head, and the tail matches too.
-      // Since we only care about *whether* the pattern matches str
-      // (as opposed to *how* it matches), there is no need to find a
-      // greedy match.
-      return true;
-    }
-    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
-      return false;
-  }
-  return false;
-}
-
-// Returns true iff regex matches a prefix of str.  regex must be a
-// valid simple regular expression and not start with "^", or the
-// result is undefined.
-bool MatchRegexAtHead(const char* regex, const char* str) {
-  if (*regex == '\0')  // An empty regex matches a prefix of anything.
-    return true;
-
-  // "$" only matches the end of a string.  Note that regex being
-  // valid guarantees that there's nothing after "$" in it.
-  if (*regex == '$')
-    return *str == '\0';
-
-  // Is the first thing in regex an escape sequence?
-  const bool escaped = *regex == '\\';
-  if (escaped)
-    ++regex;
-  if (IsRepeat(regex[1])) {
-    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
-    // here's an indirect recursion.  It terminates as the regex gets
-    // shorter in each recursion.
-    return MatchRepetitionAndRegexAtHead(
-        escaped, regex[0], regex[1], regex + 2, str);
-  } else {
-    // regex isn't empty, isn't "$", and doesn't start with a
-    // repetition.  We match the first atom of regex with the first
-    // character of str and recurse.
-    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
-        MatchRegexAtHead(regex + 1, str + 1);
-  }
-}
-
-// Returns true iff regex matches any substring of str.  regex must be
-// a valid simple regular expression, or the result is undefined.
-//
-// The algorithm is recursive, but the recursion depth doesn't exceed
-// the regex length, so we won't need to worry about running out of
-// stack space normally.  In rare cases the time complexity can be
-// exponential with respect to the regex length + the string length,
-// but usually it's must faster (often close to linear).
-bool MatchRegexAnywhere(const char* regex, const char* str) {
-  if (regex == NULL || str == NULL)
-    return false;
-
-  if (*regex == '^')
-    return MatchRegexAtHead(regex + 1, str);
-
-  // A successful match can be anywhere in str.
-  do {
-    if (MatchRegexAtHead(regex, str))
-      return true;
-  } while (*str++ != '\0');
-  return false;
-}
-
-// Implements the RE class.
-
-RE::~RE() {
-  free(const_cast<char*>(pattern_));
-  free(const_cast<char*>(full_pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
-  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
-  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
-  pattern_ = full_pattern_ = NULL;
-  if (regex != NULL) {
-    pattern_ = posix::StrDup(regex);
-  }
-
-  is_valid_ = ValidateRegex(regex);
-  if (!is_valid_) {
-    // No need to calculate the full pattern when the regex is invalid.
-    return;
-  }
-
-  const size_t len = strlen(regex);
-  // Reserves enough bytes to hold the regular expression used for a
-  // full match: we need space to prepend a '^', append a '$', and
-  // terminate the string with '\0'.
-  char* buffer = static_cast<char*>(malloc(len + 3));
-  full_pattern_ = buffer;
-
-  if (*regex != '^')
-    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
-
-  // We don't use snprintf or strncpy, as they trigger a warning when
-  // compiled with VC++ 8.0.
-  memcpy(buffer, regex, len);
-  buffer += len;
-
-  if (len == 0 || regex[len - 1] != '$')
-    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
-
-  *buffer = '\0';
-}
-
-#endif  // GTEST_USES_POSIX_RE
-
-const char kUnknownFile[] = "unknown file";
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
-  const char* const file_name = file == NULL ? kUnknownFile : file;
-
-  if (line < 0) {
-    return String::Format("%s:", file_name).c_str();
-  }
-#ifdef _MSC_VER
-  return String::Format("%s(%d):", file_name, line).c_str();
-#else
-  return String::Format("%s:%d:", file_name, line).c_str();
-#endif  // _MSC_VER
-}
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-// Note that FormatCompilerIndependentFileLocation() does NOT append colon
-// to the file location it produces, unlike FormatFileLocation().
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
-    const char* file, int line) {
-  const char* const file_name = file == NULL ? kUnknownFile : file;
-
-  if (line < 0)
-    return file_name;
-  else
-    return String::Format("%s:%d", file_name, line).c_str();
-}
-
-
-GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
-    : severity_(severity) {
-  const char* const marker =
-      severity == GTEST_INFO ?    "[  INFO ]" :
-      severity == GTEST_WARNING ? "[WARNING]" :
-      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
-  GetStream() << ::std::endl << marker << " "
-              << FormatFileLocation(file, line).c_str() << ": ";
-}
-
-// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
-GTestLog::~GTestLog() {
-  GetStream() << ::std::endl;
-  if (severity_ == GTEST_FATAL) {
-    fflush(stderr);
-    posix::Abort();
-  }
-}
-// Disable Microsoft deprecation warnings for POSIX functions called from
-// this class (creat, dup, dup2, and close)
-#ifdef _MSC_VER
-# pragma warning(push)
-# pragma warning(disable: 4996)
-#endif  // _MSC_VER
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Object that captures an output stream (stdout/stderr).
-class CapturedStream {
- public:
-  // The ctor redirects the stream to a temporary file.
-  CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
-
-# if GTEST_OS_WINDOWS
-    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
-    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
-
-    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
-    const UINT success = ::GetTempFileNameA(temp_dir_path,
-                                            "gtest_redir",
-                                            0,  // Generate unique file name.
-                                            temp_file_path);
-    GTEST_CHECK_(success != 0)
-        << "Unable to create a temporary file in " << temp_dir_path;
-    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
-    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
-                                    << temp_file_path;
-    filename_ = temp_file_path;
-# else
-    // There's no guarantee that a test has write access to the
-    // current directory, so we create the temporary file in the /tmp
-    // directory instead.
-    char name_template[] = "/tmp/captured_stream.XXXXXX";
-    const int captured_fd = mkstemp(name_template);
-    filename_ = name_template;
-# endif  // GTEST_OS_WINDOWS
-    fflush(NULL);
-    dup2(captured_fd, fd_);
-    close(captured_fd);
-  }
-
-  ~CapturedStream() {
-    remove(filename_.c_str());
-  }
-
-  String GetCapturedString() {
-    if (uncaptured_fd_ != -1) {
-      // Restores the original stream.
-      fflush(NULL);
-      dup2(uncaptured_fd_, fd_);
-      close(uncaptured_fd_);
-      uncaptured_fd_ = -1;
-    }
-
-    FILE* const file = posix::FOpen(filename_.c_str(), "r");
-    const String content = ReadEntireFile(file);
-    posix::FClose(file);
-    return content;
-  }
-
- private:
-  // Reads the entire content of a file as a String.
-  static String ReadEntireFile(FILE* file);
-
-  // Returns the size (in bytes) of a file.
-  static size_t GetFileSize(FILE* file);
-
-  const int fd_;  // A stream to capture.
-  int uncaptured_fd_;
-  // Name of the temporary file holding the stderr output.
-  ::std::string filename_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
-};
-
-// Returns the size (in bytes) of a file.
-size_t CapturedStream::GetFileSize(FILE* file) {
-  fseek(file, 0, SEEK_END);
-  return static_cast<size_t>(ftell(file));
-}
-
-// Reads the entire content of a file as a string.
-String CapturedStream::ReadEntireFile(FILE* file) {
-  const size_t file_size = GetFileSize(file);
-  char* const buffer = new char[file_size];
-
-  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
-  size_t bytes_read = 0;       // # of bytes read so far
-
-  fseek(file, 0, SEEK_SET);
-
-  // Keeps reading the file until we cannot read further or the
-  // pre-determined file size is reached.
-  do {
-    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
-    bytes_read += bytes_last_read;
-  } while (bytes_last_read > 0 && bytes_read < file_size);
-
-  const String content(buffer, bytes_read);
-  delete[] buffer;
-
-  return content;
-}
-
-# ifdef _MSC_VER
-#  pragma warning(pop)
-# endif  // _MSC_VER
-
-static CapturedStream* g_captured_stderr = NULL;
-static CapturedStream* g_captured_stdout = NULL;
-
-// Starts capturing an output stream (stdout/stderr).
-void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
-  if (*stream != NULL) {
-    GTEST_LOG_(FATAL) << "Only one " << stream_name
-                      << " capturer can exist at a time.";
-  }
-  *stream = new CapturedStream(fd);
-}
-
-// Stops capturing the output stream and returns the captured string.
-String GetCapturedStream(CapturedStream** captured_stream) {
-  const String content = (*captured_stream)->GetCapturedString();
-
-  delete *captured_stream;
-  *captured_stream = NULL;
-
-  return content;
-}
-
-// Starts capturing stdout.
-void CaptureStdout() {
-  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
-}
-
-// Starts capturing stderr.
-void CaptureStderr() {
-  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
-}
-
-// Stops capturing stdout and returns the captured string.
-String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }
-
-// Stops capturing stderr and returns the captured string.
-String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
-
-#endif  // GTEST_HAS_STREAM_REDIRECTION
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments.  Set by InitGoogleTest().
-::std::vector<String> g_argvs;
-
-// Returns the command line as a vector of strings.
-const ::std::vector<String>& GetArgvs() { return g_argvs; }
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-#if GTEST_OS_WINDOWS_MOBILE
-namespace posix {
-void Abort() {
-  DebugBreak();
-  TerminateProcess(GetCurrentProcess(), 1);
-}
-}  // namespace posix
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-// Returns the name of the environment variable corresponding to the
-// given flag.  For example, FlagToEnvVar("foo") will return
-// "GTEST_FOO" in the open-source version.
-static String FlagToEnvVar(const char* flag) {
-  const String full_flag =
-      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
-
-  Message env_var;
-  for (size_t i = 0; i != full_flag.length(); i++) {
-    env_var << ToUpper(full_flag.c_str()[i]);
-  }
-
-  return env_var.GetString();
-}
-
-// Parses 'str' for a 32-bit signed integer.  If successful, writes
-// the result to *value and returns true; otherwise leaves *value
-// unchanged and returns false.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
-  // Parses the environment variable as a decimal integer.
-  char* end = NULL;
-  const long long_value = strtol(str, &end, 10);  // NOLINT
-
-  // Has strtol() consumed all characters in the string?
-  if (*end != '\0') {
-    // No - an invalid character was encountered.
-    Message msg;
-    msg << "WARNING: " << src_text
-        << " is expected to be a 32-bit integer, but actually"
-        << " has value \"" << str << "\".\n";
-    printf("%s", msg.GetString().c_str());
-    fflush(stdout);
-    return false;
-  }
-
-  // Is the parsed value in the range of an Int32?
-  const Int32 result = static_cast<Int32>(long_value);
-  if (long_value == LONG_MAX || long_value == LONG_MIN ||
-      // The parsed value overflows as a long.  (strtol() returns
-      // LONG_MAX or LONG_MIN when the input overflows.)
-      result != long_value
-      // The parsed value overflows as an Int32.
-      ) {
-    Message msg;
-    msg << "WARNING: " << src_text
-        << " is expected to be a 32-bit integer, but actually"
-        << " has value " << str << ", which overflows.\n";
-    printf("%s", msg.GetString().c_str());
-    fflush(stdout);
-    return false;
-  }
-
-  *value = result;
-  return true;
-}
-
-// Reads and returns the Boolean environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-//
-// The value is considered true iff it's not "0".
-bool BoolFromGTestEnv(const char* flag, bool default_value) {
-  const String env_var = FlagToEnvVar(flag);
-  const char* const string_value = posix::GetEnv(env_var.c_str());
-  return string_value == NULL ?
-      default_value : strcmp(string_value, "0") != 0;
-}
-
-// Reads and returns a 32-bit integer stored in the environment
-// variable corresponding to the given flag; if it isn't set or
-// doesn't represent a valid 32-bit integer, returns default_value.
-Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
-  const String env_var = FlagToEnvVar(flag);
-  const char* const string_value = posix::GetEnv(env_var.c_str());
-  if (string_value == NULL) {
-    // The environment variable is not set.
-    return default_value;
-  }
-
-  Int32 result = default_value;
-  if (!ParseInt32(Message() << "Environment variable " << env_var,
-                  string_value, &result)) {
-    printf("The default value %s is used.\n",
-           (Message() << default_value).GetString().c_str());
-    fflush(stdout);
-    return default_value;
-  }
-
-  return result;
-}
-
-// Reads and returns the string environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-const char* StringFromGTestEnv(const char* flag, const char* default_value) {
-  const String env_var = FlagToEnvVar(flag);
-  const char* const value = posix::GetEnv(env_var.c_str());
-  return value == NULL ? default_value : value;
-}
-
-}  // namespace internal
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-printers.cc b/unit_tests/gtest/src/gtest-printers.cc
deleted file mode 100644
index ed63c7b..0000000
--- a/unit_tests/gtest/src/gtest-printers.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2007, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// It uses the << operator when possible, and prints the bytes in the
-// object otherwise.  A user can override its behavior for a class
-// type Foo by defining either operator<<(::std::ostream&, const Foo&)
-// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
-// defines Foo.
-
-#include "gtest/gtest-printers.h"
-#include <ctype.h>
-#include <stdio.h>
-#include <ostream>  // NOLINT
-#include <string>
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-
-namespace {
-
-using ::std::ostream;
-
-#if GTEST_OS_WINDOWS_MOBILE  // Windows CE does not define _snprintf_s.
-# define snprintf _snprintf
-#elif _MSC_VER >= 1400  // VC 8.0 and later deprecate snprintf and _snprintf.
-# define snprintf _snprintf_s
-#elif _MSC_VER
-# define snprintf _snprintf
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-// Prints a segment of bytes in the given object.
-void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
-                                size_t count, ostream* os) {
-  char text[5] = "";
-  for (size_t i = 0; i != count; i++) {
-    const size_t j = start + i;
-    if (i != 0) {
-      // Organizes the bytes into groups of 2 for easy parsing by
-      // human.
-      if ((j % 2) == 0)
-        *os << ' ';
-      else
-        *os << '-';
-    }
-    snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
-    *os << text;
-  }
-}
-
-// Prints the bytes in the given value to the given ostream.
-void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
-                              ostream* os) {
-  // Tells the user how big the object is.
-  *os << count << "-byte object <";
-
-  const size_t kThreshold = 132;
-  const size_t kChunkSize = 64;
-  // If the object size is bigger than kThreshold, we'll have to omit
-  // some details by printing only the first and the last kChunkSize
-  // bytes.
-  // TODO(wan): let the user control the threshold using a flag.
-  if (count < kThreshold) {
-    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
-  } else {
-    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
-    *os << " ... ";
-    // Rounds up to 2-byte boundary.
-    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
-    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
-  }
-  *os << ">";
-}
-
-}  // namespace
-
-namespace internal2 {
-
-// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
-// given object.  The delegation simplifies the implementation, which
-// uses the << operator and thus is easier done outside of the
-// ::testing::internal namespace, which contains a << operator that
-// sometimes conflicts with the one in STL.
-void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
-                          ostream* os) {
-  PrintBytesInObjectToImpl(obj_bytes, count, os);
-}
-
-}  // namespace internal2
-
-namespace internal {
-
-// Depending on the value of a char (or wchar_t), we print it in one
-// of three formats:
-//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
-//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
-//   - as a special escape sequence (e.g. '\r', '\n').
-enum CharFormat {
-  kAsIs,
-  kHexEscape,
-  kSpecialEscape
-};
-
-// Returns true if c is a printable ASCII character.  We test the
-// value of c directly instead of calling isprint(), which is buggy on
-// Windows Mobile.
-inline bool IsPrintableAscii(wchar_t c) {
-  return 0x20 <= c && c <= 0x7E;
-}
-
-// Prints a wide or narrow char c as a character literal without the
-// quotes, escaping it when necessary; returns how c was formatted.
-// The template argument UnsignedChar is the unsigned version of Char,
-// which is the type of c.
-template <typename UnsignedChar, typename Char>
-static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
-  switch (static_cast<wchar_t>(c)) {
-    case L'\0':
-      *os << "\\0";
-      break;
-    case L'\'':
-      *os << "\\'";
-      break;
-    case L'\\':
-      *os << "\\\\";
-      break;
-    case L'\a':
-      *os << "\\a";
-      break;
-    case L'\b':
-      *os << "\\b";
-      break;
-    case L'\f':
-      *os << "\\f";
-      break;
-    case L'\n':
-      *os << "\\n";
-      break;
-    case L'\r':
-      *os << "\\r";
-      break;
-    case L'\t':
-      *os << "\\t";
-      break;
-    case L'\v':
-      *os << "\\v";
-      break;
-    default:
-      if (IsPrintableAscii(c)) {
-        *os << static_cast<char>(c);
-        return kAsIs;
-      } else {
-        *os << String::Format("\\x%X", static_cast<UnsignedChar>(c));
-        return kHexEscape;
-      }
-  }
-  return kSpecialEscape;
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
-  switch (c) {
-    case L'\'':
-      *os << "'";
-      return kAsIs;
-    case L'"':
-      *os << "\\\"";
-      return kSpecialEscape;
-    default:
-      return PrintAsCharLiteralTo<wchar_t>(c, os);
-  }
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {
-  return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);
-}
-
-// Prints a wide or narrow character c and its code.  '\0' is printed
-// as "'\\0'", other unprintable characters are also properly escaped
-// using the standard C++ escape sequence.  The template argument
-// UnsignedChar is the unsigned version of Char, which is the type of c.
-template <typename UnsignedChar, typename Char>
-void PrintCharAndCodeTo(Char c, ostream* os) {
-  // First, print c as a literal in the most readable form we can find.
-  *os << ((sizeof(c) > 1) ? "L'" : "'");
-  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
-  *os << "'";
-
-  // To aid user debugging, we also print c's code in decimal, unless
-  // it's 0 (in which case c was printed as '\\0', making the code
-  // obvious).
-  if (c == 0)
-    return;
-  *os << " (" << String::Format("%d", c).c_str();
-
-  // For more convenience, we print c's code again in hexidecimal,
-  // unless c was already printed in the form '\x##' or the code is in
-  // [1, 9].
-  if (format == kHexEscape || (1 <= c && c <= 9)) {
-    // Do nothing.
-  } else {
-    *os << String::Format(", 0x%X",
-                          static_cast<UnsignedChar>(c)).c_str();
-  }
-  *os << ")";
-}
-
-void PrintTo(unsigned char c, ::std::ostream* os) {
-  PrintCharAndCodeTo<unsigned char>(c, os);
-}
-void PrintTo(signed char c, ::std::ostream* os) {
-  PrintCharAndCodeTo<unsigned char>(c, os);
-}
-
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
-void PrintTo(wchar_t wc, ostream* os) {
-  PrintCharAndCodeTo<wchar_t>(wc, os);
-}
-
-// Prints the given array of characters to the ostream.
-// The array starts at *begin, the length is len, it may include '\0' characters
-// and may not be null-terminated.
-static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {
-  *os << "\"";
-  bool is_previous_hex = false;
-  for (size_t index = 0; index < len; ++index) {
-    const char cur = begin[index];
-    if (is_previous_hex && IsXDigit(cur)) {
-      // Previous character is of '\x..' form and this character can be
-      // interpreted as another hexadecimal digit in its number. Break string to
-      // disambiguate.
-      *os << "\" \"";
-    }
-    is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;
-  }
-  *os << "\"";
-}
-
-// Prints a (const) char array of 'len' elements, starting at address 'begin'.
-void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
-  PrintCharsAsStringTo(begin, len, os);
-}
-
-// Prints the given array of wide characters to the ostream.
-// The array starts at *begin, the length is len, it may include L'\0'
-// characters and may not be null-terminated.
-static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,
-                                     ostream* os) {
-  *os << "L\"";
-  bool is_previous_hex = false;
-  for (size_t index = 0; index < len; ++index) {
-    const wchar_t cur = begin[index];
-    if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {
-      // Previous character is of '\x..' form and this character can be
-      // interpreted as another hexadecimal digit in its number. Break string to
-      // disambiguate.
-      *os << "\" L\"";
-    }
-    is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;
-  }
-  *os << "\"";
-}
-
-// Prints the given C string to the ostream.
-void PrintTo(const char* s, ostream* os) {
-  if (s == NULL) {
-    *os << "NULL";
-  } else {
-    *os << ImplicitCast_<const void*>(s) << " pointing to ";
-    PrintCharsAsStringTo(s, strlen(s), os);
-  }
-}
-
-// MSVC compiler can be configured to define whar_t as a typedef
-// of unsigned short. Defining an overload for const wchar_t* in that case
-// would cause pointers to unsigned shorts be printed as wide strings,
-// possibly accessing more memory than intended and causing invalid
-// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
-// wchar_t is implemented as a native type.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Prints the given wide C string to the ostream.
-void PrintTo(const wchar_t* s, ostream* os) {
-  if (s == NULL) {
-    *os << "NULL";
-  } else {
-    *os << ImplicitCast_<const void*>(s) << " pointing to ";
-    PrintWideCharsAsStringTo(s, wcslen(s), os);
-  }
-}
-#endif  // wchar_t is native
-
-// Prints a ::string object.
-#if GTEST_HAS_GLOBAL_STRING
-void PrintStringTo(const ::string& s, ostream* os) {
-  PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-void PrintStringTo(const ::std::string& s, ostream* os) {
-  PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-
-// Prints a ::wstring object.
-#if GTEST_HAS_GLOBAL_WSTRING
-void PrintWideStringTo(const ::wstring& s, ostream* os) {
-  PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
-  PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif  // GTEST_HAS_STD_WSTRING
-
-}  // namespace internal
-
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-test-part.cc b/unit_tests/gtest/src/gtest-test-part.cc
deleted file mode 100644
index 5ddc67c..0000000
--- a/unit_tests/gtest/src/gtest-test-part.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2008, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule at google.com (Markus Heule)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest-test-part.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation.  It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error.  This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-using internal::GetUnitTestImpl;
-
-// Gets the summary of the failure message by omitting the stack trace
-// in it.
-internal::String TestPartResult::ExtractSummary(const char* message) {
-  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
-  return stack_trace == NULL ? internal::String(message) :
-      internal::String(message, stack_trace - message);
-}
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
-  return os
-      << result.file_name() << ":" << result.line_number() << ": "
-      << (result.type() == TestPartResult::kSuccess ? "Success" :
-          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
-          "Non-fatal failure") << ":\n"
-      << result.message() << std::endl;
-}
-
-// Appends a TestPartResult to the array.
-void TestPartResultArray::Append(const TestPartResult& result) {
-  array_.push_back(result);
-}
-
-// Returns the TestPartResult at the given index (0-based).
-const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
-  if (index < 0 || index >= size()) {
-    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
-    internal::posix::Abort();
-  }
-
-  return array_[index];
-}
-
-// Returns the number of TestPartResult objects in the array.
-int TestPartResultArray::size() const {
-  return static_cast<int>(array_.size());
-}
-
-namespace internal {
-
-HasNewFatalFailureHelper::HasNewFatalFailureHelper()
-    : has_new_fatal_failure_(false),
-      original_reporter_(GetUnitTestImpl()->
-                         GetTestPartResultReporterForCurrentThread()) {
-  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
-}
-
-HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
-  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
-      original_reporter_);
-}
-
-void HasNewFatalFailureHelper::ReportTestPartResult(
-    const TestPartResult& result) {
-  if (result.fatally_failed())
-    has_new_fatal_failure_ = true;
-  original_reporter_->ReportTestPartResult(result);
-}
-
-}  // namespace internal
-
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest-typed-test.cc b/unit_tests/gtest/src/gtest-typed-test.cc
deleted file mode 100644
index a5cc88f..0000000
--- a/unit_tests/gtest/src/gtest-typed-test.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2008 Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#include "gtest/gtest-typed-test.h"
-#include "gtest/gtest.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// Skips to the first non-space char in str. Returns an empty string if str
-// contains only whitespace characters.
-static const char* SkipSpaces(const char* str) {
-  while (IsSpace(*str))
-    str++;
-  return str;
-}
-
-// Verifies that registered_tests match the test names in
-// defined_test_names_; returns registered_tests if successful, or
-// aborts the program otherwise.
-const char* TypedTestCasePState::VerifyRegisteredTestNames(
-    const char* file, int line, const char* registered_tests) {
-  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
-  registered_ = true;
-
-  // Skip initial whitespace in registered_tests since some
-  // preprocessors prefix stringizied literals with whitespace.
-  registered_tests = SkipSpaces(registered_tests);
-
-  Message errors;
-  ::std::set<String> tests;
-  for (const char* names = registered_tests; names != NULL;
-       names = SkipComma(names)) {
-    const String name = GetPrefixUntilComma(names);
-    if (tests.count(name) != 0) {
-      errors << "Test " << name << " is listed more than once.\n";
-      continue;
-    }
-
-    bool found = false;
-    for (DefinedTestIter it = defined_test_names_.begin();
-         it != defined_test_names_.end();
-         ++it) {
-      if (name == *it) {
-        found = true;
-        break;
-      }
-    }
-
-    if (found) {
-      tests.insert(name);
-    } else {
-      errors << "No test named " << name
-             << " can be found in this test case.\n";
-    }
-  }
-
-  for (DefinedTestIter it = defined_test_names_.begin();
-       it != defined_test_names_.end();
-       ++it) {
-    if (tests.count(*it) == 0) {
-      errors << "You forgot to list test " << *it << ".\n";
-    }
-  }
-
-  const String& errors_str = errors.GetString();
-  if (errors_str != "") {
-    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
-            errors_str.c_str());
-    fflush(stderr);
-    posix::Abort();
-  }
-
-  return registered_tests;
-}
-
-#endif  // GTEST_HAS_TYPED_TEST_P
-
-}  // namespace internal
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest.cc b/unit_tests/gtest/src/gtest.cc
deleted file mode 100644
index 904d9d7..0000000
--- a/unit_tests/gtest/src/gtest.cc
+++ /dev/null
@@ -1,4898 +0,0 @@
-// Copyright 2005, Google 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest.h"
-#include "gtest/gtest-spi.h"
-
-#include <ctype.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include <algorithm>
-#include <ostream>  // NOLINT
-#include <sstream>
-#include <vector>
-
-#if GTEST_OS_LINUX
-
-// TODO(kenton at google.com): Use autoconf to detect availability of
-// gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-# include <fcntl.h>  // NOLINT
-# include <limits.h>  // NOLINT
-# include <sched.h>  // NOLINT
-// Declares vsnprintf().  This header is not available on Windows.
-# include <strings.h>  // NOLINT
-# include <sys/mman.h>  // NOLINT
-# include <sys/time.h>  // NOLINT
-# include <unistd.h>  // NOLINT
-# include <string>
-
-#elif GTEST_OS_SYMBIAN
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h>  // NOLINT
-
-#elif GTEST_OS_ZOS
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h>  // NOLINT
-
-// On z/OS we additionally need strings.h for strcasecmp.
-# include <strings.h>  // NOLINT
-
-#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
-
-# include <windows.h>  // NOLINT
-
-#elif GTEST_OS_WINDOWS  // We are on Windows proper.
-
-# include <io.h>  // NOLINT
-# include <sys/timeb.h>  // NOLINT
-# include <sys/types.h>  // NOLINT
-# include <sys/stat.h>  // NOLINT
-
-# if GTEST_OS_WINDOWS_MINGW
-// MinGW has gettimeofday() but not _ftime64().
-// TODO(kenton at google.com): Use autoconf to detect availability of
-//   gettimeofday().
-// TODO(kenton at google.com): There are other ways to get the time on
-//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
-//   supports these.  consider using them instead.
-#  define GTEST_HAS_GETTIMEOFDAY_ 1
-#  include <sys/time.h>  // NOLINT
-# endif  // GTEST_OS_WINDOWS_MINGW
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <windows.h>  // NOLINT
-
-#else
-
-// Assume other platforms have gettimeofday().
-// TODO(kenton at google.com): Use autoconf to detect availability of
-//   gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <sys/time.h>  // NOLINT
-# include <unistd.h>  // NOLINT
-
-#endif  // GTEST_OS_LINUX
-
-#if GTEST_HAS_EXCEPTIONS
-# include <stdexcept>
-#endif
-
-#if GTEST_CAN_STREAM_RESULTS_
-# include <arpa/inet.h>  // NOLINT
-# include <netdb.h>  // NOLINT
-#endif
-
-// Indicates that this translation unit is part of Google Test's
-// implementation.  It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error.  This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-#if GTEST_OS_WINDOWS
-# define vsnprintf _vsnprintf
-#endif  // GTEST_OS_WINDOWS
-
-namespace testing {
-
-using internal::CountIf;
-using internal::ForEach;
-using internal::GetElementOr;
-using internal::Shuffle;
-
-// Constants.
-
-// A test whose test case name or test name matches this filter is
-// disabled and not run.
-static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
-
-// A test case whose name matches this filter is considered a death
-// test case and will be run before test cases whose name doesn't
-// match this filter.
-static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
-
-// A test filter that matches everything.
-static const char kUniversalFilter[] = "*";
-
-// The default output file for XML output.
-static const char kDefaultOutputFile[] = "test_detail.xml";
-
-// The environment variable name for the test shard index.
-static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
-// The environment variable name for the total number of test shards.
-static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
-// The environment variable name for the test shard status file.
-static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
-
-namespace internal {
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-const char kStackTraceMarker[] = "\nStack trace:\n";
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-bool g_help_flag = false;
-
-}  // namespace internal
-
-GTEST_DEFINE_bool_(
-    also_run_disabled_tests,
-    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
-    "Run disabled tests too, in addition to the tests normally being run.");
-
-GTEST_DEFINE_bool_(
-    break_on_failure,
-    internal::BoolFromGTestEnv("break_on_failure", false),
-    "True iff a failed assertion should be a debugger break-point.");
-
-GTEST_DEFINE_bool_(
-    catch_exceptions,
-    internal::BoolFromGTestEnv("catch_exceptions", true),
-    "True iff " GTEST_NAME_
-    " should catch exceptions and treat them as test failures.");
-
-GTEST_DEFINE_string_(
-    color,
-    internal::StringFromGTestEnv("color", "auto"),
-    "Whether to use colors in the output.  Valid values: yes, no, "
-    "and auto.  'auto' means to use colors if the output is "
-    "being sent to a terminal and the TERM environment variable "
-    "is set to xterm, xterm-color, xterm-256color, linux or cygwin.");
-
-GTEST_DEFINE_string_(
-    filter,
-    internal::StringFromGTestEnv("filter", kUniversalFilter),
-    "A colon-separated list of glob (not regex) patterns "
-    "for filtering the tests to run, optionally followed by a "
-    "'-' and a : separated list of negative patterns (tests to "
-    "exclude).  A test is run if it matches one of the positive "
-    "patterns and does not match any of the negative patterns.");
-
-GTEST_DEFINE_bool_(list_tests, false,
-                   "List all tests without running them.");
-
-GTEST_DEFINE_string_(
-    output,
-    internal::StringFromGTestEnv("output", ""),
-    "A format (currently must be \"xml\"), optionally followed "
-    "by a colon and an output file name or directory. A directory "
-    "is indicated by a trailing pathname separator. "
-    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
-    "If a directory is specified, output files will be created "
-    "within that directory, with file-names based on the test "
-    "executable's name and, if necessary, made unique by adding "
-    "digits.");
-
-GTEST_DEFINE_bool_(
-    print_time,
-    internal::BoolFromGTestEnv("print_time", true),
-    "True iff " GTEST_NAME_
-    " should display elapsed time in text output.");
-
-GTEST_DEFINE_int32_(
-    random_seed,
-    internal::Int32FromGTestEnv("random_seed", 0),
-    "Random number seed to use when shuffling test orders.  Must be in range "
-    "[1, 99999], or 0 to use a seed based on the current time.");
-
-GTEST_DEFINE_int32_(
-    repeat,
-    internal::Int32FromGTestEnv("repeat", 1),
-    "How many times to repeat each test.  Specify a negative number "
-    "for repeating forever.  Useful for shaking out flaky tests.");
-
-GTEST_DEFINE_bool_(
-    show_internal_stack_frames, false,
-    "True iff " GTEST_NAME_ " should include internal stack frames when "
-    "printing test failure stack traces.");
-
-GTEST_DEFINE_bool_(
-    shuffle,
-    internal::BoolFromGTestEnv("shuffle", false),
-    "True iff " GTEST_NAME_
-    " should randomize tests' order on every run.");
-
-GTEST_DEFINE_int32_(
-    stack_trace_depth,
-    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
-    "The maximum number of stack frames to print when an "
-    "assertion fails.  The valid range is 0 through 100, inclusive.");
-
-GTEST_DEFINE_string_(
-    stream_result_to,
-    internal::StringFromGTestEnv("stream_result_to", ""),
-    "This flag specifies the host name and the port number on which to stream "
-    "test results. Example: \"localhost:555\". The flag is effective only on "
-    "Linux.");
-
-GTEST_DEFINE_bool_(
-    throw_on_failure,
-    internal::BoolFromGTestEnv("throw_on_failure", false),
-    "When this flag is specified, a failed assertion will throw an exception "
-    "if exceptions are enabled or exit the program with a non-zero code "
-    "otherwise.");
-
-namespace internal {
-
-// Generates a random number from [0, range), using a Linear
-// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
-// than kMaxRange.
-UInt32 Random::Generate(UInt32 range) {
-  // These constants are the same as are used in glibc's rand(3).
-  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
-
-  GTEST_CHECK_(range > 0)
-      << "Cannot generate a number in the range [0, 0).";
-  GTEST_CHECK_(range <= kMaxRange)
-      << "Generation of a number in [0, " << range << ") was requested, "
-      << "but this can only generate numbers in [0, " << kMaxRange << ").";
-
-  // Converting via modulus introduces a bit of downward bias, but
-  // it's simple, and a linear congruential generator isn't too good
-  // to begin with.
-  return state_ % range;
-}
-
-// GTestIsInitialized() returns true iff the user has initialized
-// Google Test.  Useful for catching the user mistake of not initializing
-// Google Test before calling RUN_ALL_TESTS().
-//
-// A user must call testing::InitGoogleTest() to initialize Google
-// Test.  g_init_gtest_count is set to the number of times
-// InitGoogleTest() has been called.  We don't protect this variable
-// under a mutex as it is only accessed in the main thread.
-int g_init_gtest_count = 0;
-static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
-
-// Iterates over a vector of TestCases, keeping a running sum of the
-// results of calling a given int-returning method on each.
-// Returns the sum.
-static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
-                               int (TestCase::*method)() const) {
-  int sum = 0;
-  for (size_t i = 0; i < case_list.size(); i++) {
-    sum += (case_list[i]->*method)();
-  }
-  return sum;
-}
-
-// Returns true iff the test case passed.
-static bool TestCasePassed(const TestCase* test_case) {
-  return test_case->should_run() && test_case->Passed();
-}
-
-// Returns true iff the test case failed.
-static bool TestCaseFailed(const TestCase* test_case) {
-  return test_case->should_run() && test_case->Failed();
-}
-
-// Returns true iff test_case contains at least one test that should
-// run.
-static bool ShouldRunTestCase(const TestCase* test_case) {
-  return test_case->should_run();
-}
-
-// AssertHelper constructor.
-AssertHelper::AssertHelper(TestPartResult::Type type,
-                           const char* file,
-                           int line,
-                           const char* message)
-    : data_(new AssertHelperData(type, file, line, message)) {
-}
-
-AssertHelper::~AssertHelper() {
-  delete data_;
-}
-
-// Message assignment, for assertion streaming support.
-void AssertHelper::operator=(const Message& message) const {
-  UnitTest::GetInstance()->
-    AddTestPartResult(data_->type, data_->file, data_->line,
-                      AppendUserMessage(data_->message, message),
-                      UnitTest::GetInstance()->impl()
-                      ->CurrentOsStackTraceExceptTop(1)
-                      // Skips the stack frame for this function itself.
-                      );  // NOLINT
-}
-
-// Mutex for linked pointers.
-GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// Application pathname gotten in InitGoogleTest.
-String g_executable_path;
-
-// Returns the current application's name, removing directory path if that
-// is present.
-FilePath GetCurrentExecutableName() {
-  FilePath result;
-
-#if GTEST_OS_WINDOWS
-  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
-#else
-  result.Set(FilePath(g_executable_path));
-#endif  // GTEST_OS_WINDOWS
-
-  return result.RemoveDirectoryName();
-}
-
-// Functions for processing the gtest_output flag.
-
-// Returns the output format, or "" for normal printed output.
-String UnitTestOptions::GetOutputFormat() {
-  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
-  if (gtest_output_flag == NULL) return String("");
-
-  const char* const colon = strchr(gtest_output_flag, ':');
-  return (colon == NULL) ?
-      String(gtest_output_flag) :
-      String(gtest_output_flag, colon - gtest_output_flag);
-}
-
-// Returns the name of the requested output file, or the default if none
-// was explicitly specified.
-String UnitTestOptions::GetAbsolutePathToOutputFile() {
-  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
-  if (gtest_output_flag == NULL)
-    return String("");
-
-  const char* const colon = strchr(gtest_output_flag, ':');
-  if (colon == NULL)
-    return String(internal::FilePath::ConcatPaths(
-               internal::FilePath(
-                   UnitTest::GetInstance()->original_working_dir()),
-               internal::FilePath(kDefaultOutputFile)).ToString() );
-
-  internal::FilePath output_name(colon + 1);
-  if (!output_name.IsAbsolutePath())
-    // TODO(wan at google.com): on Windows \some\path is not an absolute
-    // path (as its meaning depends on the current drive), yet the
-    // following logic for turning it into an absolute path is wrong.
-    // Fix it.
-    output_name = internal::FilePath::ConcatPaths(
-        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
-        internal::FilePath(colon + 1));
-
-  if (!output_name.IsDirectory())
-    return output_name.ToString();
-
-  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
-      output_name, internal::GetCurrentExecutableName(),
-      GetOutputFormat().c_str()));
-  return result.ToString();
-}
-
-// Returns true iff the wildcard pattern matches the string.  The
-// first ':' or '\0' character in pattern marks the end of it.
-//
-// This recursive algorithm isn't very efficient, but is clear and
-// works well enough for matching test names, which are short.
-bool UnitTestOptions::PatternMatchesString(const char *pattern,
-                                           const char *str) {
-  switch (*pattern) {
-    case '\0':
-    case ':':  // Either ':' or '\0' marks the end of the pattern.
-      return *str == '\0';
-    case '?':  // Matches any single character.
-      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
-    case '*':  // Matches any string (possibly empty) of characters.
-      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
-          PatternMatchesString(pattern + 1, str);
-    default:  // Non-special character.  Matches itself.
-      return *pattern == *str &&
-          PatternMatchesString(pattern + 1, str + 1);
-  }
-}
-
-bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
-  const char *cur_pattern = filter;
-  for (;;) {
-    if (PatternMatchesString(cur_pattern, name.c_str())) {
-      return true;
-    }
-
-    // Finds the next pattern in the filter.
-    cur_pattern = strchr(cur_pattern, ':');
-
-    // Returns if no more pattern can be found.
-    if (cur_pattern == NULL) {
-      return false;
-    }
-
-    // Skips the pattern separater (the ':' character).
-    cur_pattern++;
-  }
-}
-
-// TODO(keithray): move String function implementations to gtest-string.cc.
-
-// Returns true iff the user-specified filter matches the test case
-// name and the test name.
-bool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
-                                        const String &test_name) {
-  const String& full_name = String::Format("%s.%s",
-                                           test_case_name.c_str(),
-                                           test_name.c_str());
-
-  // Split --gtest_filter at '-', if there is one, to separate into
-  // positive filter and negative filter portions
-  const char* const p = GTEST_FLAG(filter).c_str();
-  const char* const dash = strchr(p, '-');
-  String positive;
-  String negative;
-  if (dash == NULL) {
-    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
-    negative = String("");
-  } else {
-    positive = String(p, dash - p);  // Everything up to the dash
-    negative = String(dash+1);       // Everything after the dash
-    if (positive.empty()) {
-      // Treat '-test1' as the same as '*-test1'
-      positive = kUniversalFilter;
-    }
-  }
-
-  // A filter is a colon-separated list of patterns.  It matches a
-  // test if any pattern in it matches the test.
-  return (MatchesFilter(full_name, positive.c_str()) &&
-          !MatchesFilter(full_name, negative.c_str()));
-}
-
-#if GTEST_HAS_SEH
-// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
-// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
-// This function is useful as an __except condition.
-int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
-  // Google Test should handle a SEH exception if:
-  //   1. the user wants it to, AND
-  //   2. this is not a breakpoint exception, AND
-  //   3. this is not a C++ exception (VC++ implements them via SEH,
-  //      apparently).
-  //
-  // SEH exception code for C++ exceptions.
-  // (see http://support.microsoft.com/kb/185294 for more information).
-  const DWORD kCxxExceptionCode = 0xe06d7363;
-
-  bool should_handle = true;
-
-  if (!GTEST_FLAG(catch_exceptions))
-    should_handle = false;
-  else if (exception_code == EXCEPTION_BREAKPOINT)
-    should_handle = false;
-  else if (exception_code == kCxxExceptionCode)
-    should_handle = false;
-
-  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
-}
-#endif  // GTEST_HAS_SEH
-
-}  // namespace internal
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test.  The 'result' parameter specifies where to report the
-// results. Intercepts only failures from the current thread.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
-    TestPartResultArray* result)
-    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
-      result_(result) {
-  Init();
-}
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test.  The 'result' parameter specifies where to report the
-// results.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
-    InterceptMode intercept_mode, TestPartResultArray* result)
-    : intercept_mode_(intercept_mode),
-      result_(result) {
-  Init();
-}
-
-void ScopedFakeTestPartResultReporter::Init() {
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
-    old_reporter_ = impl->GetGlobalTestPartResultReporter();
-    impl->SetGlobalTestPartResultReporter(this);
-  } else {
-    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
-    impl->SetTestPartResultReporterForCurrentThread(this);
-  }
-}
-
-// The d'tor restores the test part result reporter used by Google Test
-// before.
-ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
-    impl->SetGlobalTestPartResultReporter(old_reporter_);
-  } else {
-    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
-  }
-}
-
-// Increments the test part result count and remembers the result.
-// This method is from the TestPartResultReporterInterface interface.
-void ScopedFakeTestPartResultReporter::ReportTestPartResult(
-    const TestPartResult& result) {
-  result_->Append(result);
-}
-
-namespace internal {
-
-// Returns the type ID of ::testing::Test.  We should always call this
-// instead of GetTypeId< ::testing::Test>() to get the type ID of
-// testing::Test.  This is to work around a suspected linker bug when
-// using Google Test as a framework on Mac OS X.  The bug causes
-// GetTypeId< ::testing::Test>() to return different values depending
-// on whether the call is from the Google Test framework itself or
-// from user test code.  GetTestTypeId() is guaranteed to always
-// return the same value, as it always calls GetTypeId<>() from the
-// gtest.cc, which is within the Google Test framework.
-TypeId GetTestTypeId() {
-  return GetTypeId<Test>();
-}
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library.  This is solely for testing GetTestTypeId().
-extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
-
-// This predicate-formatter checks that 'results' contains a test part
-// failure of the given type and that the failure message contains the
-// given substring.
-AssertionResult HasOneFailure(const char* /* results_expr */,
-                              const char* /* type_expr */,
-                              const char* /* substr_expr */,
-                              const TestPartResultArray& results,
-                              TestPartResult::Type type,
-                              const string& substr) {
-  const String expected(type == TestPartResult::kFatalFailure ?
-                        "1 fatal failure" :
-                        "1 non-fatal failure");
-  Message msg;
-  if (results.size() != 1) {
-    msg << "Expected: " << expected << "\n"
-        << "  Actual: " << results.size() << " failures";
-    for (int i = 0; i < results.size(); i++) {
-      msg << "\n" << results.GetTestPartResult(i);
-    }
-    return AssertionFailure() << msg;
-  }
-
-  const TestPartResult& r = results.GetTestPartResult(0);
-  if (r.type() != type) {
-    return AssertionFailure() << "Expected: " << expected << "\n"
-                              << "  Actual:\n"
-                              << r;
-  }
-
-  if (strstr(r.message(), substr.c_str()) == NULL) {
-    return AssertionFailure() << "Expected: " << expected << " containing \""
-                              << substr << "\"\n"
-                              << "  Actual:\n"
-                              << r;
-  }
-
-  return AssertionSuccess();
-}
-
-// The constructor of SingleFailureChecker remembers where to look up
-// test part results, what type of failure we expect, and what
-// substring the failure message should contain.
-SingleFailureChecker:: SingleFailureChecker(
-    const TestPartResultArray* results,
-    TestPartResult::Type type,
-    const string& substr)
-    : results_(results),
-      type_(type),
-      substr_(substr) {}
-
-// The destructor of SingleFailureChecker verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring.  If that's not the case, a
-// non-fatal failure will be generated.
-SingleFailureChecker::~SingleFailureChecker() {
-  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
-}
-
-DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
-    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
-    const TestPartResult& result) {
-  unit_test_->current_test_result()->AddTestPartResult(result);
-  unit_test_->listeners()->repeater()->OnTestPartResult(result);
-}
-
-DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
-    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
-    const TestPartResult& result) {
-  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
-}
-
-// Returns the global test part result reporter.
-TestPartResultReporterInterface*
-UnitTestImpl::GetGlobalTestPartResultReporter() {
-  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
-  return global_test_part_result_repoter_;
-}
-
-// Sets the global test part result reporter.
-void UnitTestImpl::SetGlobalTestPartResultReporter(
-    TestPartResultReporterInterface* reporter) {
-  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
-  global_test_part_result_repoter_ = reporter;
-}
-
-// Returns the test part result reporter for the current thread.
-TestPartResultReporterInterface*
-UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
-  return per_thread_test_part_result_reporter_.get();
-}
-
-// Sets the test part result reporter for the current thread.
-void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
-    TestPartResultReporterInterface* reporter) {
-  per_thread_test_part_result_reporter_.set(reporter);
-}
-
-// Gets the number of successful test cases.
-int UnitTestImpl::successful_test_case_count() const {
-  return CountIf(test_cases_, TestCasePassed);
-}
-
-// Gets the number of failed test cases.
-int UnitTestImpl::failed_test_case_count() const {
-  return CountIf(test_cases_, TestCaseFailed);
-}
-
-// Gets the number of all test cases.
-int UnitTestImpl::total_test_case_count() const {
-  return static_cast<int>(test_cases_.size());
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTestImpl::test_case_to_run_count() const {
-  return CountIf(test_cases_, ShouldRunTestCase);
-}
-
-// Gets the number of successful tests.
-int UnitTestImpl::successful_test_count() const {
-  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
-}
-
-// Gets the number of failed tests.
-int UnitTestImpl::failed_test_count() const {
-  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
-}
-
-// Gets the number of disabled tests.
-int UnitTestImpl::disabled_test_count() const {
-  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
-}
-
-// Gets the number of all tests.
-int UnitTestImpl::total_test_count() const {
-  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
-}
-
-// Gets the number of tests that should run.
-int UnitTestImpl::test_to_run_count() const {
-  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag.  The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
-// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
-  (void)skip_count;
-  return String("");
-}
-
-// Returns the current time in milliseconds.
-TimeInMillis GetTimeInMillis() {
-#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
-  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
-  // http://analogous.blogspot.com/2005/04/epoch.html
-  const TimeInMillis kJavaEpochToWinFileTimeDelta =
-    static_cast<TimeInMillis>(116444736UL) * 100000UL;
-  const DWORD kTenthMicrosInMilliSecond = 10000;
-
-  SYSTEMTIME now_systime;
-  FILETIME now_filetime;
-  ULARGE_INTEGER now_int64;
-  // TODO(kenton at google.com): Shouldn't this just use
-  //   GetSystemTimeAsFileTime()?
-  GetSystemTime(&now_systime);
-  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
-    now_int64.LowPart = now_filetime.dwLowDateTime;
-    now_int64.HighPart = now_filetime.dwHighDateTime;
-    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
-      kJavaEpochToWinFileTimeDelta;
-    return now_int64.QuadPart;
-  }
-  return 0;
-#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
-  __timeb64 now;
-
-# ifdef _MSC_VER
-
-  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
-  // (deprecated function) there.
-  // TODO(kenton at google.com): Use GetTickCount()?  Or use
-  //   SystemTimeToFileTime()
-#  pragma warning(push)          // Saves the current warning state.
-#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
-  _ftime64(&now);
-#  pragma warning(pop)           // Restores the warning state.
-# else
-
-  _ftime64(&now);
-
-# endif  // _MSC_VER
-
-  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
-#elif GTEST_HAS_GETTIMEOFDAY_
-  struct timeval now;
-  gettimeofday(&now, NULL);
-  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
-#else
-# error "Don't know how to get the current time on your system."
-#endif
-}
-
-// Utilities
-
-// class String
-
-// Returns the input enclosed in double quotes if it's not NULL;
-// otherwise returns "(null)".  For example, "\"Hello\"" is returned
-// for input "Hello".
-//
-// This is useful for printing a C string in the syntax of a literal.
-//
-// Known issue: escape sequences are not handled yet.
-String String::ShowCStringQuoted(const char* c_str) {
-  return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
-}
-
-// Copies at most length characters from str into a newly-allocated
-// piece of memory of size length+1.  The memory is allocated with new[].
-// A terminating null byte is written to the memory, and a pointer to it
-// is returned.  If str is NULL, NULL is returned.
-static char* CloneString(const char* str, size_t length) {
-  if (str == NULL) {
-    return NULL;
-  } else {
-    char* const clone = new char[length + 1];
-    posix::StrNCpy(clone, str, length);
-    clone[length] = '\0';
-    return clone;
-  }
-}
-
-// Clones a 0-terminated C string, allocating memory using new.  The
-// caller is responsible for deleting[] the return value.  Returns the
-// cloned string, or NULL if the input is NULL.
-const char * String::CloneCString(const char* c_str) {
-  return (c_str == NULL) ?
-                    NULL : CloneString(c_str, strlen(c_str));
-}
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Creates a UTF-16 wide string from the given ANSI string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the wide string, or NULL if the
-// input is NULL.
-LPCWSTR String::AnsiToUtf16(const char* ansi) {
-  if (!ansi) return NULL;
-  const int length = strlen(ansi);
-  const int unicode_length =
-      MultiByteToWideChar(CP_ACP, 0, ansi, length,
-                          NULL, 0);
-  WCHAR* unicode = new WCHAR[unicode_length + 1];
-  MultiByteToWideChar(CP_ACP, 0, ansi, length,
-                      unicode, unicode_length);
-  unicode[unicode_length] = 0;
-  return unicode;
-}
-
-// Creates an ANSI string from the given wide string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the ANSI string, or NULL if the
-// input is NULL.
-const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
-  if (!utf16_str) return NULL;
-  const int ansi_length =
-      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
-                          NULL, 0, NULL, NULL);
-  char* ansi = new char[ansi_length + 1];
-  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
-                      ansi, ansi_length, NULL, NULL);
-  ansi[ansi_length] = 0;
-  return ansi;
-}
-
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
-// Compares two C strings.  Returns true iff they have the same content.
-//
-// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CStringEquals(const char * lhs, const char * rhs) {
-  if ( lhs == NULL ) return rhs == NULL;
-
-  if ( rhs == NULL ) return false;
-
-  return strcmp(lhs, rhs) == 0;
-}
-
-#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-// Converts an array of wide chars to a narrow string using the UTF-8
-// encoding, and streams the result to the given Message object.
-static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
-                                     Message* msg) {
-  // TODO(wan): consider allowing a testing::String object to
-  // contain '\0'.  This will make it behave more like std::string,
-  // and will allow ToUtf8String() to return the correct encoding
-  // for '\0' s.t. we can get rid of the conditional here (and in
-  // several other places).
-  for (size_t i = 0; i != length; ) {  // NOLINT
-    if (wstr[i] != L'\0') {
-      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
-      while (i != length && wstr[i] != L'\0')
-        i++;
-    } else {
-      *msg << '\0';
-      i++;
-    }
-  }
-}
-
-#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-}  // namespace internal
-
-#if GTEST_HAS_STD_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::std::wstring& wstr) {
-  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
-  return *this;
-}
-#endif  // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::wstring& wstr) {
-  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
-  return *this;
-}
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-// AssertionResult constructors.
-// Used in EXPECT_TRUE/FALSE(assertion_result).
-AssertionResult::AssertionResult(const AssertionResult& other)
-    : success_(other.success_),
-      message_(other.message_.get() != NULL ?
-               new ::std::string(*other.message_) :
-               static_cast< ::std::string*>(NULL)) {
-}
-
-// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
-AssertionResult AssertionResult::operator!() const {
-  AssertionResult negation(!success_);
-  if (message_.get() != NULL)
-    negation << *message_;
-  return negation;
-}
-
-// Makes a successful assertion result.
-AssertionResult AssertionSuccess() {
-  return AssertionResult(true);
-}
-
-// Makes a failed assertion result.
-AssertionResult AssertionFailure() {
-  return AssertionResult(false);
-}
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << message.
-AssertionResult AssertionFailure(const Message& message) {
-  return AssertionFailure() << message;
-}
-
-namespace internal {
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-//   expected_expression: "foo"
-//   actual_expression:   "bar"
-//   expected_value:      "5"
-//   actual_value:        "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-AssertionResult EqFailure(const char* expected_expression,
-                          const char* actual_expression,
-                          const String& expected_value,
-                          const String& actual_value,
-                          bool ignoring_case) {
-  Message msg;
-  msg << "Value of: " << actual_expression;
-  if (actual_value != actual_expression) {
-    msg << "\n  Actual: " << actual_value;
-  }
-
-  msg << "\nExpected: " << expected_expression;
-  if (ignoring_case) {
-    msg << " (ignoring case)";
-  }
-  if (expected_value != expected_expression) {
-    msg << "\nWhich is: " << expected_value;
-  }
-
-  return AssertionFailure() << msg;
-}
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,
-                                      const char* expression_text,
-                                      const char* actual_predicate_value,
-                                      const char* expected_predicate_value) {
-  const char* actual_message = assertion_result.message();
-  Message msg;
-  msg << "Value of: " << expression_text
-      << "\n  Actual: " << actual_predicate_value;
-  if (actual_message[0] != '\0')
-    msg << " (" << actual_message << ")";
-  msg << "\nExpected: " << expected_predicate_value;
-  return msg.GetString();
-}
-
-// Helper function for implementing ASSERT_NEAR.
-AssertionResult DoubleNearPredFormat(const char* expr1,
-                                     const char* expr2,
-                                     const char* abs_error_expr,
-                                     double val1,
-                                     double val2,
-                                     double abs_error) {
-  const double diff = fabs(val1 - val2);
-  if (diff <= abs_error) return AssertionSuccess();
-
-  // TODO(wan): do not print the value of an expression if it's
-  // already a literal.
-  return AssertionFailure()
-      << "The difference between " << expr1 << " and " << expr2
-      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
-      << expr1 << " evaluates to " << val1 << ",\n"
-      << expr2 << " evaluates to " << val2 << ", and\n"
-      << abs_error_expr << " evaluates to " << abs_error << ".";
-}
-
-
-// Helper template for implementing FloatLE() and DoubleLE().
-template <typename RawType>
-AssertionResult FloatingPointLE(const char* expr1,
-                                const char* expr2,
-                                RawType val1,
-                                RawType val2) {
-  // Returns success if val1 is less than val2,
-  if (val1 < val2) {
-    return AssertionSuccess();
-  }
-
-  // or if val1 is almost equal to val2.
-  const FloatingPoint<RawType> lhs(val1), rhs(val2);
-  if (lhs.AlmostEquals(rhs)) {
-    return AssertionSuccess();
-  }
-
-  // Note that the above two checks will both fail if either val1 or
-  // val2 is NaN, as the IEEE floating-point standard requires that
-  // any predicate involving a NaN must return false.
-
-  ::std::stringstream val1_ss;
-  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
-          << val1;
-
-  ::std::stringstream val2_ss;
-  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
-          << val2;
-
-  return AssertionFailure()
-      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
-      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
-      << StringStreamToString(&val2_ss);
-}
-
-}  // namespace internal
-
-// Asserts that val1 is less than, or almost equal to, val2.  Fails
-// otherwise.  In particular, it fails if either val1 or val2 is NaN.
-AssertionResult FloatLE(const char* expr1, const char* expr2,
-                        float val1, float val2) {
-  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
-}
-
-// Asserts that val1 is less than, or almost equal to, val2.  Fails
-// otherwise.  In particular, it fails if either val1 or val2 is NaN.
-AssertionResult DoubleLE(const char* expr1, const char* expr2,
-                         double val1, double val2) {
-  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
-}
-
-namespace internal {
-
-// The helper function for {ASSERT|EXPECT}_EQ with int or enum
-// arguments.
-AssertionResult CmpHelperEQ(const char* expected_expression,
-                            const char* actual_expression,
-                            BiggestInt expected,
-                            BiggestInt actual) {
-  if (expected == actual) {
-    return AssertionSuccess();
-  }
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   FormatForComparisonFailureMessage(expected, actual),
-                   FormatForComparisonFailureMessage(actual, expected),
-                   false);
-}
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
-// just to avoid copy-and-paste of similar code.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
-                                   BiggestInt val1, BiggestInt val2) {\
-  if (val1 op val2) {\
-    return AssertionSuccess();\
-  } else {\
-    return AssertionFailure() \
-        << "Expected: (" << expr1 << ") " #op " (" << expr2\
-        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
-        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
-  }\
-}
-
-// Implements the helper function for {ASSERT|EXPECT}_NE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(NE, !=)
-// Implements the helper function for {ASSERT|EXPECT}_LE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LE, <=)
-// Implements the helper function for {ASSERT|EXPECT}_LT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LT, < )
-// Implements the helper function for {ASSERT|EXPECT}_GE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GE, >=)
-// Implements the helper function for {ASSERT|EXPECT}_GT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GT, > )
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
-                               const char* actual_expression,
-                               const char* expected,
-                               const char* actual) {
-  if (String::CStringEquals(expected, actual)) {
-    return AssertionSuccess();
-  }
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   String::ShowCStringQuoted(expected),
-                   String::ShowCStringQuoted(actual),
-                   false);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
-                                   const char* actual_expression,
-                                   const char* expected,
-                                   const char* actual) {
-  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
-    return AssertionSuccess();
-  }
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   String::ShowCStringQuoted(expected),
-                   String::ShowCStringQuoted(actual),
-                   true);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
-                               const char* s2_expression,
-                               const char* s1,
-                               const char* s2) {
-  if (!String::CStringEquals(s1, s2)) {
-    return AssertionSuccess();
-  } else {
-    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
-                              << s2_expression << "), actual: \""
-                              << s1 << "\" vs \"" << s2 << "\"";
-  }
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
-                                   const char* s2_expression,
-                                   const char* s1,
-                                   const char* s2) {
-  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
-    return AssertionSuccess();
-  } else {
-    return AssertionFailure()
-        << "Expected: (" << s1_expression << ") != ("
-        << s2_expression << ") (ignoring case), actual: \""
-        << s1 << "\" vs \"" << s2 << "\"";
-  }
-}
-
-}  // namespace internal
-
-namespace {
-
-// Helper functions for implementing IsSubString() and IsNotSubstring().
-
-// This group of overloaded functions return true iff needle is a
-// substring of haystack.  NULL is considered a substring of itself
-// only.
-
-bool IsSubstringPred(const char* needle, const char* haystack) {
-  if (needle == NULL || haystack == NULL)
-    return needle == haystack;
-
-  return strstr(haystack, needle) != NULL;
-}
-
-bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
-  if (needle == NULL || haystack == NULL)
-    return needle == haystack;
-
-  return wcsstr(haystack, needle) != NULL;
-}
-
-// StringType here can be either ::std::string or ::std::wstring.
-template <typename StringType>
-bool IsSubstringPred(const StringType& needle,
-                     const StringType& haystack) {
-  return haystack.find(needle) != StringType::npos;
-}
-
-// This function implements either IsSubstring() or IsNotSubstring(),
-// depending on the value of the expected_to_be_substring parameter.
-// StringType here can be const char*, const wchar_t*, ::std::string,
-// or ::std::wstring.
-template <typename StringType>
-AssertionResult IsSubstringImpl(
-    bool expected_to_be_substring,
-    const char* needle_expr, const char* haystack_expr,
-    const StringType& needle, const StringType& haystack) {
-  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
-    return AssertionSuccess();
-
-  const bool is_wide_string = sizeof(needle[0]) > 1;
-  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
-  return AssertionFailure()
-      << "Value of: " << needle_expr << "\n"
-      << "  Actual: " << begin_string_quote << needle << "\"\n"
-      << "Expected: " << (expected_to_be_substring ? "" : "not ")
-      << "a substring of " << haystack_expr << "\n"
-      << "Which is: " << begin_string_quote << haystack << "\"";
-}
-
-}  // namespace
-
-// IsSubstring() and IsNotSubstring() check whether needle is a
-// substring of haystack (NULL is considered a substring of itself
-// only), and return an appropriate error message when they fail.
-
-AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const char* needle, const char* haystack) {
-  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const wchar_t* needle, const wchar_t* haystack) {
-  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const char* needle, const char* haystack) {
-  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const wchar_t* needle, const wchar_t* haystack) {
-  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::string& needle, const ::std::string& haystack) {
-  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::string& needle, const ::std::string& haystack) {
-  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-#if GTEST_HAS_STD_WSTRING
-AssertionResult IsSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::wstring& needle, const ::std::wstring& haystack) {
-  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
-    const char* needle_expr, const char* haystack_expr,
-    const ::std::wstring& needle, const ::std::wstring& haystack) {
-  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-#endif  // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-
-namespace {
-
-// Helper function for IsHRESULT{SuccessFailure} predicates
-AssertionResult HRESULTFailureHelper(const char* expr,
-                                     const char* expected,
-                                     long hr) {  // NOLINT
-# if GTEST_OS_WINDOWS_MOBILE
-
-  // Windows CE doesn't support FormatMessage.
-  const char error_text[] = "";
-
-# else
-
-  // Looks up the human-readable system message for the HRESULT code
-  // and since we're not passing any params to FormatMessage, we don't
-  // want inserts expanded.
-  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
-                       FORMAT_MESSAGE_IGNORE_INSERTS;
-  const DWORD kBufSize = 4096;  // String::Format can't exceed this length.
-  // Gets the system's human readable message string for this HRESULT.
-  char error_text[kBufSize] = { '\0' };
-  DWORD message_length = ::FormatMessageA(kFlags,
-                                          0,  // no source, we're asking system
-                                          hr,  // the error
-                                          0,  // no line width restrictions
-                                          error_text,  // output buffer
-                                          kBufSize,  // buf size
-                                          NULL);  // no arguments for inserts
-  // Trims tailing white space (FormatMessage leaves a trailing cr-lf)
-  for (; message_length && IsSpace(error_text[message_length - 1]);
-          --message_length) {
-    error_text[message_length - 1] = '\0';
-  }
-
-# endif  // GTEST_OS_WINDOWS_MOBILE
-
-  const String error_hex(String::Format("0x%08X ", hr));
-  return ::testing::AssertionFailure()
-      << "Expected: " << expr << " " << expected << ".\n"
-      << "  Actual: " << error_hex << error_text << "\n";
-}
-
-}  // namespace
-
-AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
-  if (SUCCEEDED(hr)) {
-    return AssertionSuccess();
-  }
-  return HRESULTFailureHelper(expr, "succeeds", hr);
-}
-
-AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
-  if (FAILED(hr)) {
-    return AssertionSuccess();
-  }
-  return HRESULTFailureHelper(expr, "fails", hr);
-}
-
-#endif  // GTEST_OS_WINDOWS
-
-// Utility functions for encoding Unicode text (wide strings) in
-// UTF-8.
-
-// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
-// like this:
-//
-// Code-point length   Encoding
-//   0 -  7 bits       0xxxxxxx
-//   8 - 11 bits       110xxxxx 10xxxxxx
-//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
-//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
-// The maximum code-point a one-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
-
-// The maximum code-point a two-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
-
-// The maximum code-point a three-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
-
-// The maximum code-point a four-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
-
-// Chops off the n lowest bits from a bit pattern.  Returns the n
-// lowest bits.  As a side effect, the original bit pattern will be
-// shifted to the right by n bits.
-inline UInt32 ChopLowBits(UInt32* bits, int n) {
-  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
-  *bits >>= n;
-  return low_bits;
-}
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-char* CodePointToUtf8(UInt32 code_point, char* str) {
-  if (code_point <= kMaxCodePoint1) {
-    str[1] = '\0';
-    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
-  } else if (code_point <= kMaxCodePoint2) {
-    str[2] = '\0';
-    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
-  } else if (code_point <= kMaxCodePoint3) {
-    str[3] = '\0';
-    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
-  } else if (code_point <= kMaxCodePoint4) {
-    str[4] = '\0';
-    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
-    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
-  } else {
-    // The longest string String::Format can produce when invoked
-    // with these parameters is 28 character long (not including
-    // the terminating nul character). We are asking for 32 character
-    // buffer just in case. This is also enough for strncpy to
-    // null-terminate the destination string.
-    posix::StrNCpy(
-        str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32);
-    str[31] = '\0';  // Makes sure no change in the format to strncpy leaves
-                     // the result unterminated.
-  }
-  return str;
-}
-
-// The following two functions only make sense if the the system
-// uses UTF-16 for wide string encoding. All supported systems
-// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
-
-// Determines if the arguments constitute UTF-16 surrogate pair
-// and thus should be combined into a single Unicode code point
-// using CreateCodePointFromUtf16SurrogatePair.
-inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
-  return sizeof(wchar_t) == 2 &&
-      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
-}
-
-// Creates a Unicode code point from UTF16 surrogate pair.
-inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
-                                                    wchar_t second) {
-  const UInt32 mask = (1 << 10) - 1;
-  return (sizeof(wchar_t) == 2) ?
-      (((first & mask) << 10) | (second & mask)) + 0x10000 :
-      // This function should not be called when the condition is
-      // false, but we provide a sensible default in case it is.
-      static_cast<UInt32>(first);
-}
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-String WideStringToUtf8(const wchar_t* str, int num_chars) {
-  if (num_chars == -1)
-    num_chars = static_cast<int>(wcslen(str));
-
-  ::std::stringstream stream;
-  for (int i = 0; i < num_chars; ++i) {
-    UInt32 unicode_code_point;
-
-    if (str[i] == L'\0') {
-      break;
-    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
-      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
-                                                                 str[i + 1]);
-      i++;
-    } else {
-      unicode_code_point = static_cast<UInt32>(str[i]);
-    }
-
-    char buffer[32];  // CodePointToUtf8 requires a buffer this big.
-    stream << CodePointToUtf8(unicode_code_point, buffer);
-  }
-  return StringStreamToString(&stream);
-}
-
-// Converts a wide C string to a String using the UTF-8 encoding.
-// NULL will be converted to "(null)".
-String String::ShowWideCString(const wchar_t * wide_c_str) {
-  if (wide_c_str == NULL) return String("(null)");
-
-  return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
-}
-
-// Similar to ShowWideCString(), except that this function encloses
-// the converted string in double quotes.
-String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
-  if (wide_c_str == NULL) return String("(null)");
-
-  return String::Format("L\"%s\"",
-                        String::ShowWideCString(wide_c_str).c_str());
-}
-
-// Compares two wide C strings.  Returns true iff they have the same
-// content.
-//
-// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
-  if (lhs == NULL) return rhs == NULL;
-
-  if (rhs == NULL) return false;
-
-  return wcscmp(lhs, rhs) == 0;
-}
-
-// Helper function for *_STREQ on wide strings.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
-                               const char* actual_expression,
-                               const wchar_t* expected,
-                               const wchar_t* actual) {
-  if (String::WideCStringEquals(expected, actual)) {
-    return AssertionSuccess();
-  }
-
-  return EqFailure(expected_expression,
-                   actual_expression,
-                   String::ShowWideCStringQuoted(expected),
-                   String::ShowWideCStringQuoted(actual),
-                   false);
-}
-
-// Helper function for *_STRNE on wide strings.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
-                               const char* s2_expression,
-                               const wchar_t* s1,
-                               const wchar_t* s2) {
-  if (!String::WideCStringEquals(s1, s2)) {
-    return AssertionSuccess();
-  }
-
-  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
-                            << s2_expression << "), actual: "
-                            << String::ShowWideCStringQuoted(s1)
-                            << " vs " << String::ShowWideCStringQuoted(s2);
-}
-
-// Compares two C strings, ignoring case.  Returns true iff they have
-// the same content.
-//
-// Unlike strcasecmp(), this function can handle NULL argument(s).  A
-// NULL C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
-  if (lhs == NULL)
-    return rhs == NULL;
-  if (rhs == NULL)
-    return false;
-  return posix::StrCaseCmp(lhs, rhs) == 0;
-}
-
-  // Compares two wide C strings, ignoring case.  Returns true iff they
-  // have the same content.
-  //
-  // Unlike wcscasecmp(), this function can handle NULL argument(s).
-  // A NULL C string is considered different to any non-NULL wide C string,
-  // including the empty string.
-  // NB: The implementations on different platforms slightly differ.
-  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
-  // environment variable. On GNU platform this method uses wcscasecmp
-  // which compares according to LC_CTYPE category of the current locale.
-  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
-  // current locale.
-bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
-                                              const wchar_t* rhs) {
-  if (lhs == NULL) return rhs == NULL;
-
-  if (rhs == NULL) return false;
-
-#if GTEST_OS_WINDOWS
-  return _wcsicmp(lhs, rhs) == 0;
-#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
-  return wcscasecmp(lhs, rhs) == 0;
-#else
-  // Android, Mac OS X and Cygwin don't define wcscasecmp.
-  // Other unknown OSes may not define it either.
-  wint_t left, right;
-  do {
-    left = towlower(*lhs++);
-    right = towlower(*rhs++);
-  } while (left && left == right);
-  return left == right;
-#endif  // OS selector
-}
-
-// Compares this with another String.
-// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-// if this is greater than rhs.
-int String::Compare(const String & rhs) const {
-  const char* const lhs_c_str = c_str();
-  const char* const rhs_c_str = rhs.c_str();
-
-  if (lhs_c_str == NULL) {
-    return rhs_c_str == NULL ? 0 : -1;  // NULL < anything except NULL
-  } else if (rhs_c_str == NULL) {
-    return 1;
-  }
-
-  const size_t shorter_str_len =
-      length() <= rhs.length() ? length() : rhs.length();
-  for (size_t i = 0; i != shorter_str_len; i++) {
-    if (lhs_c_str[i] < rhs_c_str[i]) {
-      return -1;
-    } else if (lhs_c_str[i] > rhs_c_str[i]) {
-      return 1;
-    }
-  }
-  return (length() < rhs.length()) ? -1 :
-      (length() > rhs.length()) ? 1 : 0;
-}
-
-// Returns true iff this String ends with the given suffix.  *Any*
-// String is considered to end with a NULL or empty suffix.
-bool String::EndsWith(const char* suffix) const {
-  if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
-  if (c_str() == NULL) return false;
-
-  const size_t this_len = strlen(c_str());
-  const size_t suffix_len = strlen(suffix);
-  return (this_len >= suffix_len) &&
-         CStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Returns true iff this String ends with the given suffix, ignoring case.
-// Any String is considered to end with a NULL or empty suffix.
-bool String::EndsWithCaseInsensitive(const char* suffix) const {
-  if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
-  if (c_str() == NULL) return false;
-
-  const size_t this_len = strlen(c_str());
-  const size_t suffix_len = strlen(suffix);
-  return (this_len >= suffix_len) &&
-         CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Formats a list of arguments to a String, using the same format
-// spec string as for printf.
-//
-// We do not use the StringPrintf class as it is not universally
-// available.
-//
-// The result is limited to 4096 characters (including the tailing 0).
-// If 4096 characters are not enough to format the input, or if
-// there's an error, "<formatting error or buffer exceeded>" is
-// returned.
-String String::Format(const char * format, ...) {
-  va_list args;
-  va_start(args, format);
-
-  char buffer[4096];
-  const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);
-
-  // MSVC 8 deprecates vsnprintf(), so we want to suppress warning
-  // 4996 (deprecated function) there.
-#ifdef _MSC_VER  // We are using MSVC.
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4996)  // Temporarily disables warning 4996.
-
-  const int size = vsnprintf(buffer, kBufferSize, format, args);
-
-# pragma warning(pop)           // Restores the warning state.
-#else  // We are not using MSVC.
-  const int size = vsnprintf(buffer, kBufferSize, format, args);
-#endif  // _MSC_VER
-  va_end(args);
-
-  // vsnprintf()'s behavior is not portable.  When the buffer is not
-  // big enough, it returns a negative value in MSVC, and returns the
-  // needed buffer size on Linux.  When there is an output error, it
-  // always returns a negative value.  For simplicity, we lump the two
-  // error cases together.
-  if (size < 0 || size >= kBufferSize) {
-    return String("<formatting error or buffer exceeded>");
-  } else {
-    return String(buffer, size);
-  }
-}
-
-// Converts the buffer in a stringstream to a String, converting NUL
-// bytes to "\\0" along the way.
-String StringStreamToString(::std::stringstream* ss) {
-  const ::std::string& str = ss->str();
-  const char* const start = str.c_str();
-  const char* const end = start + str.length();
-
-  // We need to use a helper stringstream to do this transformation
-  // because String doesn't support push_back().
-  ::std::stringstream helper;
-  for (const char* ch = start; ch != end; ++ch) {
-    if (*ch == '\0') {
-      helper << "\\0";  // Replaces NUL with "\\0";
-    } else {
-      helper.put(*ch);
-    }
-  }
-
-  return String(helper.str().c_str());
-}
-
-// Appends the user-supplied message to the Google-Test-generated message.
-String AppendUserMessage(const String& gtest_msg,
-                         const Message& user_msg) {
-  // Appends the user message if it's non-empty.
-  const String user_msg_string = user_msg.GetString();
-  if (user_msg_string.empty()) {
-    return gtest_msg;
-  }
-
-  Message msg;
-  msg << gtest_msg << "\n" << user_msg_string;
-
-  return msg.GetString();
-}
-
-}  // namespace internal
-
-// class TestResult
-
-// Creates an empty TestResult.
-TestResult::TestResult()
-    : death_test_count_(0),
-      elapsed_time_(0) {
-}
-
-// D'tor.
-TestResult::~TestResult() {
-}
-
-// Returns the i-th test part result among all the results. i can
-// range from 0 to total_part_count() - 1. If i is not in that range,
-// aborts the program.
-const TestPartResult& TestResult::GetTestPartResult(int i) const {
-  if (i < 0 || i >= total_part_count())
-    internal::posix::Abort();
-  return test_part_results_.at(i);
-}
-
-// Returns the i-th test property. i can range from 0 to
-// test_property_count() - 1. If i is not in that range, aborts the
-// program.
-const TestProperty& TestResult::GetTestProperty(int i) const {
-  if (i < 0 || i >= test_property_count())
-    internal::posix::Abort();
-  return test_properties_.at(i);
-}
-
-// Clears the test part results.
-void TestResult::ClearTestPartResults() {
-  test_part_results_.clear();
-}
-
-// Adds a test part result to the list.
-void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
-  test_part_results_.push_back(test_part_result);
-}
-
-// Adds a test property to the list. If a property with the same key as the
-// supplied property is already represented, the value of this test_property
-// replaces the old value for that key.
-void TestResult::RecordProperty(const TestProperty& test_property) {
-  if (!ValidateTestProperty(test_property)) {
-    return;
-  }
-  internal::MutexLock lock(&test_properites_mutex_);
-  const std::vector<TestProperty>::iterator property_with_matching_key =
-      std::find_if(test_properties_.begin(), test_properties_.end(),
-                   internal::TestPropertyKeyIs(test_property.key()));
-  if (property_with_matching_key == test_properties_.end()) {
-    test_properties_.push_back(test_property);
-    return;
-  }
-  property_with_matching_key->SetValue(test_property.value());
-}
-
-// Adds a failure if the key is a reserved attribute of Google Test
-// testcase tags.  Returns true if the property is valid.
-bool TestResult::ValidateTestProperty(const TestProperty& test_property) {
-  internal::String key(test_property.key());
-  if (key == "name" || key == "status" || key == "time" || key == "classname") {
-    ADD_FAILURE()
-        << "Reserved key used in RecordProperty(): "
-        << key
-        << " ('name', 'status', 'time', and 'classname' are reserved by "
-        << GTEST_NAME_ << ")";
-    return false;
-  }
-  return true;
-}
-
-// Clears the object.
-void TestResult::Clear() {
-  test_part_results_.clear();
-  test_properties_.clear();
-  death_test_count_ = 0;
-  elapsed_time_ = 0;
-}
-
-// Returns true iff the test failed.
-bool TestResult::Failed() const {
-  for (int i = 0; i < total_part_count(); ++i) {
-    if (GetTestPartResult(i).failed())
-      return true;
-  }
-  return false;
-}
-
-// Returns true iff the test part fatally failed.
-static bool TestPartFatallyFailed(const TestPartResult& result) {
-  return result.fatally_failed();
-}
-
-// Returns true iff the test fatally failed.
-bool TestResult::HasFatalFailure() const {
-  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
-}
-
-// Returns true iff the test part non-fatally failed.
-static bool TestPartNonfatallyFailed(const TestPartResult& result) {
-  return result.nonfatally_failed();
-}
-
-// Returns true iff the test has a non-fatal failure.
-bool TestResult::HasNonfatalFailure() const {
-  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
-}
-
-// Gets the number of all test parts.  This is the sum of the number
-// of successful test parts and the number of failed test parts.
-int TestResult::total_part_count() const {
-  return static_cast<int>(test_part_results_.size());
-}
-
-// Returns the number of the test properties.
-int TestResult::test_property_count() const {
-  return static_cast<int>(test_properties_.size());
-}
-
-// class Test
-
-// Creates a Test object.
-
-// The c'tor saves the values of all Google Test flags.
-Test::Test()
-    : gtest_flag_saver_(new internal::GTestFlagSaver) {
-}
-
-// The d'tor restores the values of all Google Test flags.
-Test::~Test() {
-  delete gtest_flag_saver_;
-}
-
-// Sets up the test fixture.
-//
-// A sub-class may override this.
-void Test::SetUp() {
-}
-
-// Tears down the test fixture.
-//
-// A sub-class may override this.
-void Test::TearDown() {
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, const char* value) {
-  UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, int value) {
-  Message value_message;
-  value_message << value;
-  RecordProperty(key, value_message.GetString().c_str());
-}
-
-namespace internal {
-
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
-                                    const String& message) {
-  // This function is a friend of UnitTest and as such has access to
-  // AddTestPartResult.
-  UnitTest::GetInstance()->AddTestPartResult(
-      result_type,
-      NULL,  // No info about the source file where the exception occurred.
-      -1,    // We have no info on which line caused the exception.
-      message,
-      String());  // No stack trace, either.
-}
-
-}  // namespace internal
-
-// Google Test requires all tests in the same test case to use the same test
-// fixture class.  This function checks if the current test has the
-// same fixture class as the first test in the current test case.  If
-// yes, it returns true; otherwise it generates a Google Test failure and
-// returns false.
-bool Test::HasSameFixtureClass() {
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  const TestCase* const test_case = impl->current_test_case();
-
-  // Info about the first test in the current test case.
-  const TestInfo* const first_test_info = test_case->test_info_list()[0];
-  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
-  const char* const first_test_name = first_test_info->name();
-
-  // Info about the current test.
-  const TestInfo* const this_test_info = impl->current_test_info();
-  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
-  const char* const this_test_name = this_test_info->name();
-
-  if (this_fixture_id != first_fixture_id) {
-    // Is the first test defined using TEST?
-    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
-    // Is this test defined using TEST?
-    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
-
-    if (first_is_TEST || this_is_TEST) {
-      // The user mixed TEST and TEST_F in this test case - we'll tell
-      // him/her how to fix it.
-
-      // Gets the name of the TEST and the name of the TEST_F.  Note
-      // that first_is_TEST and this_is_TEST cannot both be true, as
-      // the fixture IDs are different for the two tests.
-      const char* const TEST_name =
-          first_is_TEST ? first_test_name : this_test_name;
-      const char* const TEST_F_name =
-          first_is_TEST ? this_test_name : first_test_name;
-
-      ADD_FAILURE()
-          << "All tests in the same test case must use the same test fixture\n"
-          << "class, so mixing TEST_F and TEST in the same test case is\n"
-          << "illegal.  In test case " << this_test_info->test_case_name()
-          << ",\n"
-          << "test " << TEST_F_name << " is defined using TEST_F but\n"
-          << "test " << TEST_name << " is defined using TEST.  You probably\n"
-          << "want to change the TEST to TEST_F or move it to another test\n"
-          << "case.";
-    } else {
-      // The user defined two fixture classes with the same name in
-      // two namespaces - we'll tell him/her how to fix it.
-      ADD_FAILURE()
-          << "All tests in the same test case must use the same test fixture\n"
-          << "class.  However, in test case "
-          << this_test_info->test_case_name() << ",\n"
-          << "you defined test " << first_test_name
-          << " and test " << this_test_name << "\n"
-          << "using two different test fixture classes.  This can happen if\n"
-          << "the two classes are from different namespaces or translation\n"
-          << "units and have the same name.  You should probably rename one\n"
-          << "of the classes to put the tests into different test cases.";
-    }
-    return false;
-  }
-
-  return true;
-}
-
-#if GTEST_HAS_SEH
-
-// Adds an "exception thrown" fatal failure to the current test.  This
-// function returns its result via an output parameter pointer because VC++
-// prohibits creation of objects with destructors on stack in functions
-// using __try (see error C2712).
-static internal::String* FormatSehExceptionMessage(DWORD exception_code,
-                                                   const char* location) {
-  Message message;
-  message << "SEH exception with code 0x" << std::setbase(16) <<
-    exception_code << std::setbase(10) << " thrown in " << location << ".";
-
-  return new internal::String(message.GetString());
-}
-
-#endif  // GTEST_HAS_SEH
-
-#if GTEST_HAS_EXCEPTIONS
-
-// Adds an "exception thrown" fatal failure to the current test.
-static internal::String FormatCxxExceptionMessage(const char* description,
-                                                  const char* location) {
-  Message message;
-  if (description != NULL) {
-    message << "C++ exception with description \"" << description << "\"";
-  } else {
-    message << "Unknown C++ exception";
-  }
-  message << " thrown in " << location << ".";
-
-  return message.GetString();
-}
-
-static internal::String PrintTestPartResultToString(
-    const TestPartResult& test_part_result);
-
-// A failed Google Test assertion will throw an exception of this type when
-// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled).  We
-// derive it from std::runtime_error, which is for errors presumably
-// detectable only at run time.  Since std::runtime_error inherits from
-// std::exception, many testing frameworks know how to extract and print the
-// message inside it.
-class GoogleTestFailureException : public ::std::runtime_error {
- public:
-  explicit GoogleTestFailureException(const TestPartResult& failure)
-      : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
-};
-#endif  // GTEST_HAS_EXCEPTIONS
-
-namespace internal {
-// We put these helper functions in the internal namespace as IBM's xlC
-// compiler rejects the code if they were declared static.
-
-// Runs the given method and handles SEH exceptions it throws, when
-// SEH is supported; returns the 0-value for type Result in case of an
-// SEH exception.  (Microsoft compilers cannot handle SEH and C++
-// exceptions in the same function.  Therefore, we provide a separate
-// wrapper function for handling SEH exceptions.)
-template <class T, typename Result>
-Result HandleSehExceptionsInMethodIfSupported(
-    T* object, Result (T::*method)(), const char* location) {
-#if GTEST_HAS_SEH
-  __try {
-    return (object->*method)();
-  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
-      GetExceptionCode())) {
-    // We create the exception message on the heap because VC++ prohibits
-    // creation of objects with destructors on stack in functions using __try
-    // (see error C2712).
-    internal::String* exception_message = FormatSehExceptionMessage(
-        GetExceptionCode(), location);
-    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
-                                             *exception_message);
-    delete exception_message;
-    return static_cast<Result>(0);
-  }
-#else
-  (void)location;
-  return (object->*method)();
-#endif  // GTEST_HAS_SEH
-}
-
-// Runs the given method and catches and reports C++ and/or SEH-style
-// exceptions, if they are supported; returns the 0-value for type
-// Result in case of an SEH exception.
-template <class T, typename Result>
-Result HandleExceptionsInMethodIfSupported(
-    T* object, Result (T::*method)(), const char* location) {
-  // NOTE: The user code can affect the way in which Google Test handles
-  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
-  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
-  // after the exception is caught and either report or re-throw the
-  // exception based on the flag's value:
-  //
-  // try {
-  //   // Perform the test method.
-  // } catch (...) {
-  //   if (GTEST_FLAG(catch_exceptions))
-  //     // Report the exception as failure.
-  //   else
-  //     throw;  // Re-throws the original exception.
-  // }
-  //
-  // However, the purpose of this flag is to allow the program to drop into
-  // the debugger when the exception is thrown. On most platforms, once the
-  // control enters the catch block, the exception origin information is
-  // lost and the debugger will stop the program at the point of the
-  // re-throw in this function -- instead of at the point of the original
-  // throw statement in the code under test.  For this reason, we perform
-  // the check early, sacrificing the ability to affect Google Test's
-  // exception handling in the method where the exception is thrown.
-  if (internal::GetUnitTestImpl()->catch_exceptions()) {
-#if GTEST_HAS_EXCEPTIONS
-    try {
-      return HandleSehExceptionsInMethodIfSupported(object, method, location);
-    } catch (const GoogleTestFailureException&) {  // NOLINT
-      // This exception doesn't originate in code under test. It makes no
-      // sense to report it as a test failure.
-      throw;
-    } catch (const std::exception& e) {  // NOLINT
-      internal::ReportFailureInUnknownLocation(
-          TestPartResult::kFatalFailure,
-          FormatCxxExceptionMessage(e.what(), location));
-    } catch (...) {  // NOLINT
-      internal::ReportFailureInUnknownLocation(
-          TestPartResult::kFatalFailure,
-          FormatCxxExceptionMessage(NULL, location));
-    }
-    return static_cast<Result>(0);
-#else
-    return HandleSehExceptionsInMethodIfSupported(object, method, location);
-#endif  // GTEST_HAS_EXCEPTIONS
-  } else {
-    return (object->*method)();
-  }
-}
-
-}  // namespace internal
-
-// Runs the test and updates the test result.
-void Test::Run() {
-  if (!HasSameFixtureClass()) return;
-
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
-  // We will run the test only if SetUp() was successful.
-  if (!HasFatalFailure()) {
-    impl->os_stack_trace_getter()->UponLeavingGTest();
-    internal::HandleExceptionsInMethodIfSupported(
-        this, &Test::TestBody, "the test body");
-  }
-
-  // However, we want to clean up as much as possible.  Hence we will
-  // always call TearDown(), even if SetUp() or the test body has
-  // failed.
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-  internal::HandleExceptionsInMethodIfSupported(
-      this, &Test::TearDown, "TearDown()");
-}
-
-// Returns true iff the current test has a fatal failure.
-bool Test::HasFatalFailure() {
-  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
-}
-
-// Returns true iff the current test has a non-fatal failure.
-bool Test::HasNonfatalFailure() {
-  return internal::GetUnitTestImpl()->current_test_result()->
-      HasNonfatalFailure();
-}
-
-// class TestInfo
-
-// Constructs a TestInfo object. It assumes ownership of the test factory
-// object.
-// TODO(vladl at google.com): Make a_test_case_name and a_name const string&'s
-// to signify they cannot be NULLs.
-TestInfo::TestInfo(const char* a_test_case_name,
-                   const char* a_name,
-                   const char* a_type_param,
-                   const char* a_value_param,
-                   internal::TypeId fixture_class_id,
-                   internal::TestFactoryBase* factory)
-    : test_case_name_(a_test_case_name),
-      name_(a_name),
-      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
-      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
-      fixture_class_id_(fixture_class_id),
-      should_run_(false),
-      is_disabled_(false),
-      matches_filter_(false),
-      factory_(factory),
-      result_() {}
-
-// Destructs a TestInfo object.
-TestInfo::~TestInfo() { delete factory_; }
-
-namespace internal {
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-//   test_case_name:   name of the test case
-//   name:             name of the test
-//   type_param:       the name of the test's type parameter, or NULL if
-//                     this is not a typed or a type-parameterized test.
-//   value_param:      text representation of the test's value parameter,
-//                     or NULL if this is not a value-parameterized test.
-//   fixture_class_id: ID of the test fixture class
-//   set_up_tc:        pointer to the function that sets up the test case
-//   tear_down_tc:     pointer to the function that tears down the test case
-//   factory:          pointer to the factory that creates a test object.
-//                     The newly created TestInfo instance will assume
-//                     ownership of the factory object.
-TestInfo* MakeAndRegisterTestInfo(
-    const char* test_case_name, const char* name,
-    const char* type_param,
-    const char* value_param,
-    TypeId fixture_class_id,
-    SetUpTestCaseFunc set_up_tc,
-    TearDownTestCaseFunc tear_down_tc,
-    TestFactoryBase* factory) {
-  TestInfo* const test_info =
-      new TestInfo(test_case_name, name, type_param, value_param,
-                   fixture_class_id, factory);
-  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
-  return test_info;
-}
-
-#if GTEST_HAS_PARAM_TEST
-void ReportInvalidTestCaseType(const char* test_case_name,
-                               const char* file, int line) {
-  Message errors;
-  errors
-      << "Attempted redefinition of test case " << test_case_name << ".\n"
-      << "All tests in the same test case must use the same test fixture\n"
-      << "class.  However, in test case " << test_case_name << ", you tried\n"
-      << "to define a test using a fixture class different from the one\n"
-      << "used earlier. This can happen if the two fixture classes are\n"
-      << "from different namespaces and have the same name. You should\n"
-      << "probably rename one of the classes to put the tests into different\n"
-      << "test cases.";
-
-  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
-          errors.GetString().c_str());
-}
-#endif  // GTEST_HAS_PARAM_TEST
-
-}  // namespace internal
-
-namespace {
-
-// A predicate that checks the test name of a TestInfo against a known
-// value.
-//
-// This is used for implementation of the TestCase class only.  We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestNameIs is copyable.
-class TestNameIs {
- public:
-  // Constructor.
-  //
-  // TestNameIs has NO default constructor.
-  explicit TestNameIs(const char* name)
-      : name_(name) {}
-
-  // Returns true iff the test name of test_info matches name_.
-  bool operator()(const TestInfo * test_info) const {
-    return test_info && internal::String(test_info->name()).Compare(name_) == 0;
-  }
-
- private:
-  internal::String name_;
-};
-
-}  // namespace
-
-namespace internal {
-
-// This method expands all parameterized tests registered with macros TEST_P
-// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
-// This will be done just once during the program runtime.
-void UnitTestImpl::RegisterParameterizedTests() {
-#if GTEST_HAS_PARAM_TEST
-  if (!parameterized_tests_registered_) {
-    parameterized_test_registry_.RegisterTests();
-    parameterized_tests_registered_ = true;
-  }
-#endif
-}
-
-}  // namespace internal
-
-// Creates the test object, runs it, records its result, and then
-// deletes it.
-void TestInfo::Run() {
-  if (!should_run_) return;
-
-  // Tells UnitTest where to store test result.
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  impl->set_current_test_info(this);
-
-  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
-  // Notifies the unit test event listeners that a test is about to start.
-  repeater->OnTestStart(*this);
-
-  const TimeInMillis start = internal::GetTimeInMillis();
-
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-
-  // Creates the test object.
-  Test* const test = internal::HandleExceptionsInMethodIfSupported(
-      factory_, &internal::TestFactoryBase::CreateTest,
-      "the test fixture's constructor");
-
-  // Runs the test only if the test object was created and its
-  // constructor didn't generate a fatal failure.
-  if ((test != NULL) && !Test::HasFatalFailure()) {
-    // This doesn't throw as all user code that can throw are wrapped into
-    // exception handling code.
-    test->Run();
-  }
-
-  // Deletes the test object.
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-  internal::HandleExceptionsInMethodIfSupported(
-      test, &Test::DeleteSelf_, "the test fixture's destructor");
-
-  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
-
-  // Notifies the unit test event listener that a test has just finished.
-  repeater->OnTestEnd(*this);
-
-  // Tells UnitTest to stop associating assertion results to this
-  // test.
-  impl->set_current_test_info(NULL);
-}
-
-// class TestCase
-
-// Gets the number of successful tests in this test case.
-int TestCase::successful_test_count() const {
-  return CountIf(test_info_list_, TestPassed);
-}
-
-// Gets the number of failed tests in this test case.
-int TestCase::failed_test_count() const {
-  return CountIf(test_info_list_, TestFailed);
-}
-
-int TestCase::disabled_test_count() const {
-  return CountIf(test_info_list_, TestDisabled);
-}
-
-// Get the number of tests in this test case that should run.
-int TestCase::test_to_run_count() const {
-  return CountIf(test_info_list_, ShouldRunTest);
-}
-
-// Gets the number of all tests.
-int TestCase::total_test_count() const {
-  return static_cast<int>(test_info_list_.size());
-}
-
-// Creates a TestCase with the given name.
-//
-// Arguments:
-//
-//   name:         name of the test case
-//   a_type_param: the name of the test case's type parameter, or NULL if
-//                 this is not a typed or a type-parameterized test case.
-//   set_up_tc:    pointer to the function that sets up the test case
-//   tear_down_tc: pointer to the function that tears down the test case
-TestCase::TestCase(const char* a_name, const char* a_type_param,
-                   Test::SetUpTestCaseFunc set_up_tc,
-                   Test::TearDownTestCaseFunc tear_down_tc)
-    : name_(a_name),
-      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
-      set_up_tc_(set_up_tc),
-      tear_down_tc_(tear_down_tc),
-      should_run_(false),
-      elapsed_time_(0) {
-}
-
-// Destructor of TestCase.
-TestCase::~TestCase() {
-  // Deletes every Test in the collection.
-  ForEach(test_info_list_, internal::Delete<TestInfo>);
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-const TestInfo* TestCase::GetTestInfo(int i) const {
-  const int index = GetElementOr(test_indices_, i, -1);
-  return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-TestInfo* TestCase::GetMutableTestInfo(int i) {
-  const int index = GetElementOr(test_indices_, i, -1);
-  return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Adds a test to this test case.  Will delete the test upon
-// destruction of the TestCase object.
-void TestCase::AddTestInfo(TestInfo * test_info) {
-  test_info_list_.push_back(test_info);
-  test_indices_.push_back(static_cast<int>(test_indices_.size()));
-}
-
-// Runs every test in this TestCase.
-void TestCase::Run() {
-  if (!should_run_) return;
-
-  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
-  impl->set_current_test_case(this);
-
-  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
-  repeater->OnTestCaseStart(*this);
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-  internal::HandleExceptionsInMethodIfSupported(
-      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
-
-  const internal::TimeInMillis start = internal::GetTimeInMillis();
-  for (int i = 0; i < total_test_count(); i++) {
-    GetMutableTestInfo(i)->Run();
-  }
-  elapsed_time_ = internal::GetTimeInMillis() - start;
-
-  impl->os_stack_trace_getter()->UponLeavingGTest();
-  internal::HandleExceptionsInMethodIfSupported(
-      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
-
-  repeater->OnTestCaseEnd(*this);
-  impl->set_current_test_case(NULL);
-}
-
-// Clears the results of all tests in this test case.
-void TestCase::ClearResult() {
-  ForEach(test_info_list_, TestInfo::ClearTestResult);
-}
-
-// Shuffles the tests in this test case.
-void TestCase::ShuffleTests(internal::Random* random) {
-  Shuffle(random, &test_indices_);
-}
-
-// Restores the test order to before the first shuffle.
-void TestCase::UnshuffleTests() {
-  for (size_t i = 0; i < test_indices_.size(); i++) {
-    test_indices_[i] = static_cast<int>(i);
-  }
-}
-
-// Formats a countable noun.  Depending on its quantity, either the
-// singular form or the plural form is used. e.g.
-//
-// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
-// FormatCountableNoun(5, "book", "books") returns "5 books".
-static internal::String FormatCountableNoun(int count,
-                                            const char * singular_form,
-                                            const char * plural_form) {
-  return internal::String::Format("%d %s", count,
-                                  count == 1 ? singular_form : plural_form);
-}
-
-// Formats the count of tests.
-static internal::String FormatTestCount(int test_count) {
-  return FormatCountableNoun(test_count, "test", "tests");
-}
-
-// Formats the count of test cases.
-static internal::String FormatTestCaseCount(int test_case_count) {
-  return FormatCountableNoun(test_case_count, "test case", "test cases");
-}
-
-// Converts a TestPartResult::Type enum to human-friendly string
-// representation.  Both kNonFatalFailure and kFatalFailure are translated
-// to "Failure", as the user usually doesn't care about the difference
-// between the two when viewing the test result.
-static const char * TestPartResultTypeToString(TestPartResult::Type type) {
-  switch (type) {
-    case TestPartResult::kSuccess:
-      return "Success";
-
-    case TestPartResult::kNonFatalFailure:
-    case TestPartResult::kFatalFailure:
-#ifdef _MSC_VER
-      return "error: ";
-#else
-      return "Failure\n";
-#endif
-    default:
-      return "Unknown result type";
-  }
-}
-
-// Prints a TestPartResult to a String.
-static internal::String PrintTestPartResultToString(
-    const TestPartResult& test_part_result) {
-  return (Message()
-          << internal::FormatFileLocation(test_part_result.file_name(),
-                                          test_part_result.line_number())
-          << " " << TestPartResultTypeToString(test_part_result.type())
-          << test_part_result.message()).GetString();
-}
-
-// Prints a TestPartResult.
-static void PrintTestPartResult(const TestPartResult& test_part_result) {
-  const internal::String& result =
-      PrintTestPartResultToString(test_part_result);
-  printf("%s\n", result.c_str());
-  fflush(stdout);
-  // If the test program runs in Visual Studio or a debugger, the
-  // following statements add the test part result message to the Output
-  // window such that the user can double-click on it to jump to the
-  // corresponding source code location; otherwise they do nothing.
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-  // We don't call OutputDebugString*() on Windows Mobile, as printing
-  // to stdout is done by OutputDebugString() there already - we don't
-  // want the same message printed twice.
-  ::OutputDebugStringA(result.c_str());
-  ::OutputDebugStringA("\n");
-#endif
-}
-
-// class PrettyUnitTestResultPrinter
-
-namespace internal {
-
-enum GTestColor {
-  COLOR_DEFAULT,
-  COLOR_RED,
-  COLOR_GREEN,
-  COLOR_YELLOW
-};
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns the character attribute for the given color.
-WORD GetColorAttribute(GTestColor color) {
-  switch (color) {
-    case COLOR_RED:    return FOREGROUND_RED;
-    case COLOR_GREEN:  return FOREGROUND_GREEN;
-    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
-    default:           return 0;
-  }
-}
-
-#else
-
-// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
-// an invalid input.
-const char* GetAnsiColorCode(GTestColor color) {
-  switch (color) {
-    case COLOR_RED:     return "1";
-    case COLOR_GREEN:   return "2";
-    case COLOR_YELLOW:  return "3";
-    default:            return NULL;
-  };
-}
-
-#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns true iff Google Test should use colors in the output.
-bool ShouldUseColor(bool stdout_is_tty) {
-  const char* const gtest_color = GTEST_FLAG(color).c_str();
-
-  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
-#if GTEST_OS_WINDOWS
-    // On Windows the TERM variable is usually not set, but the
-    // console there does support colors.
-    return stdout_is_tty;
-#else
-    // On non-Windows platforms, we rely on the TERM variable.
-    const char* const term = posix::GetEnv("TERM");
-    const bool term_supports_color =
-        String::CStringEquals(term, "xterm") ||
-        String::CStringEquals(term, "xterm-color") ||
-        String::CStringEquals(term, "xterm-256color") ||
-        String::CStringEquals(term, "screen") ||
-        String::CStringEquals(term, "linux") ||
-        String::CStringEquals(term, "cygwin");
-    return stdout_is_tty && term_supports_color;
-#endif  // GTEST_OS_WINDOWS
-  }
-
-  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
-      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
-      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
-      String::CStringEquals(gtest_color, "1");
-  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
-  // value is neither one of these nor "auto", we treat it as "no" to
-  // be conservative.
-}
-
-// Helpers for printing colored strings to stdout. Note that on Windows, we
-// cannot simply emit special characters and have the terminal change colors.
-// This routine must actually emit the characters rather than return a string
-// that would be colored when printed, as can be done on Linux.
-void ColoredPrintf(GTestColor color, const char* fmt, ...) {
-  va_list args;
-  va_start(args, fmt);
-
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
-  const bool use_color = false;
-#else
-  static const bool in_color_mode =
-      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
-  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
-#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
-  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
-
-  if (!use_color) {
-    vprintf(fmt, args);
-    va_end(args);
-    return;
-  }
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
-
-  // Gets the current text color.
-  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
-  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
-  const WORD old_color_attrs = buffer_info.wAttributes;
-
-  // We need to flush the stream buffers into the console before each
-  // SetConsoleTextAttribute call lest it affect the text that is already
-  // printed but has not yet reached the console.
-  fflush(stdout);
-  SetConsoleTextAttribute(stdout_handle,
-                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
-  vprintf(fmt, args);
-
-  fflush(stdout);
-  // Restores the text color.
-  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
-#else
-  printf("\033[0;3%sm", GetAnsiColorCode(color));
-  vprintf(fmt, args);
-  printf("\033[m");  // Resets the terminal to default.
-#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-  va_end(args);
-}
-
-void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
-  const char* const type_param = test_info.type_param();
-  const char* const value_param = test_info.value_param();
-
-  if (type_param != NULL || value_param != NULL) {
-    printf(", where ");
-    if (type_param != NULL) {
-      printf("TypeParam = %s", type_param);
-      if (value_param != NULL)
-        printf(" and ");
-    }
-    if (value_param != NULL) {
-      printf("GetParam() = %s", value_param);
-    }
-  }
-}
-
-// This class implements the TestEventListener interface.
-//
-// Class PrettyUnitTestResultPrinter is copyable.
-class PrettyUnitTestResultPrinter : public TestEventListener {
- public:
-  PrettyUnitTestResultPrinter() {}
-  static void PrintTestName(const char * test_case, const char * test) {
-    printf("%s.%s", test_case, test);
-  }
-
-  // The following methods override what's in the TestEventListener class.
-  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestCaseStart(const TestCase& test_case);
-  virtual void OnTestStart(const TestInfo& test_info);
-  virtual void OnTestPartResult(const TestPartResult& result);
-  virtual void OnTestEnd(const TestInfo& test_info);
-  virtual void OnTestCaseEnd(const TestCase& test_case);
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
-  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-
- private:
-  static void PrintFailedTests(const UnitTest& unit_test);
-
-  internal::String test_case_name_;
-};
-
-  // Fired before each iteration of tests starts.
-void PrettyUnitTestResultPrinter::OnTestIterationStart(
-    const UnitTest& unit_test, int iteration) {
-  if (GTEST_FLAG(repeat) != 1)
-    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
-
-  const char* const filter = GTEST_FLAG(filter).c_str();
-
-  // Prints the filter if it's not *.  This reminds the user that some
-  // tests may be skipped.
-  if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
-    ColoredPrintf(COLOR_YELLOW,
-                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
-  }
-
-  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
-    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
-    ColoredPrintf(COLOR_YELLOW,
-                  "Note: This is test shard %d of %s.\n",
-                  static_cast<int>(shard_index) + 1,
-                  internal::posix::GetEnv(kTestTotalShards));
-  }
-
-  if (GTEST_FLAG(shuffle)) {
-    ColoredPrintf(COLOR_YELLOW,
-                  "Note: Randomizing tests' orders with a seed of %d .\n",
-                  unit_test.random_seed());
-  }
-
-  ColoredPrintf(COLOR_GREEN,  "[==========] ");
-  printf("Running %s from %s.\n",
-         FormatTestCount(unit_test.test_to_run_count()).c_str(),
-         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
-    const UnitTest& /*unit_test*/) {
-  ColoredPrintf(COLOR_GREEN,  "[----------] ");
-  printf("Global test environment set-up.\n");
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
-  test_case_name_ = test_case.name();
-  const internal::String counts =
-      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
-  ColoredPrintf(COLOR_GREEN, "[----------] ");
-  printf("%s from %s", counts.c_str(), test_case_name_.c_str());
-  if (test_case.type_param() == NULL) {
-    printf("\n");
-  } else {
-    printf(", where TypeParam = %s\n", test_case.type_param());
-  }
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
-  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
-  PrintTestName(test_case_name_.c_str(), test_info.name());
-  printf("\n");
-  fflush(stdout);
-}
-
-// Called after an assertion failure.
-void PrettyUnitTestResultPrinter::OnTestPartResult(
-    const TestPartResult& result) {
-  // If the test part succeeded, we don't need to do anything.
-  if (result.type() == TestPartResult::kSuccess)
-    return;
-
-  // Print failure message from the assertion (e.g. expected this and got that).
-  PrintTestPartResult(result);
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
-  if (test_info.result()->Passed()) {
-    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
-  } else {
-    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
-  }
-  PrintTestName(test_case_name_.c_str(), test_info.name());
-  if (test_info.result()->Failed())
-    PrintFullTestCommentIfPresent(test_info);
-
-  if (GTEST_FLAG(print_time)) {
-    printf(" (%s ms)\n", internal::StreamableToString(
-           test_info.result()->elapsed_time()).c_str());
-  } else {
-    printf("\n");
-  }
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
-  if (!GTEST_FLAG(print_time)) return;
-
-  test_case_name_ = test_case.name();
-  const internal::String counts =
-      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
-  ColoredPrintf(COLOR_GREEN, "[----------] ");
-  printf("%s from %s (%s ms total)\n\n",
-         counts.c_str(), test_case_name_.c_str(),
-         internal::StreamableToString(test_case.elapsed_time()).c_str());
-  fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
-    const UnitTest& /*unit_test*/) {
-  ColoredPrintf(COLOR_GREEN,  "[----------] ");
-  printf("Global test environment tear-down\n");
-  fflush(stdout);
-}
-
-// Internal helper for printing the list of failed tests.
-void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
-  const int failed_test_count = unit_test.failed_test_count();
-  if (failed_test_count == 0) {
-    return;
-  }
-
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
-    const TestCase& test_case = *unit_test.GetTestCase(i);
-    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
-      continue;
-    }
-    for (int j = 0; j < test_case.total_test_count(); ++j) {
-      const TestInfo& test_info = *test_case.GetTestInfo(j);
-      if (!test_info.should_run() || test_info.result()->Passed()) {
-        continue;
-      }
-      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
-      printf("%s.%s", test_case.name(), test_info.name());
-      PrintFullTestCommentIfPresent(test_info);
-      printf("\n");
-    }
-  }
-}
-
-void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
-                                                     int /*iteration*/) {
-  ColoredPrintf(COLOR_GREEN,  "[==========] ");
-  printf("%s from %s ran.",
-         FormatTestCount(unit_test.test_to_run_count()).c_str(),
-         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
-  if (GTEST_FLAG(print_time)) {
-    printf(" (%s ms total)",
-           internal::StreamableToString(unit_test.elapsed_time()).c_str());
-  }
-  printf("\n");
-  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
-  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
-
-  int num_failures = unit_test.failed_test_count();
-  if (!unit_test.Passed()) {
-    const int failed_test_count = unit_test.failed_test_count();
-    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
-    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
-    PrintFailedTests(unit_test);
-    printf("\n%2d FAILED %s\n", num_failures,
-                        num_failures == 1 ? "TEST" : "TESTS");
-  }
-
-  int num_disabled = unit_test.disabled_test_count();
-  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
-    if (!num_failures) {
-      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
-    }
-    ColoredPrintf(COLOR_YELLOW,
-                  "  YOU HAVE %d DISABLED %s\n\n",
-                  num_disabled,
-                  num_disabled == 1 ? "TEST" : "TESTS");
-  }
-  // Ensure that Google Test output is printed before, e.g., heapchecker output.
-  fflush(stdout);
-}
-
-// End PrettyUnitTestResultPrinter
-
-// class TestEventRepeater
-//
-// This class forwards events to other event listeners.
-class TestEventRepeater : public TestEventListener {
- public:
-  TestEventRepeater() : forwarding_enabled_(true) {}
-  virtual ~TestEventRepeater();
-  void Append(TestEventListener *listener);
-  TestEventListener* Release(TestEventListener* listener);
-
-  // Controls whether events will be forwarded to listeners_. Set to false
-  // in death test child processes.
-  bool forwarding_enabled() const { return forwarding_enabled_; }
-  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
-
-  virtual void OnTestProgramStart(const UnitTest& unit_test);
-  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
-  virtual void OnTestCaseStart(const TestCase& test_case);
-  virtual void OnTestStart(const TestInfo& test_info);
-  virtual void OnTestPartResult(const TestPartResult& result);
-  virtual void OnTestEnd(const TestInfo& test_info);
-  virtual void OnTestCaseEnd(const TestCase& test_case);
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
-  virtual void OnTestProgramEnd(const UnitTest& unit_test);
-
- private:
-  // Controls whether events will be forwarded to listeners_. Set to false
-  // in death test child processes.
-  bool forwarding_enabled_;
-  // The list of listeners that receive events.
-  std::vector<TestEventListener*> listeners_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
-};
-
-TestEventRepeater::~TestEventRepeater() {
-  ForEach(listeners_, Delete<TestEventListener>);
-}
-
-void TestEventRepeater::Append(TestEventListener *listener) {
-  listeners_.push_back(listener);
-}
-
-// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
-TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
-  for (size_t i = 0; i < listeners_.size(); ++i) {
-    if (listeners_[i] == listener) {
-      listeners_.erase(listeners_.begin() + i);
-      return listener;
-    }
-  }
-
-  return NULL;
-}
-
-// Since most methods are very similar, use macros to reduce boilerplate.
-// This defines a member that forwards the call to all listeners.
-#define GTEST_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
-  if (forwarding_enabled_) { \
-    for (size_t i = 0; i < listeners_.size(); i++) { \
-      listeners_[i]->Name(parameter); \
-    } \
-  } \
-}
-// This defines a member that forwards the call to all listeners in reverse
-// order.
-#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
-  if (forwarding_enabled_) { \
-    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
-      listeners_[i]->Name(parameter); \
-    } \
-  } \
-}
-
-GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
-GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
-GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
-GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
-
-#undef GTEST_REPEATER_METHOD_
-#undef GTEST_REVERSE_REPEATER_METHOD_
-
-void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
-                                             int iteration) {
-  if (forwarding_enabled_) {
-    for (size_t i = 0; i < listeners_.size(); i++) {
-      listeners_[i]->OnTestIterationStart(unit_test, iteration);
-    }
-  }
-}
-
-void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
-                                           int iteration) {
-  if (forwarding_enabled_) {
-    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
-      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
-    }
-  }
-}
-
-// End TestEventRepeater
-
-// This class generates an XML output file.
-class XmlUnitTestResultPrinter : public EmptyTestEventListener {
- public:
-  explicit XmlUnitTestResultPrinter(const char* output_file);
-
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
-
- private:
-  // Is c a whitespace character that is normalized to a space character
-  // when it appears in an XML attribute value?
-  static bool IsNormalizableWhitespace(char c) {
-    return c == 0x9 || c == 0xA || c == 0xD;
-  }
-
-  // May c appear in a well-formed XML document?
-  static bool IsValidXmlCharacter(char c) {
-    return IsNormalizableWhitespace(c) || c >= 0x20;
-  }
-
-  // Returns an XML-escaped copy of the input string str.  If
-  // is_attribute is true, the text is meant to appear as an attribute
-  // value, and normalizable whitespace is preserved by replacing it
-  // with character references.
-  static String EscapeXml(const char* str, bool is_attribute);
-
-  // Returns the given string with all characters invalid in XML removed.
-  static string RemoveInvalidXmlCharacters(const string& str);
-
-  // Convenience wrapper around EscapeXml when str is an attribute value.
-  static String EscapeXmlAttribute(const char* str) {
-    return EscapeXml(str, true);
-  }
-
-  // Convenience wrapper around EscapeXml when str is not an attribute value.
-  static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }
-
-  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
-  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
-
-  // Streams an XML representation of a TestInfo object.
-  static void OutputXmlTestInfo(::std::ostream* stream,
-                                const char* test_case_name,
-                                const TestInfo& test_info);
-
-  // Prints an XML representation of a TestCase object
-  static void PrintXmlTestCase(FILE* out, const TestCase& test_case);
-
-  // Prints an XML summary of unit_test to output stream out.
-  static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);
-
-  // Produces a string representing the test properties in a result as space
-  // delimited XML attributes based on the property key="value" pairs.
-  // When the String is not empty, it includes a space at the beginning,
-  // to delimit this attribute from prior attributes.
-  static String TestPropertiesAsXmlAttributes(const TestResult& result);
-
-  // The output file.
-  const String output_file_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
-};
-
-// Creates a new XmlUnitTestResultPrinter.
-XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
-    : output_file_(output_file) {
-  if (output_file_.c_str() == NULL || output_file_.empty()) {
-    fprintf(stderr, "XML output file may not be null\n");
-    fflush(stderr);
-    exit(EXIT_FAILURE);
-  }
-}
-
-// Called after the unit test ends.
-void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
-                                                  int /*iteration*/) {
-  FILE* xmlout = NULL;
-  FilePath output_file(output_file_);
-  FilePath output_dir(output_file.RemoveFileName());
-
-  if (output_dir.CreateDirectoriesRecursively()) {
-    xmlout = posix::FOpen(output_file_.c_str(), "w");
-  }
-  if (xmlout == NULL) {
-    // TODO(wan): report the reason of the failure.
-    //
-    // We don't do it for now as:
-    //
-    //   1. There is no urgent need for it.
-    //   2. It's a bit involved to make the errno variable thread-safe on
-    //      all three operating systems (Linux, Windows, and Mac OS).
-    //   3. To interpret the meaning of errno in a thread-safe way,
-    //      we need the strerror_r() function, which is not available on
-    //      Windows.
-    fprintf(stderr,
-            "Unable to open file \"%s\"\n",
-            output_file_.c_str());
-    fflush(stderr);
-    exit(EXIT_FAILURE);
-  }
-  PrintXmlUnitTest(xmlout, unit_test);
-  fclose(xmlout);
-}
-
-// Returns an XML-escaped copy of the input string str.  If is_attribute
-// is true, the text is meant to appear as an attribute value, and
-// normalizable whitespace is preserved by replacing it with character
-// references.
-//
-// Invalid XML characters in str, if any, are stripped from the output.
-// It is expected that most, if not all, of the text processed by this
-// module will consist of ordinary English text.
-// If this module is ever modified to produce version 1.1 XML output,
-// most invalid characters can be retained using character references.
-// TODO(wan): It might be nice to have a minimally invasive, human-readable
-// escaping scheme for invalid characters, rather than dropping them.
-String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
-  Message m;
-
-  if (str != NULL) {
-    for (const char* src = str; *src; ++src) {
-      switch (*src) {
-        case '<':
-          m << "<";
-          break;
-        case '>':
-          m << ">";
-          break;
-        case '&':
-          m << "&";
-          break;
-        case '\'':
-          if (is_attribute)
-            m << "'";
-          else
-            m << '\'';
-          break;
-        case '"':
-          if (is_attribute)
-            m << """;
-          else
-            m << '"';
-          break;
-        default:
-          if (IsValidXmlCharacter(*src)) {
-            if (is_attribute && IsNormalizableWhitespace(*src))
-              m << String::Format("&#x%02X;", unsigned(*src));
-            else
-              m << *src;
-          }
-          break;
-      }
-    }
-  }
-
-  return m.GetString();
-}
-
-// Returns the given string with all characters invalid in XML removed.
-// Currently invalid characters are dropped from the string. An
-// alternative is to replace them with certain characters such as . or ?.
-string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {
-  string output;
-  output.reserve(str.size());
-  for (string::const_iterator it = str.begin(); it != str.end(); ++it)
-    if (IsValidXmlCharacter(*it))
-      output.push_back(*it);
-
-  return output;
-}
-
-// The following routines generate an XML representation of a UnitTest
-// object.
-//
-// This is how Google Test concepts map to the DTD:
-//
-// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
-//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
-//     <testcase name="test-name">     <-- corresponds to a TestInfo object
-//       <failure message="...">...</failure>
-//       <failure message="...">...</failure>
-//       <failure message="...">...</failure>
-//                                     <-- individual assertion failures
-//     </testcase>
-//   </testsuite>
-// </testsuites>
-
-// Formats the given time in milliseconds as seconds.
-std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
-  ::std::stringstream ss;
-  ss << ms/1000.0;
-  return ss.str();
-}
-
-// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
-void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
-                                                     const char* data) {
-  const char* segment = data;
-  *stream << "<![CDATA[";
-  for (;;) {
-    const char* const next_segment = strstr(segment, "]]>");
-    if (next_segment != NULL) {
-      stream->write(
-          segment, static_cast<std::streamsize>(next_segment - segment));
-      *stream << "]]>]]><![CDATA[";
-      segment = next_segment + strlen("]]>");
-    } else {
-      *stream << segment;
-      break;
-    }
-  }
-  *stream << "]]>";
-}
-
-// Prints an XML representation of a TestInfo object.
-// TODO(wan): There is also value in printing properties with the plain printer.
-void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
-                                                 const char* test_case_name,
-                                                 const TestInfo& test_info) {
-  const TestResult& result = *test_info.result();
-  *stream << "    <testcase name=\""
-          << EscapeXmlAttribute(test_info.name()).c_str() << "\"";
-
-  if (test_info.value_param() != NULL) {
-    *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param())
-            << "\"";
-  }
-  if (test_info.type_param() != NULL) {
-    *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param())
-            << "\"";
-  }
-
-  *stream << " status=\""
-          << (test_info.should_run() ? "run" : "notrun")
-          << "\" time=\""
-          << FormatTimeInMillisAsSeconds(result.elapsed_time())
-          << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str()
-          << "\"" << TestPropertiesAsXmlAttributes(result).c_str();
-
-  int failures = 0;
-  for (int i = 0; i < result.total_part_count(); ++i) {
-    const TestPartResult& part = result.GetTestPartResult(i);
-    if (part.failed()) {
-      if (++failures == 1)
-        *stream << ">\n";
-      *stream << "      <failure message=\""
-              << EscapeXmlAttribute(part.summary()).c_str()
-              << "\" type=\"\">";
-      const string location = internal::FormatCompilerIndependentFileLocation(
-          part.file_name(), part.line_number());
-      const string message = location + "\n" + part.message();
-      OutputXmlCDataSection(stream,
-                            RemoveInvalidXmlCharacters(message).c_str());
-      *stream << "</failure>\n";
-    }
-  }
-
-  if (failures == 0)
-    *stream << " />\n";
-  else
-    *stream << "    </testcase>\n";
-}
-
-// Prints an XML representation of a TestCase object
-void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
-                                                const TestCase& test_case) {
-  fprintf(out,
-          "  <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
-          "disabled=\"%d\" ",
-          EscapeXmlAttribute(test_case.name()).c_str(),
-          test_case.total_test_count(),
-          test_case.failed_test_count(),
-          test_case.disabled_test_count());
-  fprintf(out,
-          "errors=\"0\" time=\"%s\">\n",
-          FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());
-  for (int i = 0; i < test_case.total_test_count(); ++i) {
-    ::std::stringstream stream;
-    OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));
-    fprintf(out, "%s", StringStreamToString(&stream).c_str());
-  }
-  fprintf(out, "  </testsuite>\n");
-}
-
-// Prints an XML summary of unit_test to output stream out.
-void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
-                                                const UnitTest& unit_test) {
-  fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-  fprintf(out,
-          "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
-          "errors=\"0\" time=\"%s\" ",
-          unit_test.total_test_count(),
-          unit_test.failed_test_count(),
-          unit_test.disabled_test_count(),
-          FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
-  if (GTEST_FLAG(shuffle)) {
-    fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
-  }
-  fprintf(out, "name=\"AllTests\">\n");
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i)
-    PrintXmlTestCase(out, *unit_test.GetTestCase(i));
-  fprintf(out, "</testsuites>\n");
-}
-
-// Produces a string representing the test properties in a result as space
-// delimited XML attributes based on the property key="value" pairs.
-String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
-    const TestResult& result) {
-  Message attributes;
-  for (int i = 0; i < result.test_property_count(); ++i) {
-    const TestProperty& property = result.GetTestProperty(i);
-    attributes << " " << property.key() << "="
-        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
-  }
-  return attributes.GetString();
-}
-
-// End XmlUnitTestResultPrinter
-
-#if GTEST_CAN_STREAM_RESULTS_
-
-// Streams test results to the given port on the given host machine.
-class StreamingListener : public EmptyTestEventListener {
- public:
-  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
-  static string UrlEncode(const char* str);
-
-  StreamingListener(const string& host, const string& port)
-      : sockfd_(-1), host_name_(host), port_num_(port) {
-    MakeConnection();
-    Send("gtest_streaming_protocol_version=1.0\n");
-  }
-
-  virtual ~StreamingListener() {
-    if (sockfd_ != -1)
-      CloseConnection();
-  }
-
-  void OnTestProgramStart(const UnitTest& /* unit_test */) {
-    Send("event=TestProgramStart\n");
-  }
-
-  void OnTestProgramEnd(const UnitTest& unit_test) {
-    // Note that Google Test current only report elapsed time for each
-    // test iteration, not for the entire test program.
-    Send(String::Format("event=TestProgramEnd&passed=%d\n",
-                        unit_test.Passed()));
-
-    // Notify the streaming server to stop.
-    CloseConnection();
-  }
-
-  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
-    Send(String::Format("event=TestIterationStart&iteration=%d\n",
-                        iteration));
-  }
-
-  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
-    Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n",
-                        unit_test.Passed(),
-                        StreamableToString(unit_test.elapsed_time()).c_str()));
-  }
-
-  void OnTestCaseStart(const TestCase& test_case) {
-    Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name()));
-  }
-
-  void OnTestCaseEnd(const TestCase& test_case) {
-    Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n",
-                        test_case.Passed(),
-                        StreamableToString(test_case.elapsed_time()).c_str()));
-  }
-
-  void OnTestStart(const TestInfo& test_info) {
-    Send(String::Format("event=TestStart&name=%s\n", test_info.name()));
-  }
-
-  void OnTestEnd(const TestInfo& test_info) {
-    Send(String::Format(
-        "event=TestEnd&passed=%d&elapsed_time=%sms\n",
-        (test_info.result())->Passed(),
-        StreamableToString((test_info.result())->elapsed_time()).c_str()));
-  }
-
-  void OnTestPartResult(const TestPartResult& test_part_result) {
-    const char* file_name = test_part_result.file_name();
-    if (file_name == NULL)
-      file_name = "";
-    Send(String::Format("event=TestPartResult&file=%s&line=%d&message=",
-                        UrlEncode(file_name).c_str(),
-                        test_part_result.line_number()));
-    Send(UrlEncode(test_part_result.message()) + "\n");
-  }
-
- private:
-  // Creates a client socket and connects to the server.
-  void MakeConnection();
-
-  // Closes the socket.
-  void CloseConnection() {
-    GTEST_CHECK_(sockfd_ != -1)
-        << "CloseConnection() can be called only when there is a connection.";
-
-    close(sockfd_);
-    sockfd_ = -1;
-  }
-
-  // Sends a string to the socket.
-  void Send(const string& message) {
-    GTEST_CHECK_(sockfd_ != -1)
-        << "Send() can be called only when there is a connection.";
-
-    const int len = static_cast<int>(message.length());
-    if (write(sockfd_, message.c_str(), len) != len) {
-      GTEST_LOG_(WARNING)
-          << "stream_result_to: failed to stream to "
-          << host_name_ << ":" << port_num_;
-    }
-  }
-
-  int sockfd_;   // socket file descriptor
-  const string host_name_;
-  const string port_num_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
-};  // class StreamingListener
-
-// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
-// replaces them by "%xx" where xx is their hexadecimal value. For
-// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
-// in both time and space -- important as the input str may contain an
-// arbitrarily long test failure message and stack trace.
-string StreamingListener::UrlEncode(const char* str) {
-  string result;
-  result.reserve(strlen(str) + 1);
-  for (char ch = *str; ch != '\0'; ch = *++str) {
-    switch (ch) {
-      case '%':
-      case '=':
-      case '&':
-      case '\n':
-        result.append(String::Format("%%%02x", static_cast<unsigned char>(ch)));
-        break;
-      default:
-        result.push_back(ch);
-        break;
-    }
-  }
-  return result;
-}
-
-void StreamingListener::MakeConnection() {
-  GTEST_CHECK_(sockfd_ == -1)
-      << "MakeConnection() can't be called when there is already a connection.";
-
-  addrinfo hints;
-  memset(&hints, 0, sizeof(hints));
-  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
-  hints.ai_socktype = SOCK_STREAM;
-  addrinfo* servinfo = NULL;
-
-  // Use the getaddrinfo() to get a linked list of IP addresses for
-  // the given host name.
-  const int error_num = getaddrinfo(
-      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
-  if (error_num != 0) {
-    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
-                        << gai_strerror(error_num);
-  }
-
-  // Loop through all the results and connect to the first we can.
-  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
-       cur_addr = cur_addr->ai_next) {
-    sockfd_ = socket(
-        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
-    if (sockfd_ != -1) {
-      // Connect the client socket to the server socket.
-      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
-        close(sockfd_);
-        sockfd_ = -1;
-      }
-    }
-  }
-
-  freeaddrinfo(servinfo);  // all done with this structure
-
-  if (sockfd_ == -1) {
-    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
-                        << host_name_ << ":" << port_num_;
-  }
-}
-
-// End of class Streaming Listener
-#endif  // GTEST_CAN_STREAM_RESULTS__
-
-// Class ScopedTrace
-
-// Pushes the given source file location and message onto a per-thread
-// trace stack maintained by Google Test.
-// L < UnitTest::mutex_
-ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
-  TraceInfo trace;
-  trace.file = file;
-  trace.line = line;
-  trace.message = message.GetString();
-
-  UnitTest::GetInstance()->PushGTestTrace(trace);
-}
-
-// Pops the info pushed by the c'tor.
-// L < UnitTest::mutex_
-ScopedTrace::~ScopedTrace() {
-  UnitTest::GetInstance()->PopGTestTrace();
-}
-
-
-// class OsStackTraceGetter
-
-// Returns the current OS stack trace as a String.  Parameters:
-//
-//   max_depth  - the maximum number of stack frames to be included
-//                in the trace.
-//   skip_count - the number of top frames to be skipped; doesn't count
-//                against max_depth.
-//
-// L < mutex_
-// We use "L < mutex_" to denote that the function may acquire mutex_.
-String OsStackTraceGetter::CurrentStackTrace(int, int) {
-  return String("");
-}
-
-// L < mutex_
-void OsStackTraceGetter::UponLeavingGTest() {
-}
-
-const char* const
-OsStackTraceGetter::kElidedFramesMarker =
-    "... " GTEST_NAME_ " internal frames ...";
-
-}  // namespace internal
-
-// class TestEventListeners
-
-TestEventListeners::TestEventListeners()
-    : repeater_(new internal::TestEventRepeater()),
-      default_result_printer_(NULL),
-      default_xml_generator_(NULL) {
-}
-
-TestEventListeners::~TestEventListeners() { delete repeater_; }
-
-// Returns the standard listener responsible for the default console
-// output.  Can be removed from the listeners list to shut down default
-// console output.  Note that removing this object from the listener list
-// with Release transfers its ownership to the user.
-void TestEventListeners::Append(TestEventListener* listener) {
-  repeater_->Append(listener);
-}
-
-// Removes the given event listener from the list and returns it.  It then
-// becomes the caller's responsibility to delete the listener. Returns
-// NULL if the listener is not found in the list.
-TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
-  if (listener == default_result_printer_)
-    default_result_printer_ = NULL;
-  else if (listener == default_xml_generator_)
-    default_xml_generator_ = NULL;
-  return repeater_->Release(listener);
-}
-
-// Returns repeater that broadcasts the TestEventListener events to all
-// subscribers.
-TestEventListener* TestEventListeners::repeater() { return repeater_; }
-
-// Sets the default_result_printer attribute to the provided listener.
-// The listener is also added to the listener list and previous
-// default_result_printer is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
-  if (default_result_printer_ != listener) {
-    // It is an error to pass this method a listener that is already in the
-    // list.
-    delete Release(default_result_printer_);
-    default_result_printer_ = listener;
-    if (listener != NULL)
-      Append(listener);
-  }
-}
-
-// Sets the default_xml_generator attribute to the provided listener.  The
-// listener is also added to the listener list and previous
-// default_xml_generator is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
-  if (default_xml_generator_ != listener) {
-    // It is an error to pass this method a listener that is already in the
-    // list.
-    delete Release(default_xml_generator_);
-    default_xml_generator_ = listener;
-    if (listener != NULL)
-      Append(listener);
-  }
-}
-
-// Controls whether events will be forwarded by the repeater to the
-// listeners in the list.
-bool TestEventListeners::EventForwardingEnabled() const {
-  return repeater_->forwarding_enabled();
-}
-
-void TestEventListeners::SuppressEventForwarding() {
-  repeater_->set_forwarding_enabled(false);
-}
-
-// class UnitTest
-
-// Gets the singleton UnitTest object.  The first time this method is
-// called, a UnitTest object is constructed and returned.  Consecutive
-// calls will return the same object.
-//
-// We don't protect this under mutex_ as a user is not supposed to
-// call this before main() starts, from which point on the return
-// value will never change.
-UnitTest * UnitTest::GetInstance() {
-  // When compiled with MSVC 7.1 in optimized mode, destroying the
-  // UnitTest object upon exiting the program messes up the exit code,
-  // causing successful tests to appear failed.  We have to use a
-  // different implementation in this case to bypass the compiler bug.
-  // This implementation makes the compiler happy, at the cost of
-  // leaking the UnitTest object.
-
-  // CodeGear C++Builder insists on a public destructor for the
-  // default implementation.  Use this implementation to keep good OO
-  // design with private destructor.
-
-#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
-  static UnitTest* const instance = new UnitTest;
-  return instance;
-#else
-  static UnitTest instance;
-  return &instance;
-#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
-}
-
-// Gets the number of successful test cases.
-int UnitTest::successful_test_case_count() const {
-  return impl()->successful_test_case_count();
-}
-
-// Gets the number of failed test cases.
-int UnitTest::failed_test_case_count() const {
-  return impl()->failed_test_case_count();
-}
-
-// Gets the number of all test cases.
-int UnitTest::total_test_case_count() const {
-  return impl()->total_test_case_count();
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTest::test_case_to_run_count() const {
-  return impl()->test_case_to_run_count();
-}
-
-// Gets the number of successful tests.
-int UnitTest::successful_test_count() const {
-  return impl()->successful_test_count();
-}
-
-// Gets the number of failed tests.
-int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
-
-// Gets the number of disabled tests.
-int UnitTest::disabled_test_count() const {
-  return impl()->disabled_test_count();
-}
-
-// Gets the number of all tests.
-int UnitTest::total_test_count() const { return impl()->total_test_count(); }
-
-// Gets the number of tests that should run.
-int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
-
-// Gets the elapsed time, in milliseconds.
-internal::TimeInMillis UnitTest::elapsed_time() const {
-  return impl()->elapsed_time();
-}
-
-// Returns true iff the unit test passed (i.e. all test cases passed).
-bool UnitTest::Passed() const { return impl()->Passed(); }
-
-// Returns true iff the unit test failed (i.e. some test case failed
-// or something outside of all tests failed).
-bool UnitTest::Failed() const { return impl()->Failed(); }
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-const TestCase* UnitTest::GetTestCase(int i) const {
-  return impl()->GetTestCase(i);
-}
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-TestCase* UnitTest::GetMutableTestCase(int i) {
-  return impl()->GetMutableTestCase(i);
-}
-
-// Returns the list of event listeners that can be used to track events
-// inside Google Test.
-TestEventListeners& UnitTest::listeners() {
-  return *impl()->listeners();
-}
-
-// Registers and returns a global test environment.  When a test
-// program is run, all global test environments will be set-up in the
-// order they were registered.  After all tests in the program have
-// finished, all global test environments will be torn-down in the
-// *reverse* order they were registered.
-//
-// The UnitTest object takes ownership of the given environment.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-Environment* UnitTest::AddEnvironment(Environment* env) {
-  if (env == NULL) {
-    return NULL;
-  }
-
-  impl_->environments().push_back(env);
-  return env;
-}
-
-// Adds a TestPartResult to the current TestResult object.  All Google Test
-// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
-// this to report their results.  The user code should use the
-// assertion macros instead of calling this directly.
-// L < mutex_
-void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
-                                 const char* file_name,
-                                 int line_number,
-                                 const internal::String& message,
-                                 const internal::String& os_stack_trace) {
-  Message msg;
-  msg << message;
-
-  internal::MutexLock lock(&mutex_);
-  if (impl_->gtest_trace_stack().size() > 0) {
-    msg << "\n" << GTEST_NAME_ << " trace:";
-
-    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
-         i > 0; --i) {
-      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
-      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
-          << " " << trace.message;
-    }
-  }
-
-  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
-    msg << internal::kStackTraceMarker << os_stack_trace;
-  }
-
-  const TestPartResult result =
-    TestPartResult(result_type, file_name, line_number,
-                   msg.GetString().c_str());
-  impl_->GetTestPartResultReporterForCurrentThread()->
-      ReportTestPartResult(result);
-
-  if (result_type != TestPartResult::kSuccess) {
-    // gtest_break_on_failure takes precedence over
-    // gtest_throw_on_failure.  This allows a user to set the latter
-    // in the code (perhaps in order to use Google Test assertions
-    // with another testing framework) and specify the former on the
-    // command line for debugging.
-    if (GTEST_FLAG(break_on_failure)) {
-#if GTEST_OS_WINDOWS
-      // Using DebugBreak on Windows allows gtest to still break into a debugger
-      // when a failure happens and both the --gtest_break_on_failure and
-      // the --gtest_catch_exceptions flags are specified.
-      DebugBreak();
-#else
-      // Dereference NULL through a volatile pointer to prevent the compiler
-      // from removing. We use this rather than abort() or __builtin_trap() for
-      // portability: Symbian doesn't implement abort() well, and some debuggers
-      // don't correctly trap abort().
-      *static_cast<volatile int*>(NULL) = 1;
-#endif  // GTEST_OS_WINDOWS
-    } else if (GTEST_FLAG(throw_on_failure)) {
-#if GTEST_HAS_EXCEPTIONS
-      throw GoogleTestFailureException(result);
-#else
-      // We cannot call abort() as it generates a pop-up in debug mode
-      // that cannot be suppressed in VC 7.1 or below.
-      exit(1);
-#endif
-    }
-  }
-}
-
-// Creates and adds a property to the current TestResult. If a property matching
-// the supplied value already exists, updates its value instead.
-void UnitTest::RecordPropertyForCurrentTest(const char* key,
-                                            const char* value) {
-  const TestProperty test_property(key, value);
-  impl_->current_test_result()->RecordProperty(test_property);
-}
-
-// Runs all tests in this UnitTest object and prints the result.
-// Returns 0 if successful, or 1 otherwise.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-int UnitTest::Run() {
-  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
-  // used for the duration of the program.
-  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
-
-#if GTEST_HAS_SEH
-  const bool in_death_test_child_process =
-      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
-
-  // Either the user wants Google Test to catch exceptions thrown by the
-  // tests or this is executing in the context of death test child
-  // process. In either case the user does not want to see pop-up dialogs
-  // about crashes - they are expected.
-  if (impl()->catch_exceptions() || in_death_test_child_process) {
-
-# if !GTEST_OS_WINDOWS_MOBILE
-    // SetErrorMode doesn't exist on CE.
-    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
-                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-# endif  // !GTEST_OS_WINDOWS_MOBILE
-
-# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
-    // Death test children can be terminated with _abort().  On Windows,
-    // _abort() can show a dialog with a warning message.  This forces the
-    // abort message to go to stderr instead.
-    _set_error_mode(_OUT_TO_STDERR);
-# endif
-
-# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
-    // In the debug version, Visual Studio pops up a separate dialog
-    // offering a choice to debug the aborted program. We need to suppress
-    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
-    // executed. Google Test will notify the user of any unexpected
-    // failure via stderr.
-    //
-    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
-    // Users of prior VC versions shall suffer the agony and pain of
-    // clicking through the countless debug dialogs.
-    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
-    // debug mode when compiled with VC 7.1 or lower.
-    if (!GTEST_FLAG(break_on_failure))
-      _set_abort_behavior(
-          0x0,                                    // Clear the following flags:
-          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
-# endif
-
-  }
-#endif  // GTEST_HAS_SEH
-
-  return internal::HandleExceptionsInMethodIfSupported(
-      impl(),
-      &internal::UnitTestImpl::RunAllTests,
-      "auxiliary test code (environments or event listeners)") ? 0 : 1;
-}
-
-// Returns the working directory when the first TEST() or TEST_F() was
-// executed.
-const char* UnitTest::original_working_dir() const {
-  return impl_->original_working_dir_.c_str();
-}
-
-// Returns the TestCase object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestCase* UnitTest::current_test_case() const {
-  internal::MutexLock lock(&mutex_);
-  return impl_->current_test_case();
-}
-
-// Returns the TestInfo object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestInfo* UnitTest::current_test_info() const {
-  internal::MutexLock lock(&mutex_);
-  return impl_->current_test_info();
-}
-
-// Returns the random seed used at the start of the current test run.
-int UnitTest::random_seed() const { return impl_->random_seed(); }
-
-#if GTEST_HAS_PARAM_TEST
-// Returns ParameterizedTestCaseRegistry object used to keep track of
-// value-parameterized tests and instantiate and register them.
-// L < mutex_
-internal::ParameterizedTestCaseRegistry&
-    UnitTest::parameterized_test_registry() {
-  return impl_->parameterized_test_registry();
-}
-#endif  // GTEST_HAS_PARAM_TEST
-
-// Creates an empty UnitTest.
-UnitTest::UnitTest() {
-  impl_ = new internal::UnitTestImpl(this);
-}
-
-// Destructor of UnitTest.
-UnitTest::~UnitTest() {
-  delete impl_;
-}
-
-// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
-// Google Test trace stack.
-// L < mutex_
-void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
-  internal::MutexLock lock(&mutex_);
-  impl_->gtest_trace_stack().push_back(trace);
-}
-
-// Pops a trace from the per-thread Google Test trace stack.
-// L < mutex_
-void UnitTest::PopGTestTrace() {
-  internal::MutexLock lock(&mutex_);
-  impl_->gtest_trace_stack().pop_back();
-}
-
-namespace internal {
-
-UnitTestImpl::UnitTestImpl(UnitTest* parent)
-    : parent_(parent),
-#ifdef _MSC_VER
-# pragma warning(push)                    // Saves the current warning state.
-# pragma warning(disable:4355)            // Temporarily disables warning 4355
-                                         // (using this in initializer).
-      default_global_test_part_result_reporter_(this),
-      default_per_thread_test_part_result_reporter_(this),
-# pragma warning(pop)                     // Restores the warning state again.
-#else
-      default_global_test_part_result_reporter_(this),
-      default_per_thread_test_part_result_reporter_(this),
-#endif  // _MSC_VER
-      global_test_part_result_repoter_(
-          &default_global_test_part_result_reporter_),
-      per_thread_test_part_result_reporter_(
-          &default_per_thread_test_part_result_reporter_),
-#if GTEST_HAS_PARAM_TEST
-      parameterized_test_registry_(),
-      parameterized_tests_registered_(false),
-#endif  // GTEST_HAS_PARAM_TEST
-      last_death_test_case_(-1),
-      current_test_case_(NULL),
-      current_test_info_(NULL),
-      ad_hoc_test_result_(),
-      os_stack_trace_getter_(NULL),
-      post_flag_parse_init_performed_(false),
-      random_seed_(0),  // Will be overridden by the flag before first use.
-      random_(0),  // Will be reseeded before first use.
-      elapsed_time_(0),
-#if GTEST_HAS_DEATH_TEST
-      internal_run_death_test_flag_(NULL),
-      death_test_factory_(new DefaultDeathTestFactory),
-#endif
-      // Will be overridden by the flag before first use.
-      catch_exceptions_(false) {
-  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
-}
-
-UnitTestImpl::~UnitTestImpl() {
-  // Deletes every TestCase.
-  ForEach(test_cases_, internal::Delete<TestCase>);
-
-  // Deletes every Environment.
-  ForEach(environments_, internal::Delete<Environment>);
-
-  delete os_stack_trace_getter_;
-}
-
-#if GTEST_HAS_DEATH_TEST
-// Disables event forwarding if the control is currently in a death test
-// subprocess. Must not be called before InitGoogleTest.
-void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
-  if (internal_run_death_test_flag_.get() != NULL)
-    listeners()->SuppressEventForwarding();
-}
-#endif  // GTEST_HAS_DEATH_TEST
-
-// Initializes event listeners performing XML output as specified by
-// UnitTestOptions. Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureXmlOutput() {
-  const String& output_format = UnitTestOptions::GetOutputFormat();
-  if (output_format == "xml") {
-    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
-        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
-  } else if (output_format != "") {
-    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
-           output_format.c_str());
-    fflush(stdout);
-  }
-}
-
-#if GTEST_CAN_STREAM_RESULTS_
-// Initializes event listeners for streaming test results in String form.
-// Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureStreamingOutput() {
-  const string& target = GTEST_FLAG(stream_result_to);
-  if (!target.empty()) {
-    const size_t pos = target.find(':');
-    if (pos != string::npos) {
-      listeners()->Append(new StreamingListener(target.substr(0, pos),
-                                                target.substr(pos+1)));
-    } else {
-      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
-             target.c_str());
-      fflush(stdout);
-    }
-  }
-}
-#endif  // GTEST_CAN_STREAM_RESULTS_
-
-// Performs initialization dependent upon flag values obtained in
-// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
-// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
-// this function is also called from RunAllTests.  Since this function can be
-// called more than once, it has to be idempotent.
-void UnitTestImpl::PostFlagParsingInit() {
-  // Ensures that this function does not execute more than once.
-  if (!post_flag_parse_init_performed_) {
-    post_flag_parse_init_performed_ = true;
-
-#if GTEST_HAS_DEATH_TEST
-    InitDeathTestSubprocessControlInfo();
-    SuppressTestEventsIfInSubprocess();
-#endif  // GTEST_HAS_DEATH_TEST
-
-    // Registers parameterized tests. This makes parameterized tests
-    // available to the UnitTest reflection API without running
-    // RUN_ALL_TESTS.
-    RegisterParameterizedTests();
-
-    // Configures listeners for XML output. This makes it possible for users
-    // to shut down the default XML output before invoking RUN_ALL_TESTS.
-    ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
-    // Configures listeners for streaming test results to the specified server.
-    ConfigureStreamingOutput();
-#endif  // GTEST_CAN_STREAM_RESULTS_
-  }
-}
-
-// A predicate that checks the name of a TestCase against a known
-// value.
-//
-// This is used for implementation of the UnitTest class only.  We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestCaseNameIs is copyable.
-class TestCaseNameIs {
- public:
-  // Constructor.
-  explicit TestCaseNameIs(const String& name)
-      : name_(name) {}
-
-  // Returns true iff the name of test_case matches name_.
-  bool operator()(const TestCase* test_case) const {
-    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
-  }
-
- private:
-  String name_;
-};
-
-// Finds and returns a TestCase with the given name.  If one doesn't
-// exist, creates one and returns it.  It's the CALLER'S
-// RESPONSIBILITY to ensure that this function is only called WHEN THE
-// TESTS ARE NOT SHUFFLED.
-//
-// Arguments:
-//
-//   test_case_name: name of the test case
-//   type_param:     the name of the test case's type parameter, or NULL if
-//                   this is not a typed or a type-parameterized test case.
-//   set_up_tc:      pointer to the function that sets up the test case
-//   tear_down_tc:   pointer to the function that tears down the test case
-TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
-                                    const char* type_param,
-                                    Test::SetUpTestCaseFunc set_up_tc,
-                                    Test::TearDownTestCaseFunc tear_down_tc) {
-  // Can we find a TestCase with the given name?
-  const std::vector<TestCase*>::const_iterator test_case =
-      std::find_if(test_cases_.begin(), test_cases_.end(),
-                   TestCaseNameIs(test_case_name));
-
-  if (test_case != test_cases_.end())
-    return *test_case;
-
-  // No.  Let's create one.
-  TestCase* const new_test_case =
-      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
-
-  // Is this a death test case?
-  if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),
-                                               kDeathTestCaseFilter)) {
-    // Yes.  Inserts the test case after the last death test case
-    // defined so far.  This only works when the test cases haven't
-    // been shuffled.  Otherwise we may end up running a death test
-    // after a non-death test.
-    ++last_death_test_case_;
-    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
-                       new_test_case);
-  } else {
-    // No.  Appends to the end of the list.
-    test_cases_.push_back(new_test_case);
-  }
-
-  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
-  return new_test_case;
-}
-
-// Helpers for setting up / tearing down the given environment.  They
-// are for use in the ForEach() function.
-static void SetUpEnvironment(Environment* env) { env->SetUp(); }
-static void TearDownEnvironment(Environment* env) { env->TearDown(); }
-
-// Runs all tests in this UnitTest object, prints the result, and
-// returns true if all tests are successful.  If any exception is
-// thrown during a test, the test is considered to be failed, but the
-// rest of the tests will still be run.
-//
-// When parameterized tests are enabled, it expands and registers
-// parameterized tests first in RegisterParameterizedTests().
-// All other functions called from RunAllTests() may safely assume that
-// parameterized tests are ready to be counted and run.
-bool UnitTestImpl::RunAllTests() {
-  // Makes sure InitGoogleTest() was called.
-  if (!GTestIsInitialized()) {
-    printf("%s",
-           "\nThis test program did NOT call ::testing::InitGoogleTest "
-           "before calling RUN_ALL_TESTS().  Please fix it.\n");
-    return false;
-  }
-
-  // Do not run any test if the --help flag was specified.
-  if (g_help_flag)
-    return true;
-
-  // Repeats the call to the post-flag parsing initialization in case the
-  // user didn't call InitGoogleTest.
-  PostFlagParsingInit();
-
-  // Even if sharding is not on, test runners may want to use the
-  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
-  // protocol.
-  internal::WriteToShardStatusFileIfNeeded();
-
-  // True iff we are in a subprocess for running a thread-safe-style
-  // death test.
-  bool in_subprocess_for_death_test = false;
-
-#if GTEST_HAS_DEATH_TEST
-  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
-#endif  // GTEST_HAS_DEATH_TEST
-
-  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
-                                        in_subprocess_for_death_test);
-
-  // Compares the full test names with the filter to decide which
-  // tests to run.
-  const bool has_tests_to_run = FilterTests(should_shard
-                                              ? HONOR_SHARDING_PROTOCOL
-                                              : IGNORE_SHARDING_PROTOCOL) > 0;
-
-  // Lists the tests and exits if the --gtest_list_tests flag was specified.
-  if (GTEST_FLAG(list_tests)) {
-    // This must be called *after* FilterTests() has been called.
-    ListTestsMatchingFilter();
-    return true;
-  }
-
-  random_seed_ = GTEST_FLAG(shuffle) ?
-      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
-
-  // True iff at least one test has failed.
-  bool failed = false;
-
-  TestEventListener* repeater = listeners()->repeater();
-
-  repeater->OnTestProgramStart(*parent_);
-
-  // How many times to repeat the tests?  We don't want to repeat them
-  // when we are inside the subprocess of a death test.
-  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
-  // Repeats forever if the repeat count is negative.
-  const bool forever = repeat < 0;
-  for (int i = 0; forever || i != repeat; i++) {
-    // We want to preserve failures generated by ad-hoc test
-    // assertions executed before RUN_ALL_TESTS().
-    ClearNonAdHocTestResult();
-
-    const TimeInMillis start = GetTimeInMillis();
-
-    // Shuffles test cases and tests if requested.
-    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
-      random()->Reseed(random_seed_);
-      // This should be done before calling OnTestIterationStart(),
-      // such that a test event listener can see the actual test order
-      // in the event.
-      ShuffleTests();
-    }
-
-    // Tells the unit test event listeners that the tests are about to start.
-    repeater->OnTestIterationStart(*parent_, i);
-
-    // Runs each test case if there is at least one test to run.
-    if (has_tests_to_run) {
-      // Sets up all environments beforehand.
-      repeater->OnEnvironmentsSetUpStart(*parent_);
-      ForEach(environments_, SetUpEnvironment);
-      repeater->OnEnvironmentsSetUpEnd(*parent_);
-
-      // Runs the tests only if there was no fatal failure during global
-      // set-up.
-      if (!Test::HasFatalFailure()) {
-        for (int test_index = 0; test_index < total_test_case_count();
-             test_index++) {
-          GetMutableTestCase(test_index)->Run();
-        }
-      }
-
-      // Tears down all environments in reverse order afterwards.
-      repeater->OnEnvironmentsTearDownStart(*parent_);
-      std::for_each(environments_.rbegin(), environments_.rend(),
-                    TearDownEnvironment);
-      repeater->OnEnvironmentsTearDownEnd(*parent_);
-    }
-
-    elapsed_time_ = GetTimeInMillis() - start;
-
-    // Tells the unit test event listener that the tests have just finished.
-    repeater->OnTestIterationEnd(*parent_, i);
-
-    // Gets the result and clears it.
-    if (!Passed()) {
-      failed = true;
-    }
-
-    // Restores the original test order after the iteration.  This
-    // allows the user to quickly repro a failure that happens in the
-    // N-th iteration without repeating the first (N - 1) iterations.
-    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
-    // case the user somehow changes the value of the flag somewhere
-    // (it's always safe to unshuffle the tests).
-    UnshuffleTests();
-
-    if (GTEST_FLAG(shuffle)) {
-      // Picks a new random seed for each iteration.
-      random_seed_ = GetNextRandomSeed(random_seed_);
-    }
-  }
-
-  repeater->OnTestProgramEnd(*parent_);
-
-  return !failed;
-}
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded() {
-  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
-  if (test_shard_file != NULL) {
-    FILE* const file = posix::FOpen(test_shard_file, "w");
-    if (file == NULL) {
-      ColoredPrintf(COLOR_RED,
-                    "Could not write to the test shard status file \"%s\" "
-                    "specified by the %s environment variable.\n",
-                    test_shard_file, kTestShardStatusFile);
-      fflush(stdout);
-      exit(EXIT_FAILURE);
-    }
-    fclose(file);
-  }
-}
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (i.e., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-bool ShouldShard(const char* total_shards_env,
-                 const char* shard_index_env,
-                 bool in_subprocess_for_death_test) {
-  if (in_subprocess_for_death_test) {
-    return false;
-  }
-
-  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
-  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
-
-  if (total_shards == -1 && shard_index == -1) {
-    return false;
-  } else if (total_shards == -1 && shard_index != -1) {
-    const Message msg = Message()
-      << "Invalid environment variables: you have "
-      << kTestShardIndex << " = " << shard_index
-      << ", but have left " << kTestTotalShards << " unset.\n";
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
-    fflush(stdout);
-    exit(EXIT_FAILURE);
-  } else if (total_shards != -1 && shard_index == -1) {
-    const Message msg = Message()
-      << "Invalid environment variables: you have "
-      << kTestTotalShards << " = " << total_shards
-      << ", but have left " << kTestShardIndex << " unset.\n";
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
-    fflush(stdout);
-    exit(EXIT_FAILURE);
-  } else if (shard_index < 0 || shard_index >= total_shards) {
-    const Message msg = Message()
-      << "Invalid environment variables: we require 0 <= "
-      << kTestShardIndex << " < " << kTestTotalShards
-      << ", but you have " << kTestShardIndex << "=" << shard_index
-      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
-    fflush(stdout);
-    exit(EXIT_FAILURE);
-  }
-
-  return total_shards > 1;
-}
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error
-// and aborts.
-Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
-  const char* str_val = posix::GetEnv(var);
-  if (str_val == NULL) {
-    return default_val;
-  }
-
-  Int32 result;
-  if (!ParseInt32(Message() << "The value of environment variable " << var,
-                  str_val, &result)) {
-    exit(EXIT_FAILURE);
-  }
-  return result;
-}
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
-  return (test_id % total_shards) == shard_index;
-}
-
-// Compares the name of each test with the user-specified filter to
-// decide whether the test should be run, then records the result in
-// each TestCase and TestInfo object.
-// If shard_tests == true, further filters tests based on sharding
-// variables in the environment - see
-// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
-// Returns the number of tests that should run.
-int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
-  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
-      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
-  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
-      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
-
-  // num_runnable_tests are the number of tests that will
-  // run across all shards (i.e., match filter and are not disabled).
-  // num_selected_tests are the number of tests to be run on
-  // this shard.
-  int num_runnable_tests = 0;
-  int num_selected_tests = 0;
-  for (size_t i = 0; i < test_cases_.size(); i++) {
-    TestCase* const test_case = test_cases_[i];
-    const String &test_case_name = test_case->name();
-    test_case->set_should_run(false);
-
-    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
-      TestInfo* const test_info = test_case->test_info_list()[j];
-      const String test_name(test_info->name());
-      // A test is disabled if test case name or test name matches
-      // kDisableTestFilter.
-      const bool is_disabled =
-          internal::UnitTestOptions::MatchesFilter(test_case_name,
-                                                   kDisableTestFilter) ||
-          internal::UnitTestOptions::MatchesFilter(test_name,
-                                                   kDisableTestFilter);
-      test_info->is_disabled_ = is_disabled;
-
-      const bool matches_filter =
-          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
-                                                       test_name);
-      test_info->matches_filter_ = matches_filter;
-
-      const bool is_runnable =
-          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
-          matches_filter;
-
-      const bool is_selected = is_runnable &&
-          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
-           ShouldRunTestOnShard(total_shards, shard_index,
-                                num_runnable_tests));
-
-      num_runnable_tests += is_runnable;
-      num_selected_tests += is_selected;
-
-      test_info->should_run_ = is_selected;
-      test_case->set_should_run(test_case->should_run() || is_selected);
-    }
-  }
-  return num_selected_tests;
-}
-
-// Prints the names of the tests matching the user-specified filter flag.
-void UnitTestImpl::ListTestsMatchingFilter() {
-  for (size_t i = 0; i < test_cases_.size(); i++) {
-    const TestCase* const test_case = test_cases_[i];
-    bool printed_test_case_name = false;
-
-    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
-      const TestInfo* const test_info =
-          test_case->test_info_list()[j];
-      if (test_info->matches_filter_) {
-        if (!printed_test_case_name) {
-          printed_test_case_name = true;
-          printf("%s.\n", test_case->name());
-        }
-        printf("  %s\n", test_info->name());
-      }
-    }
-  }
-  fflush(stdout);
-}
-
-// Sets the OS stack trace getter.
-//
-// Does nothing if the input and the current OS stack trace getter are
-// the same; otherwise, deletes the old getter and makes the input the
-// current getter.
-void UnitTestImpl::set_os_stack_trace_getter(
-    OsStackTraceGetterInterface* getter) {
-  if (os_stack_trace_getter_ != getter) {
-    delete os_stack_trace_getter_;
-    os_stack_trace_getter_ = getter;
-  }
-}
-
-// Returns the current OS stack trace getter if it is not NULL;
-// otherwise, creates an OsStackTraceGetter, makes it the current
-// getter, and returns it.
-OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
-  if (os_stack_trace_getter_ == NULL) {
-    os_stack_trace_getter_ = new OsStackTraceGetter;
-  }
-
-  return os_stack_trace_getter_;
-}
-
-// Returns the TestResult for the test that's currently running, or
-// the TestResult for the ad hoc test if no test is running.
-TestResult* UnitTestImpl::current_test_result() {
-  return current_test_info_ ?
-      &(current_test_info_->result_) : &ad_hoc_test_result_;
-}
-
-// Shuffles all test cases, and the tests within each test case,
-// making sure that death tests are still run first.
-void UnitTestImpl::ShuffleTests() {
-  // Shuffles the death test cases.
-  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
-
-  // Shuffles the non-death test cases.
-  ShuffleRange(random(), last_death_test_case_ + 1,
-               static_cast<int>(test_cases_.size()), &test_case_indices_);
-
-  // Shuffles the tests inside each test case.
-  for (size_t i = 0; i < test_cases_.size(); i++) {
-    test_cases_[i]->ShuffleTests(random());
-  }
-}
-
-// Restores the test cases and tests to their order before the first shuffle.
-void UnitTestImpl::UnshuffleTests() {
-  for (size_t i = 0; i < test_cases_.size(); i++) {
-    // Unshuffles the tests in each test case.
-    test_cases_[i]->UnshuffleTests();
-    // Resets the index of each test case.
-    test_case_indices_[i] = static_cast<int>(i);
-  }
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag.  The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
-                                       int skip_count) {
-  // We pass skip_count + 1 to skip this wrapper function in addition
-  // to what the user really wants to skip.
-  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
-}
-
-// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
-// suppress unreachable code warnings.
-namespace {
-class ClassUniqueToAlwaysTrue {};
-}
-
-bool IsTrue(bool condition) { return condition; }
-
-bool AlwaysTrue() {
-#if GTEST_HAS_EXCEPTIONS
-  // This condition is always false so AlwaysTrue() never actually throws,
-  // but it makes the compiler think that it may throw.
-  if (IsTrue(false))
-    throw ClassUniqueToAlwaysTrue();
-#endif  // GTEST_HAS_EXCEPTIONS
-  return true;
-}
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false.  None of pstr, *pstr, and prefix can be NULL.
-bool SkipPrefix(const char* prefix, const char** pstr) {
-  const size_t prefix_len = strlen(prefix);
-  if (strncmp(*pstr, prefix, prefix_len) == 0) {
-    *pstr += prefix_len;
-    return true;
-  }
-  return false;
-}
-
-// Parses a string as a command line flag.  The string should have
-// the format "--flag=value".  When def_optional is true, the "=value"
-// part can be omitted.
-//
-// Returns the value of the flag, or NULL if the parsing failed.
-const char* ParseFlagValue(const char* str,
-                           const char* flag,
-                           bool def_optional) {
-  // str and flag must not be NULL.
-  if (str == NULL || flag == NULL) return NULL;
-
-  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
-  const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag);
-  const size_t flag_len = flag_str.length();
-  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
-
-  // Skips the flag name.
-  const char* flag_end = str + flag_len;
-
-  // When def_optional is true, it's OK to not have a "=value" part.
-  if (def_optional && (flag_end[0] == '\0')) {
-    return flag_end;
-  }
-
-  // If def_optional is true and there are more characters after the
-  // flag name, or if def_optional is false, there must be a '=' after
-  // the flag name.
-  if (flag_end[0] != '=') return NULL;
-
-  // Returns the string after "=".
-  return flag_end + 1;
-}
-
-// Parses a string for a bool flag, in the form of either
-// "--flag=value" or "--flag".
-//
-// In the former case, the value is taken as true as long as it does
-// not start with '0', 'f', or 'F'.
-//
-// In the latter case, the value is taken as true.
-//
-// On success, stores the value of the flag in *value, and returns
-// true.  On failure, returns false without changing *value.
-bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
-  // Gets the value of the flag as a string.
-  const char* const value_str = ParseFlagValue(str, flag, true);
-
-  // Aborts if the parsing failed.
-  if (value_str == NULL) return false;
-
-  // Converts the string value to a bool.
-  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
-  return true;
-}
-
-// Parses a string for an Int32 flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true.  On failure, returns false without changing *value.
-bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
-  // Gets the value of the flag as a string.
-  const char* const value_str = ParseFlagValue(str, flag, false);
-
-  // Aborts if the parsing failed.
-  if (value_str == NULL) return false;
-
-  // Sets *value to the value of the flag.
-  return ParseInt32(Message() << "The value of flag --" << flag,
-                    value_str, value);
-}
-
-// Parses a string for a string flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true.  On failure, returns false without changing *value.
-bool ParseStringFlag(const char* str, const char* flag, String* value) {
-  // Gets the value of the flag as a string.
-  const char* const value_str = ParseFlagValue(str, flag, false);
-
-  // Aborts if the parsing failed.
-  if (value_str == NULL) return false;
-
-  // Sets *value to the value of the flag.
-  *value = value_str;
-  return true;
-}
-
-// Determines whether a string has a prefix that Google Test uses for its
-// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
-// If Google Test detects that a command line flag has its prefix but is not
-// recognized, it will print its help message. Flags starting with
-// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
-// internal flags and do not trigger the help message.
-static bool HasGoogleTestFlagPrefix(const char* str) {
-  return (SkipPrefix("--", &str) ||
-          SkipPrefix("-", &str) ||
-          SkipPrefix("/", &str)) &&
-         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
-         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
-          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
-}
-
-// Prints a string containing code-encoded text.  The following escape
-// sequences can be used in the string to control the text color:
-//
-//   @@    prints a single '@' character.
-//   @R    changes the color to red.
-//   @G    changes the color to green.
-//   @Y    changes the color to yellow.
-//   @D    changes to the default terminal text color.
-//
-// TODO(wan at google.com): Write tests for this once we add stdout
-// capturing to Google Test.
-static void PrintColorEncoded(const char* str) {
-  GTestColor color = COLOR_DEFAULT;  // The current color.
-
-  // Conceptually, we split the string into segments divided by escape
-  // sequences.  Then we print one segment at a time.  At the end of
-  // each iteration, the str pointer advances to the beginning of the
-  // next segment.
-  for (;;) {
-    const char* p = strchr(str, '@');
-    if (p == NULL) {
-      ColoredPrintf(color, "%s", str);
-      return;
-    }
-
-    ColoredPrintf(color, "%s", String(str, p - str).c_str());
-
-    const char ch = p[1];
-    str = p + 2;
-    if (ch == '@') {
-      ColoredPrintf(color, "@");
-    } else if (ch == 'D') {
-      color = COLOR_DEFAULT;
-    } else if (ch == 'R') {
-      color = COLOR_RED;
-    } else if (ch == 'G') {
-      color = COLOR_GREEN;
-    } else if (ch == 'Y') {
-      color = COLOR_YELLOW;
-    } else {
-      --str;
-    }
-  }
-}
-
-static const char kColorEncodedHelpMessage[] =
-"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
-"following command line flags to control its behavior:\n"
-"\n"
-"Test Selection:\n"
-"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
-"      List the names of all tests instead of running them. The name of\n"
-"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
-"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
-    "[@G- at YNEGATIVE_PATTERNS]@D\n"
-"      Run only the tests whose name matches one of the positive patterns but\n"
-"      none of the negative patterns. '?' matches any single character; '*'\n"
-"      matches any substring; ':' separates two patterns.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
-"      Run all disabled tests too.\n"
-"\n"
-"Test Execution:\n"
-"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
-"      Run the tests repeatedly; use a negative count to repeat forever.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
-"      Randomize tests' orders on every iteration.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
-"      Random number seed to use for shuffling test orders (between 1 and\n"
-"      99999, or 0 to use a seed based on the current time).\n"
-"\n"
-"Test Output:\n"
-"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
-"      Enable/disable colored output. The default is @Gauto at D.\n"
-"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
-"      Don't print the elapsed time of each test.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
-    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
-"      Generate an XML report in the given directory or with the given file\n"
-"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
-#if GTEST_CAN_STREAM_RESULTS_
-"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
-"      Stream test results to the given server.\n"
-#endif  // GTEST_CAN_STREAM_RESULTS_
-"\n"
-"Assertion Behavior:\n"
-#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
-"      Set the default death test style.\n"
-#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
-"      Turn assertion failures into debugger break-points.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
-"      Turn assertion failures into C++ exceptions.\n"
-"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
-"      Do not report exceptions as test failures. Instead, allow them\n"
-"      to crash the program or throw a pop-up (on Windows).\n"
-"\n"
-"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
-    "the corresponding\n"
-"environment variable of a flag (all letters in upper-case). For example, to\n"
-"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
-    "color=no at D or set\n"
-"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
-"\n"
-"For more information, please read the " GTEST_NAME_ " documentation at\n"
-"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
-"(not one in your own code or tests), please report it to\n"
-"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.  The type parameter CharType can be
-// instantiated to either char or wchar_t.
-template <typename CharType>
-void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
-  for (int i = 1; i < *argc; i++) {
-    const String arg_string = StreamableToString(argv[i]);
-    const char* const arg = arg_string.c_str();
-
-    using internal::ParseBoolFlag;
-    using internal::ParseInt32Flag;
-    using internal::ParseStringFlag;
-
-    // Do we see a Google Test flag?
-    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
-                      &GTEST_FLAG(also_run_disabled_tests)) ||
-        ParseBoolFlag(arg, kBreakOnFailureFlag,
-                      &GTEST_FLAG(break_on_failure)) ||
-        ParseBoolFlag(arg, kCatchExceptionsFlag,
-                      &GTEST_FLAG(catch_exceptions)) ||
-        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
-        ParseStringFlag(arg, kDeathTestStyleFlag,
-                        &GTEST_FLAG(death_test_style)) ||
-        ParseBoolFlag(arg, kDeathTestUseFork,
-                      &GTEST_FLAG(death_test_use_fork)) ||
-        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
-        ParseStringFlag(arg, kInternalRunDeathTestFlag,
-                        &GTEST_FLAG(internal_run_death_test)) ||
-        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
-        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
-        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
-        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
-        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
-        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
-        ParseInt32Flag(arg, kStackTraceDepthFlag,
-                       &GTEST_FLAG(stack_trace_depth)) ||
-        ParseStringFlag(arg, kStreamResultToFlag,
-                        &GTEST_FLAG(stream_result_to)) ||
-        ParseBoolFlag(arg, kThrowOnFailureFlag,
-                      &GTEST_FLAG(throw_on_failure))
-        ) {
-      // Yes.  Shift the remainder of the argv list left by one.  Note
-      // that argv has (*argc + 1) elements, the last one always being
-      // NULL.  The following loop moves the trailing NULL element as
-      // well.
-      for (int j = i; j != *argc; j++) {
-        argv[j] = argv[j + 1];
-      }
-
-      // Decrements the argument count.
-      (*argc)--;
-
-      // We also need to decrement the iterator as we just removed
-      // an element.
-      i--;
-    } else if (arg_string == "--help" || arg_string == "-h" ||
-               arg_string == "-?" || arg_string == "/?" ||
-               HasGoogleTestFlagPrefix(arg)) {
-      // Both help flag and unrecognized Google Test flags (excluding
-      // internal ones) trigger help display.
-      g_help_flag = true;
-    }
-  }
-
-  if (g_help_flag) {
-    // We print the help here instead of in RUN_ALL_TESTS(), as the
-    // latter may not be called at all if the user is using Google
-    // Test with another testing framework.
-    PrintColorEncoded(kColorEncodedHelpMessage);
-  }
-}
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
-  ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
-  ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-
-// The internal implementation of InitGoogleTest().
-//
-// The type parameter CharType can be instantiated to either char or
-// wchar_t.
-template <typename CharType>
-void InitGoogleTestImpl(int* argc, CharType** argv) {
-  g_init_gtest_count++;
-
-  // We don't want to run the initialization code twice.
-  if (g_init_gtest_count != 1) return;
-
-  if (*argc <= 0) return;
-
-  internal::g_executable_path = internal::StreamableToString(argv[0]);
-
-#if GTEST_HAS_DEATH_TEST
-
-  g_argvs.clear();
-  for (int i = 0; i != *argc; i++) {
-    g_argvs.push_back(StreamableToString(argv[i]));
-  }
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-  ParseGoogleTestFlagsOnly(argc, argv);
-  GetUnitTestImpl()->PostFlagParsingInit();
-}
-
-}  // namespace internal
-
-// Initializes Google Test.  This must be called before calling
-// RUN_ALL_TESTS().  In particular, it parses a command line for the
-// flags that Google Test recognizes.  Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned.  Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-void InitGoogleTest(int* argc, char** argv) {
-  internal::InitGoogleTestImpl(argc, argv);
-}
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-void InitGoogleTest(int* argc, wchar_t** argv) {
-  internal::InitGoogleTestImpl(argc, argv);
-}
-
-}  // namespace testing
diff --git a/unit_tests/gtest/src/gtest_main.cc b/unit_tests/gtest/src/gtest_main.cc
index a09bbe0..f302822 100644
--- a/unit_tests/gtest/src/gtest_main.cc
+++ b/unit_tests/gtest/src/gtest_main.cc
@@ -27,13 +27,12 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#include <iostream>
+#include <stdio.h>
 
 #include "gtest/gtest.h"
 
 GTEST_API_ int main(int argc, char **argv) {
-  std::cout << "Running main() from gtest_main.cc\n";
-
+  printf("Running main() from gtest_main.cc\n");
   testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
 }
diff --git a/unit_tests/test_allocators_mmap.cc b/unit_tests/test_allocators_mmap.cc
new file mode 100644
index 0000000..09a23fa
--- /dev/null
+++ b/unit_tests/test_allocators_mmap.cc
@@ -0,0 +1,15 @@
+#include <gtest/gtest.h>
+#include <jellyfish/allocators_mmap.hpp>
+
+namespace {
+TEST(AllocMmap, Simple) {
+  static const size_t size = 4096;
+  allocators::mmap mem(size);
+
+  EXPECT_EQ(size, mem.get_size());
+  EXPECT_NE((void*)0, mem.get_ptr());
+  char* ptr = (char*)mem.get_ptr();
+  // char c = ptr[size];
+  // EXPECT_EQ((char)0, c);
+}
+}
diff --git a/unit_tests/test_atomic_bits_array.cc b/unit_tests/test_atomic_bits_array.cc
new file mode 100644
index 0000000..1925a25
--- /dev/null
+++ b/unit_tests/test_atomic_bits_array.cc
@@ -0,0 +1,32 @@
+#include <memory>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/atomic_bits_array.hpp>
+
+namespace {
+TEST(AtomicBitsArray, Fill) {
+  static const size_t size = 2066;
+  static const int    bits = 3;
+  jellyfish::atomic_bits_array<unsigned char> ary(bits, size);
+  std::unique_ptr<unsigned char[]> data(new unsigned char[size]);
+
+  for(size_t i = 0; i < size; ++i) {
+    data[i] = random_bits(bits);
+    auto e = ary[i];
+    e.get();
+    EXPECT_TRUE(e.set(data[i]));
+  }
+
+  auto it = ary.begin();
+  auto it_end = ary.end();
+  for(size_t i = 0; i < size; ++i, ++it) {
+    auto e = ary[i];
+    EXPECT_EQ(data[i], e.get());
+    EXPECT_EQ(data[i], (unsigned char)e);
+    ASSERT_NE(it_end, it);
+    EXPECT_EQ(data[i], *it);
+  }
+  EXPECT_EQ(it_end, it);
+}
+}
diff --git a/unit_tests/test_cond.cc b/unit_tests/test_cond.cc
new file mode 100644
index 0000000..787aa1b
--- /dev/null
+++ b/unit_tests/test_cond.cc
@@ -0,0 +1,80 @@
+#include <gtest/gtest.h>
+#include <jellyfish/locks_pthread.hpp>
+
+using testing::Types;
+
+#define NB_THREADS 3
+#define COUNT	1000000
+
+template <class cond>
+class CondTest : public ::testing::Test
+{
+  int				volatile count;
+  int				count_at_signal;
+  cond				count_cond;
+  pthread_t			threads[NB_THREADS+1];
+  pthread_attr_t		attr;
+
+public:
+  CondTest() : count(0), count_at_signal(0), count_cond() {
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+    pthread_create(&threads[0], &attr, master_fun, (void *)this);
+
+    for(int i = 1; i < NB_THREADS+1; i++)
+      pthread_create(&threads[i], &attr, thread_fun, (void *)this);
+    
+    for(int i = 0; i <= NB_THREADS; i++)
+      pthread_join(threads[i], NULL);
+  }
+
+  static void *master_fun(void *t) {
+    CondTest<cond> *self = (CondTest<cond> *)t;
+    
+    self->master_wait();
+    return NULL;
+  }
+  void master_wait() {
+    count_cond.lock();
+    count_cond.wait();
+    count_at_signal = count;
+    sleep(1);
+    count *= 10;
+    count_cond.unlock();
+  }
+
+  static void *thread_fun(void *t) {
+    CondTest<cond> *self = (CondTest<cond> *)t;
+
+    self->inc();
+    return NULL;
+  }
+
+  void inc() {
+    for(int i = 0; i < COUNT; i++) {
+      count_cond.lock();
+      if(count < 1000000) {
+	count++;
+	if(count > 100000)
+	  count_cond.signal();
+	count_cond.unlock();
+      } else {
+	count_cond.unlock();
+	return;
+      }
+    }
+  }
+
+
+  int get_count() { return count; }
+  int get_count_at_signal() { return count_at_signal; }
+};
+
+typedef Types<locks::pthread::cond> Implementations;
+
+TYPED_TEST_CASE(CondTest, Implementations);
+
+TYPED_TEST(CondTest, SuccessfullLocking) {
+  EXPECT_EQ(10 *this->get_count_at_signal(), this->get_count());
+}
diff --git a/unit_tests/test_cooperative_pool2.cc b/unit_tests/test_cooperative_pool2.cc
new file mode 100644
index 0000000..44f4bf3
--- /dev/null
+++ b/unit_tests/test_cooperative_pool2.cc
@@ -0,0 +1,89 @@
+#include <gtest/gtest.h>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/thread_exec.hpp>
+
+namespace {
+// Generate all numbers in [0, producers * max)
+class sequence : public jellyfish::cooperative_pool2<sequence, int> {
+  typedef jellyfish::cooperative_pool2<sequence, int> super;
+
+  const uint32_t   max_;
+  std::vector<int> cur_;
+  const uint32_t   producers_;
+
+public:
+  std::vector<int> check_;
+  sequence(uint32_t producers, uint32_t threads, uint32_t max) :
+    super(producers, 3 * threads),
+    max_(max),
+    cur_(producers, 0),
+    producers_(producers),
+    check_(max * producers, 0)
+  { }
+
+  bool produce(uint32_t i, int& e) {
+    assert(i < producers_);
+    int& cur = cur_[i];
+    if(cur < max_) {
+      e = i * max_ + cur++;
+      __sync_add_and_fetch(&check_[e], 1);
+      return false;
+    }
+    return true;
+  }
+};
+
+class list_ints : public jellyfish::thread_exec {
+  sequence         seq_;
+  std::vector<int> check_;
+public:
+  list_ints(uint32_t producers, uint32_t threads, uint32_t max) : seq_(producers, threads, max), check_(producers * max, 0) { }
+  virtual void start(int i) {
+    while(true) {
+      sequence::job j(seq_);
+      if(j.is_empty())
+        break;
+      ++check_[*j];
+    }
+  }
+
+  bool check() const {
+    for(auto it = check_.cbegin(); it != check_.cend(); ++it)
+      if(*it != 1)
+        return false;
+    return true;
+  }
+
+  bool check_print() const {
+    if(check())
+      return true;
+
+    for(auto it = check_.cbegin(); it != check_.cend(); ++it)
+      printf("%d", *it);
+    printf("\n----------\n");
+    for(auto it = seq_.check_.cbegin(); it != seq_.check_.cend(); ++it)
+      printf("%d", *it);
+    printf("\n");
+    return false;
+  }
+};
+
+class CooperativePoolTest : public ::testing::TestWithParam<uint32_t> {
+public:
+  static const uint32_t nb_threads = 10;
+  CooperativePoolTest() : workers(GetParam(), nb_threads, 1000) { }
+
+protected:
+  list_ints workers;
+};
+
+TEST_P(CooperativePoolTest, Ints) {
+  workers.exec_join(nb_threads);
+  EXPECT_TRUE(workers.check_print());
+}
+
+INSTANTIATE_TEST_CASE_P(CooperativePool,
+                        CooperativePoolTest,
+                        ::testing::Range((uint32_t)1, CooperativePoolTest::nb_threads + 1));
+
+} // namespace {
diff --git a/unit_tests/test_dumpers.cc b/unit_tests/test_dumpers.cc
new file mode 100644
index 0000000..3fd0623
--- /dev/null
+++ b/unit_tests/test_dumpers.cc
@@ -0,0 +1,144 @@
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/binary_dumper.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/mapped_file.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+using jellyfish::file_header;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::eager_iterator iterator;
+
+struct binary {
+  typedef jellyfish::binary_dumper<hash_counter::array> dumper;
+  typedef jellyfish::binary_reader<mer_dna, uint64_t> reader;
+  typedef jellyfish::binary_query_base<mer_dna, uint64_t> query;
+};
+struct text {
+  typedef jellyfish::text_dumper<hash_counter::array> dumper;
+  typedef jellyfish::text_reader<mer_dna, uint64_t> reader;
+};
+
+
+TEST(Dumper, IO) {
+  static const int   mer_len          = 50;
+  static const int   hash_size        = 5000;
+  static const int   nb               = hash_size;
+  static const int   hash_val_len     = 5;
+  static const int   dump_counter_len = 1;
+  static const char* file_binary      = "./binary_dumper";
+  static const char* file_text        = "./text_dumper";
+
+  file_unlink bf(file_binary);
+  file_unlink tf(file_text);
+
+  mer_dna::k(mer_len);
+  hash_counter hash(hash_size, mer_len * 2, 5 /* val len */, 1 /* nb threads */);
+
+  mer_dna m;
+  for(int i = 0; i < nb; i++) {
+    m.randomize();
+    const uint64_t rval = random_bits(9);
+    hash.add(m, rval);
+    uint64_t val;
+    ASSERT_TRUE(hash.ary()->get_val_for_key(m, &val));
+    EXPECT_EQ(rval, val);
+  }
+
+  // Dump without zeroing to check dumped content against in memory hash
+  {
+    file_header bh;
+    bh.fill_standard();
+    bh.update_from_ary(*hash.ary());
+    binary::dumper bd(dump_counter_len, mer_len * 2, 4, file_binary, &bh);
+    bd.one_file(true);
+    bd.zero_array(false);
+    bd.dump(hash.ary());
+
+    file_header th;
+    th.fill_standard();
+    th.update_from_ary(*hash.ary());
+    text::dumper td(4, file_text, &th);
+    td.one_file(true);
+    td.zero_array(false);
+    td.dump(hash.ary());
+  }
+
+  // Check dumped content
+  {
+    file_header bh;
+    std::ifstream bis(file_binary);
+    bh.read(bis);
+    EXPECT_STREQ(binary::dumper::format, bh.format().c_str());
+    EXPECT_EQ(dump_counter_len, bh.counter_len());
+    binary::reader br(bis, &bh);
+
+    jellyfish::mapped_file binary_map(file_binary);
+    binary::query bq(binary_map.base() + bh.offset(), bh.key_len(), bh.counter_len(), bh.matrix(),
+                     bh.size() - 1, binary_map.length() - bh.offset());
+
+    file_header th;
+    std::ifstream tis(file_text);
+    th.read(tis);
+    EXPECT_STREQ(binary::dumper::format, bh.format().c_str());
+    text::reader tr(tis, &th);
+
+    const uint64_t max_val = ((uint64_t)1 << (8 * dump_counter_len)) - 1;
+    int bcount = 0, tcount = 0, qcount = 0;
+    mer_dna tmp_key;
+    while(br.next()) {
+      uint64_t val = 0;
+      size_t   id  = 0;
+      bool present = hash.ary()->get_val_for_key(br.key(), &val, tmp_key, &id);
+      EXPECT_TRUE(present);
+      if(present) {
+        EXPECT_EQ(std::min(max_val, val), br.val());
+        ++bcount;
+      }
+
+      EXPECT_TRUE(tr.next());
+      present = hash.ary()->get_val_for_key(tr.key(), &val);
+      EXPECT_TRUE(present);
+      if(present) {
+        EXPECT_EQ(val, tr.val());
+        ++tcount;
+      }
+
+      uint64_t query_val;
+      uint64_t query_id;
+      present = bq.val_id(br.key(), &query_val, &query_id);
+      EXPECT_TRUE(present);
+      if(present) {
+        EXPECT_EQ(std::min(max_val, val), query_val);
+        // EXPECT_EQ(id, query_id);
+        ++qcount;
+      }
+    }
+    EXPECT_EQ(nb, bcount);
+    EXPECT_EQ(nb, tcount);
+    EXPECT_EQ(nb, qcount);
+  }
+
+  // Dump with zeroing and check hash is empty
+  {
+    file_header bh;
+    bh.fill_standard();
+    bh.update_from_ary(*hash.ary());
+    binary::dumper bd(dump_counter_len, mer_len * 2, 4, file_binary, &bh);
+    bd.one_file(true);
+    bd.zero_array(true);
+    bd.dump(hash.ary());
+  }
+  {
+    iterator it = hash.ary()->eager_slice(0, 1);
+    uint64_t count = 0;
+    while(it.next()) ++count;
+    EXPECT_EQ((uint64_t)0, count);
+  }
+}
+
+} // namespace {
diff --git a/unit_tests/test_file_header.cc b/unit_tests/test_file_header.cc
new file mode 100644
index 0000000..b635c4a
--- /dev/null
+++ b/unit_tests/test_file_header.cc
@@ -0,0 +1,90 @@
+#include <iostream>
+#include <sstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/storage.hpp>
+
+namespace {
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using std::ostringstream;
+using std::istringstream;
+using std::string;
+
+TEST(FileHeader, Standard) {
+  file_header h;
+
+  EXPECT_EQ("", h["hostname"]);
+  EXPECT_EQ("", h["pwd"]);
+  EXPECT_EQ("", h["time"]);
+  EXPECT_EQ("", h["exe_path"]);
+
+  h.fill_standard();
+
+  EXPECT_NE("", h["hostname"]);
+  EXPECT_NE("", h["pwd"]);
+  EXPECT_NE("", h["time"]);
+  EXPECT_NE("", h["exe_path"]);
+}
+
+TEST(FileHeader, WriteRead) {
+  file_header hw;
+  ostringstream os;
+  os.fill('A');
+  os.width(20);
+  os << std::hex;
+  std::ios::fmtflags flags = os.flags();
+  const size_t random_size = random_bits(35);
+  const unsigned int val_len = random_bits(4);
+  const unsigned int max_reprobe = random_bits(7);
+  const double fpr = (double)random_bits(10) / 1024.0;
+  RectangularBinaryMatrix m(random_bits(6) + 1, random_bits(8) + 1);
+  m.randomize(random_bits);
+
+  EXPECT_EQ(8, hw.alignment());
+  hw.fill_standard();
+  hw.size(random_size);
+  hw.matrix(m);
+  hw.key_len(m.r());
+  hw.val_len(val_len);
+  hw.max_reprobe(max_reprobe);
+  hw.set_reprobes(jellyfish::quadratic_reprobes);
+  hw.fpr(fpr);
+  hw.write(os);
+  EXPECT_EQ(0, os.tellp() % 8);
+  EXPECT_EQ('A', os.fill());
+  EXPECT_EQ(20, os.width());
+  EXPECT_EQ(flags, os.flags());
+  os.width(0);
+  const string ah("After header");
+  os << ah;
+
+  //  std::cerr << os.str() << "\n";
+  istringstream is(os.str());
+
+  file_header hr;
+  EXPECT_TRUE(hr.read(is));
+  EXPECT_EQ(is.tellg(), hr.offset());
+  EXPECT_EQ(0, is.tellg() % 8);
+  EXPECT_EQ(8, hr.alignment());
+  EXPECT_EQ(random_size, hr.size());
+  EXPECT_EQ(m, hr.matrix());
+  EXPECT_EQ(m.r(), hr.key_len());
+  EXPECT_EQ(val_len, hr.val_len());
+  EXPECT_EQ(fpr, hr.fpr());
+
+  size_t reprobes[max_reprobe + 1];
+  hr.get_reprobes(reprobes);
+  for(unsigned int i = 0; i <= max_reprobe; ++i)
+    EXPECT_EQ(jellyfish::quadratic_reprobes[i], reprobes[i]);
+
+  // Not sure why the following fails. But all the fields come out
+  // equal so ignore for now
+  // EXPECT_EQ(hw, hr);
+  string line;
+  getline(is, line);
+  EXPECT_EQ(ah, line);
+}
+} // namespace {
diff --git a/unit_tests/test_generator_manager.cc b/unit_tests/test_generator_manager.cc
new file mode 100644
index 0000000..f13445b
--- /dev/null
+++ b/unit_tests/test_generator_manager.cc
@@ -0,0 +1,95 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/generator_manager.hpp>
+
+namespace {
+static const int nb_pipes = 5;
+TEST(TmpPipes, CreateDestroy) {
+  std::vector<std::string> pipe_paths;
+
+  {
+    jellyfish::tmp_pipes pipes(nb_pipes);
+    EXPECT_EQ(nb_pipes, pipes.size());
+    for(int i = 0; i < nb_pipes; ++i) {
+      struct stat buf;
+      ASSERT_EQ(0, stat(pipes[i], &buf));
+      EXPECT_TRUE(S_ISFIFO(buf.st_mode));
+      pipe_paths.push_back(pipes[i]);
+    }
+   }
+
+  for(auto it = pipe_paths.begin(); it != pipe_paths.end(); ++it) {
+    struct stat buf;
+    EXPECT_EQ(-1, stat(it->c_str(), &buf));
+  }
+}
+
+TEST(TmpPipes, Discard) {
+  jellyfish::tmp_pipes pipes(nb_pipes);
+  for(int i = 0; i < nb_pipes; ++i) {
+    ASSERT_STRNE("", pipes[i]);
+    std::string path(pipes[i]);
+    int fd = open(path.c_str(), O_RDONLY|O_NONBLOCK);
+    ASSERT_NE(-1, fd);
+    pipes.discard(i);
+
+    EXPECT_STREQ("", pipes[i]);
+    struct stat buf;
+    EXPECT_EQ(-1, stat(path.c_str(), &buf));
+    char rbuf[1];
+    EXPECT_EQ((ssize_t)0, read(fd, rbuf, 1));
+    close(fd);
+  }
+}
+
+TEST(GeneratorManager, OneLiners) {
+  static const char* cmds_file = "./cmds_file";
+  file_unlink unlink_cmds(cmds_file);
+
+  {
+    std::ofstream cmds(cmds_file, std::ios::out|std::ios::trunc);
+    ASSERT_TRUE(cmds.good()) << "Failed to open cmd file '" << cmds_file << "'";
+    cmds << "echo hello\n"
+         << "date\n"
+         << "uptime\n"
+         << "uname\n";
+    ASSERT_TRUE(cmds.good()) << "Failed to write to cmd file";
+  }
+
+  std::ifstream cmds(cmds_file);
+  ASSERT_TRUE(cmds.good()) << "Failed top open cmd file '" << cmds_file << "'";
+  static const int             nb_pipes     = 2;
+  int                          active_pipes = nb_pipes;
+  bool                         active[nb_pipes];
+  jellyfish::generator_manager manager(cmds_file, nb_pipes);
+  manager.start();
+  for(int i = 0; i < nb_pipes; ++i)
+    active[i] = true;
+  std::vector<std::string> lines;
+  while(active_pipes > 0) {
+    for(int i = 0; i < nb_pipes; ++i) {
+      if(!active[i])
+        continue;
+      std::ifstream p(manager.pipes()[i]);
+      if(!p.good()) {
+        active[i] = false;
+        --active_pipes;
+        continue;
+      }
+      std::string line;
+      while(std::getline(p, line))
+        lines.push_back(line);
+    }
+  }
+  EXPECT_TRUE(manager.wait());
+
+  EXPECT_EQ((size_t)4, lines.size());
+}
+}
diff --git a/unit_tests/test_hash_counter.cc b/unit_tests/test_hash_counter.cc
new file mode 100644
index 0000000..08909d4
--- /dev/null
+++ b/unit_tests/test_hash_counter.cc
@@ -0,0 +1,104 @@
+#include <gtest/gtest.h>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <map>
+#include <vector>
+#include <limits>
+
+namespace {
+using jellyfish::thread_exec;
+using jellyfish::mer_dna;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::lazy_iterator lazy_iterator;
+
+enum OPERATION { ADD, SET };
+
+class hash_adder : public thread_exec {
+  typedef std::map<mer_dna, uint64_t> map;
+  typedef std::vector<map>            maps;
+
+  hash_counter& hash_;
+  int           nb_;
+  maps          check_;
+  OPERATION     op_;
+
+public:
+  hash_adder(hash_counter& hash, int nb, int nb_threads, OPERATION op) :
+    hash_(hash),
+    nb_(nb),
+    check_(nb_threads),
+    op_(op)
+  { }
+  void start(int id) {
+    mer_dna m;
+    map&    my_map = check_[id];
+
+    for(int i = 0; i < nb_; ++i) {
+      m.randomize();
+      switch(op_) {
+      case ADD:
+        hash_.add(m, std::numeric_limits<uint64_t>::max());
+        break;
+      case SET:
+        hash_.set(m);
+        break;
+      }
+
+      my_map[m] = std::numeric_limits<uint64_t>::max();
+    }
+
+    hash_.done();
+  }
+
+  uint64_t val(const mer_dna& m) {
+    uint64_t res = 0;
+    for(maps::const_iterator it = check_.begin(); it < check_.end(); ++it) {
+      map::const_iterator vit = (*it).find(m);
+      if(vit != it->end())
+        res += vit->second;
+    }
+    return res;
+  }
+};
+
+TEST(HashCounterCooperative, SizeDouble) {
+  static const int    mer_len    = 35;
+  static const int    nb_threads = 5;
+  static const int    nb         = 200;
+  static const size_t init_size  = 128;
+  mer_dna::k(mer_len);
+
+  {
+    hash_counter hash(init_size, mer_len * 2, 5, nb_threads);
+    EXPECT_TRUE(hash.do_size_doubling());
+    EXPECT_EQ(mer_len * 2, hash.key_len());
+    EXPECT_EQ(5, hash.val_len());
+
+    hash_adder adder(hash, nb, nb_threads, ADD);
+    adder.exec_join(nb_threads);
+
+    lazy_iterator it = hash.ary()->iterator_all<lazy_iterator>();
+    while(it.next())
+      EXPECT_EQ(adder.val(it.key()), it.val());
+    EXPECT_LT((size_t)(nb_threads * nb), hash.size());
+  }
+
+  {
+    hash_counter hash(init_size, mer_len * 2, 0, nb_threads);
+    EXPECT_TRUE(hash.do_size_doubling());
+    EXPECT_EQ(mer_len * 2, hash.key_len());
+    EXPECT_EQ(0, hash.val_len());
+
+    hash_adder adder(hash, nb, nb_threads, SET);
+    adder.exec_join(nb_threads);
+
+    lazy_iterator it = hash.ary()->iterator_all<lazy_iterator>();
+    while(it.next()) {
+      SCOPED_TRACE(::testing::Message() << "mer:" << it.key());
+      EXPECT_EQ(0, it.val());
+    }
+    EXPECT_LT((size_t)(nb_threads * nb), hash.size());
+  }
+}
+} // namespace {
diff --git a/unit_tests/test_int128.cc b/unit_tests/test_int128.cc
new file mode 100644
index 0000000..f0b5c1b
--- /dev/null
+++ b/unit_tests/test_int128.cc
@@ -0,0 +1,34 @@
+#include <gtest/gtest.h>
+#include <config.h>
+
+#ifdef HAVE_INT128
+#include <limits>
+#include <jellyfish/int128.hpp>
+
+namespace {
+TEST(Int128, Specialized) {
+  // This is supposed to be true, whether it is specialized by gcc or
+  // in int128.hpp above.
+  EXPECT_TRUE(std::numeric_limits<__int128>::is_specialized);
+  EXPECT_TRUE(std::numeric_limits<unsigned __int128>::is_specialized);
+}
+
+TEST(Int128, Max) {
+  static const __int128 sone = 1;
+  static const unsigned __int128 uone = 1;
+  __int128 sm = std::numeric_limits<__int128>::max();
+  unsigned __int128 um = std::numeric_limits<unsigned __int128>::max();
+
+  for(int i = 0; i < 127; ++i, sm >>= 1, um >>= 1) {
+    EXPECT_EQ(1, (int)(sm & sone));
+    EXPECT_EQ(1, (int)(um & uone));
+    EXPECT_EQ(1, (int)((std::numeric_limits<__int128>::max() >> i) & sone));
+    EXPECT_EQ(1, (int)((std::numeric_limits<unsigned __int128>::max() >> i) & uone));
+  }
+
+  EXPECT_EQ(0, (int)sm);
+  EXPECT_EQ(1, (int)um);
+}
+} // namespace
+
+#endif // HAVE_INT128
diff --git a/unit_tests/test_large_block.cc b/unit_tests/test_large_block.cc
new file mode 100644
index 0000000..7787445
--- /dev/null
+++ b/unit_tests/test_large_block.cc
@@ -0,0 +1,33 @@
+#include <gtest/gtest.h>
+#include <allocators_malloc.hpp>
+#include <allocators_mmap.hpp>
+#include <allocators_shm.hpp>
+
+using testing::Types;
+
+#define SMALL_SIZE      ((size_t)4096)
+template <class large_block>
+class LargeBlockTest : public ::testing::Test
+{
+public:
+  large_block   block;
+
+  LargeBlockTest() : block(SMALL_SIZE) {}
+  void *double_size() {
+    return block.realloc(block.get_size() * 2);
+  }
+};
+
+typedef Types<allocators::malloc, allocators::mmap, allocators::shm> Implementations;
+
+TYPED_TEST_CASE(LargeBlockTest, Implementations);
+
+TYPED_TEST(LargeBlockTest, SuccessfulAllocation) {
+  EXPECT_NE((void *)0, this->block.get_ptr());
+  EXPECT_EQ(SMALL_SIZE, this->block.get_size());
+  void *new_ptr = this->double_size();
+  EXPECT_NE((void *)0, new_ptr);
+  EXPECT_NE((void *)0, this->block.get_ptr());
+  EXPECT_EQ(new_ptr, this->block.get_ptr());
+  EXPECT_EQ(SMALL_SIZE * 2, this->block.get_size());
+}
diff --git a/unit_tests/test_large_hash_array.cc b/unit_tests/test_large_hash_array.cc
new file mode 100644
index 0000000..e95e1fe
--- /dev/null
+++ b/unit_tests/test_large_hash_array.cc
@@ -0,0 +1,346 @@
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <map>
+#include <vector>
+#include <limits>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+
+void PrintTo(jellyfish::mer_dna& m, ::std::ostream* os) {
+  *os << m.to_str();
+}
+
+namespace {
+typedef jellyfish::large_hash::array<jellyfish::mer_dna> large_array;
+typedef std::map<jellyfish::mer_dna, uint64_t> mer_map;
+typedef std::set<jellyfish::mer_dna> mer_set;
+
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using std::numeric_limits;
+
+typedef large_array::iterator stl_iterator;
+typedef large_array::eager_iterator eager_iterator;
+typedef large_array::lazy_iterator lazy_iterator;
+typedef large_array::region_iterator region_iterator;
+
+// Tuple is {key_len, val_len, reprobe_len}.
+class HashArray : public ::testing::TestWithParam< ::std::tr1::tuple<int,int, int> >
+{
+public:
+  static const size_t ary_lsize = 10;
+  static const size_t ary_size = (size_t)1 << ary_lsize;
+  static const size_t ary_size_mask = ary_size - 1;
+  const int           key_len, val_len, reprobe_len, reprobe_limit;
+  large_array         ary;
+
+  HashArray() :
+    key_len(::std::tr1::get<0>(GetParam())),
+    val_len(::std::tr1::get<1>(GetParam())),
+    reprobe_len(::std::tr1::get<2>(GetParam())),
+    reprobe_limit((1 << reprobe_len) - 2),
+    ary(ary_size, key_len, val_len, reprobe_limit)
+  { }
+
+  void SetUp() {
+    jellyfish::mer_dna::k(key_len / 2);
+  }
+
+  ~HashArray() { }
+};
+
+TEST_P(HashArray, OneElement) {
+  mer_dna m, m2, get_mer;
+
+  SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+  EXPECT_EQ((unsigned int)ary_lsize, ary.matrix().r());
+  EXPECT_EQ((unsigned int)key_len, ary.matrix().c());
+
+  size_t start_pos = random() % (ary_size - bsizeof(uint64_t));
+  size_t mask = (size_t)key_len >= bsizeof(size_t) ? (size_t)-1 : ((size_t)1 << key_len) - 1;
+  for(uint64_t i = start_pos; i < start_pos + bsizeof(uint64_t); ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    // Create mer m so that it will hash to position i
+    m.randomize();
+    m2 = m;
+    m2.set_bits(0, ary.matrix().r(), (uint64_t)i);
+    m.set_bits(0, ary.matrix().r(), ary.inverse_matrix().times(m2));
+
+    // Add this one element to the hash
+    ary.clear();
+    bool         is_new      = false;
+    size_t       id          = (size_t)-1;
+    unsigned int carry_shift = 0;
+    EXPECT_TRUE(ary.add(m, i, &carry_shift, &is_new, &id));
+    EXPECT_TRUE(is_new);
+    // Only expected to agree on the length of the key. Applies only
+    // if key_len < lsize. The bits above key_len are pseudo-random
+    EXPECT_EQ((size_t)i & mask, id & mask);
+
+    // Every position but i in the hash should be empty
+    uint64_t val;
+    for(ssize_t j = -bsizeof(uint64_t); j <= (ssize_t)bsizeof(uint64_t); ++j) {
+      SCOPED_TRACE(::testing::Message() << "j:" << j);
+      val = (uint64_t)-1;
+      size_t jd = (start_pos + j) & ary_size_mask;
+      ASSERT_EQ(jd == id, ary.get_key_val_at_id(jd, get_mer, val) == large_array::FILLED);
+      if(jd == id) {
+        ASSERT_EQ(m2, get_mer);
+        ASSERT_EQ((uint64_t)jd, val);
+      }
+    }
+  }
+}
+
+TEST_P(HashArray, Collisions) {
+  static const int nb_collisions = 4;
+  std::vector<mer_dna> mers(nb_collisions);
+  std::vector<mer_dna> mers2(nb_collisions);
+  std::map<mer_dna, uint64_t> map;
+  ASSERT_EQ((unsigned int)key_len / 2, mer_dna::k());
+
+  SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+  mers[0].polyA(); mers2[0].polyA();
+  mers[1].polyC(); mers2[1].polyC();
+  mers[2].polyG(); mers2[2].polyG();
+  mers[3].polyT(); mers2[3].polyT();
+
+  size_t start_pos = random() % (ary_size - bsizeof(uint64_t));
+  for(uint64_t i = start_pos; i < start_pos + bsizeof(uint64_t); ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    ary.clear();
+    map.clear();
+
+    // Add mers that it will all hash to position i
+    for(int j = 0; j < nb_collisions; ++j) {
+      mers2[j].set_bits(0, ary.matrix().r(), (uint64_t)i);
+      mers[j].set_bits(0, ary.matrix().r(), ary.inverse_matrix().times(mers2[j]));
+      ary.add(mers[j], j);
+      map[mers[j]] += j;
+    }
+
+    lazy_iterator it    = ary.iterator_all<lazy_iterator>();
+    size_t        count = 0;
+    while(it.next()) {
+      SCOPED_TRACE(::testing::Message() << "it.key():" << it.key());
+      ASSERT_FALSE(map.end() == map.find(it.key()));
+      EXPECT_EQ(map[it.key()], it.val());
+      ++count;
+    }
+    EXPECT_EQ(map.size(), count);
+  }
+}
+
+struct arrays_type {
+  large_array array;
+  mer_map     map;
+  arrays_type(size_t size, uint16_t key_len, uint16_t val_len, uint16_t reprobe_limit) :
+    array(size, key_len, val_len, reprobe_limit), map()
+  { }
+};
+
+typedef std::unique_ptr<arrays_type> arrays_ptr;
+arrays_ptr fill_array(size_t nb_elts, size_t size, int key_len, int val_len, int reprobe_limit) {
+  arrays_ptr arrays(new arrays_type(size, key_len, val_len, reprobe_limit));
+  large_array& ary = arrays->array;
+  mer_map&     map = arrays->map;
+
+  mer_dna mer;
+  for(int i = 0; i < nb_elts; ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    mer.randomize();
+    map[mer] += i;
+    // If get false, hash array filled up: double size
+    bool res = ary.add(mer, i);
+    if(!res) {
+      // std::cerr << "Double size (" << size << " -> " << (2 * size) << ") nb_elts:" << nb_elts
+      //           << " key_len:" << key_len << " val_len:" << val_len
+      //           << " mer:" << mer << std::endl;
+      // return std::make_pair(std::move(ary), std::move(map));
+      return fill_array(nb_elts, 2 * size, key_len, val_len, reprobe_limit);
+    }
+  }
+  return arrays;
+}
+
+TEST_P(HashArray, Iterator) {
+  static const int nb_elts = 1 << (ary_lsize - 1 - (val_len == 1));
+  SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+  arrays_ptr   res = fill_array(nb_elts, ary_size, key_len, val_len, reprobe_limit);
+  large_array& ary = res->array;
+  mer_map &    map = res->map;
+
+  eager_iterator it     = ary.iterator_all<eager_iterator>();
+  lazy_iterator  lit    = ary.iterator_all<lazy_iterator>();
+  stl_iterator   stl_it = ary.iterator_all<stl_iterator>();
+  int count = 0;
+  for( ; it.next(); ++stl_it) {
+    ASSERT_TRUE(lit.next());
+    ASSERT_NE(ary.end(), stl_it);
+    mer_map::const_iterator mit = map.find(it.key());
+    SCOPED_TRACE(::testing::Message() << "key:" << it.key());
+    ASSERT_NE(map.end(), mit);
+    EXPECT_EQ(mit->first, it.key());
+    EXPECT_EQ(mit->second, it.val());
+    EXPECT_EQ(mit->first, lit.key());
+    EXPECT_EQ(mit->second, lit.val());
+    EXPECT_EQ(mit->first, stl_it->first);
+    EXPECT_EQ(mit->second, stl_it->second);
+    EXPECT_EQ(it.id(), lit.id());
+    EXPECT_EQ(it.id(), stl_it.id());
+    ++count;
+  }
+  EXPECT_FALSE(lit.next());
+  EXPECT_EQ(ary.end(), stl_it);
+  EXPECT_EQ(map.size(), (size_t)count);
+
+  count               = 0;
+  const int nb_slices = 1;
+  for(int i = 0; i < nb_slices; ++i) {
+    SCOPED_TRACE(::testing::Message() << "slice:" << i << " nb_slices:" << nb_slices);
+    region_iterator rit = ary.iterator_slice<region_iterator>(i, nb_slices);
+    while(rit.next()) {
+      ASSERT_GE(rit.oid(), rit.start());
+      ASSERT_LT(rit.oid(), rit.end());
+      mer_map::const_iterator mit = map.find(rit.key());
+      ASSERT_NE(map.end(), mit);
+      EXPECT_EQ(mit->first, rit.key());
+      EXPECT_EQ(mit->second, rit.val());
+      ++count;
+    }
+  }
+  EXPECT_EQ(map.size(), (size_t)count);
+
+  int i = 0;
+  for(mer_map::const_iterator it = map.begin(); it != map.end(); ++it, ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i << " key:" << it->first);
+    uint64_t val;
+    size_t   id;
+    EXPECT_TRUE(ary.get_key_id(it->first, &id));
+    ASSERT_TRUE(ary.get_val_for_key(it->first, &val));
+    EXPECT_EQ(it->second, val);
+  }
+}
+
+TEST_P(HashArray, LargeValue) {
+  mer_dna mer;
+  mer.randomize();
+  ary.add(mer, numeric_limits<uint64_t>::max());
+
+  uint64_t val = 0;
+  ASSERT_TRUE(ary.get_val_for_key(mer, &val));
+  ASSERT_EQ(numeric_limits<uint64_t>::max(), val);
+}
+
+INSTANTIATE_TEST_CASE_P(HashArrayTest, HashArray, ::testing::Combine(::testing::Range(8, 4 * 64, 2), // Key lengths
+                                                                     ::testing::Range(1, 10),    // Val lengths
+                                                                     ::testing::Range(6, 8)      // Reprobe lengths
+                                                                     ));
+
+TEST(Hash, Set) {
+  static const int lsize = 16;
+  static const int size = 1 << lsize;
+  static const int nb_elts = 2 * size / 3;
+
+  large_array ary(size, 100, 0, 126);
+  mer_set     set;
+  mer_dna::k(50);
+  mer_dna     mer;
+
+  for(int i = 0; i < nb_elts; ++i) {
+    mer.randomize();
+    bool   is_new;
+    size_t id;
+    ASSERT_TRUE(ary.set(mer, &is_new, &id));
+    ASSERT_EQ(set.insert(mer).second, is_new);
+  }
+
+  mer_dna tmp_mer;
+  for(mer_set::const_iterator it = set.begin(); it != set.end(); ++it) {
+    SCOPED_TRACE(::testing::Message() << "key:" << *it);
+    size_t   id;
+    EXPECT_TRUE(ary.get_key_id(*it, &id, tmp_mer));
+  }
+
+  for(int i = 0; i < nb_elts; ++i) {
+    mer.randomize();
+    size_t id;
+    EXPECT_EQ(set.find(mer) != set.end(), ary.get_key_id(mer, &id));
+  }
+}
+
+TEST(Hash, Update) {
+  static const int lsize = 16;
+  static const int size = 1 << lsize;
+  static const int nb_elts = 2 * size / 3;
+
+  large_array ary(size, 100, 4, 126);
+  mer_map     in_ary;
+  mer_dna::k(50);
+  mer_dna     mer;
+
+  for(int i = 0; i < nb_elts; ++i) {
+    mer.randomize();
+    bool is_new;
+    size_t id;
+    ASSERT_TRUE(ary.set(mer, &is_new, &id));
+    auto res = in_ary.insert(std::make_pair(mer, (uint64_t)0));
+    ASSERT_EQ(res.second, is_new);
+  }
+
+  for(auto it = in_ary.begin(); it != in_ary.end(); ++it) {
+    uint64_t val = random_bits(4);
+    EXPECT_TRUE(ary.update_add(it->first, val));
+    it->second = val;
+  }
+
+  for(int i = 0; i < nb_elts; ++i) {
+    mer.randomize();
+    uint64_t val = random_bits(4);
+    auto it = in_ary.find(mer);
+    if(it == in_ary.end()) {
+      EXPECT_FALSE(ary.update_add(mer, val));
+    } else {
+      it->second += val;
+      EXPECT_TRUE(ary.update_add(mer, val));
+    }
+  }
+
+  lazy_iterator it = ary.iterator_all<lazy_iterator>();
+  size_t count = 0;
+  while(it.next()) {
+    ASSERT_NE(in_ary.end(), in_ary.find(it.key()));
+    EXPECT_EQ(in_ary[it.key()], it.val());
+    ++count;
+  }
+  EXPECT_EQ(in_ary.size(), count);
+}
+
+TEST(Hash, Info) {
+  for(int iteration = 0; iteration < 100; ++iteration) {
+    size_t                  mem     = random_bits(48);
+    uint16_t                key_len = random_bits(7) + 1;
+    uint16_t                val_len = random_bits(4) + 1;
+    large_array::usage_info info(key_len, val_len, 126);
+
+    SCOPED_TRACE(::testing::Message() << "iteration:" << iteration << " mem:" << mem
+                 << " key_len:" << key_len << " val_len:" << val_len);
+    uint16_t size_bits = info.size_bits(mem);
+    uint16_t size2_bits = info.size_bits_linear(mem);
+    ASSERT_EQ(size2_bits, size_bits);
+    ASSERT_LE(info.mem((size_t)1 << size_bits), mem);
+    ASSERT_GT(info.mem((size_t)1 << (size_bits + 1)), mem);
+  }
+}
+}
diff --git a/unit_tests/test_main.cc b/unit_tests/test_main.cc
new file mode 100644
index 0000000..6363cff
--- /dev/null
+++ b/unit_tests/test_main.cc
@@ -0,0 +1,67 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main_cmdline.hpp>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/backtrace.hpp>
+
+template<long int n>
+struct floorLog2 {
+  static const int val = floorLog2<n / 2>::val + 1;
+};
+template<>
+struct floorLog2<1> {
+  static const int val = 0;
+};
+
+// Return length random bits. 1 <= length <= 64
+uint64_t random_bits(int length) {
+  uint64_t res = 0;
+  for(int i = 0; i < length; i += floorLog2<RAND_MAX>::val)
+    res ^= (uint64_t)random() << i;
+  return res & ((uint64_t)-1 >> (64 - length));
+}
+
+
+int main(int argc, char *argv[]) {
+  ::testing::InitGoogleTest(&argc, argv);
+  cmdline_parse args(argc, argv);
+
+  unsigned int seed;
+  if(args.seed_given) {
+    seed = args.seed_arg;
+  } else {
+    std::ifstream urandom("/dev/urandom");
+    urandom.read((char*)&seed, sizeof(seed));
+    if(!urandom.good()) {
+      std::cerr << "Failed to read random seed" << std::endl;
+      return 1;
+    }
+  }
+  if(args.backtrace_flag) {
+    show_backtrace();
+    setenv("GTEST_CATCH_EXCEPTIONS", "0", 1);
+  }
+
+  std::cout << "Using random seed " << seed << std::endl;
+  srandom(seed);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/unit_tests/test_main.hpp b/unit_tests/test_main.hpp
new file mode 100644
index 0000000..58ecb4d
--- /dev/null
+++ b/unit_tests/test_main.hpp
@@ -0,0 +1,26 @@
+#ifndef __TEST_MAIN_HPP__
+#define __TEST_MAIN_HPP__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <string>
+
+uint64_t random_bits(int length);
+inline uint64_t random_bits() { return random_bits(64); }
+
+struct file_unlink {
+  std::string path;
+  bool do_unlink;
+  explicit file_unlink(const char* s, bool d = true) : path(s), do_unlink(d) { }
+  explicit file_unlink(const std::string& s, bool d = true) : path(s), do_unlink(d) { }
+
+  ~file_unlink() {
+    if(do_unlink)
+      unlink(path.c_str());
+  }
+};
+
+#endif /* __TEST_MAIN_HPP__ */
+
diff --git a/unit_tests/test_main_cmdline.yaggo b/unit_tests/test_main_cmdline.yaggo
new file mode 100644
index 0000000..81a4038
--- /dev/null
+++ b/unit_tests/test_main_cmdline.yaggo
@@ -0,0 +1,10 @@
+purpose "Unit tests"
+
+name "cmdline_parse"
+
+option("s", "seed") {
+  description "Random seed"
+  uint32 }
+option("b", "backtrace") {
+  description "Do not catch errors and show backtrace"
+  flag }
diff --git a/unit_tests/test_mapped_file.cc b/unit_tests/test_mapped_file.cc
new file mode 100644
index 0000000..8215a1e
--- /dev/null
+++ b/unit_tests/test_mapped_file.cc
@@ -0,0 +1,54 @@
+#include <iostream>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mapped_file.hpp>
+
+namespace {
+using jellyfish::mapped_file;
+TEST(MappedFile, CreateMove) {
+  const char* mpt = "mapped_file_test";
+  file_unlink file(mpt);
+  std::string text = "Hello\nThis is a test\n";
+
+  {
+    std::ofstream fd(mpt);
+    fd << text;
+  }
+
+  mapped_file mf(mpt);
+  EXPECT_STREQ(mpt, mf.path().c_str());
+  ASSERT_NE((char*)0, mf.base());
+  ASSERT_EQ(text.size(), mf.length());
+  EXPECT_EQ(text, std::string(mf.base(), mf.length()));
+
+  mapped_file mf2 = std::move(mf);
+  EXPECT_STREQ(mpt, mf2.path().c_str());
+  ASSERT_NE((char*)0, mf2.base());
+  ASSERT_EQ(text.size(), mf2.length());
+  EXPECT_EQ(text, std::string(mf2.base(), mf2.length()));
+  ASSERT_EQ((char*)0, mf.base());
+
+  mapped_file mf3(mpt);
+  mf2 = std::move(mf3);
+  EXPECT_STREQ(mpt, mf2.path().c_str());
+  ASSERT_NE((char*)0, mf2.base());
+  ASSERT_EQ(text.size(), mf2.length());
+  EXPECT_EQ(text, std::string(mf2.base(), mf2.length()));
+  ASSERT_EQ((char*)0, mf.base());
+}
+
+// Gtest and newer compilers seem to have a problem with EXPECT_THROW
+#if !defined(__clang__) && (!defined(GTEST_GCC_VER_) || GTEST_GCC_VER_ < 40800)
+TEST(MappedFile, Fail) {
+  const char* bad_file = "/doesntexistsforsure/thatwouldbecrazy!";
+  EXPECT_THROW(mapped_file mf(bad_file), jellyfish::mapped_file::ErrorMMap);
+
+  mapped_file mf;
+  EXPECT_THROW(mf.map(bad_file), jellyfish::mapped_file::ErrorMMap);
+  EXPECT_EQ((char*)0, mf.base());
+  EXPECT_THROW(mf.map(-1), jellyfish::mapped_file::ErrorMMap);
+  EXPECT_EQ((char*)0, mf.base());
+}
+#endif
+}
diff --git a/unit_tests/test_mer_dna.cc b/unit_tests/test_mer_dna.cc
new file mode 100644
index 0000000..a6f27b8
--- /dev/null
+++ b/unit_tests/test_mer_dna.cc
@@ -0,0 +1,529 @@
+/* SuperRead pipeline
+ * Copyright (C) 2012  Genome group at University of Maryland.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <stdio.h>
+#include <map>
+#include <iostream>
+#include <sstream>
+#include <gtest/gtest.h>
+#include <jellyfish/mer_dna.hpp>
+#include <unit_tests/test_main.hpp>
+
+namespace {
+using namespace jellyfish;
+
+const std::string short_mer("ACGTTGGCCAA");
+const std::string mid_mer("AAGACTTAGAATCAGCTAAGGTAACTTACGTAGAATATAGA");
+const std::string long_mer("AAGACTTAGAATCAGCTAAGGTAACTTACGTAGAATATAG"
+                           "AAGACGGCGCCTATCCCAACCTCCATTTGCTGACGCCCTC"
+                           "GTAACCGTGCTGCGAGGTTACTCTATACTGA");
+const std::string huge_mer("CAGGACACAATACGTCGATCCAATCCCCGACGTGAGAGTT"
+                           "TAACGCTAATCTTGATCCATTACAAGTATAGATATTTCGG"
+                           "GCGCCACGGGGAAACTTGCCCTATGTTCGAGTCCGCCACC"
+                           "GCGGCACCAGCCTTTGTGTGACGGCCACAAAGGGTAAAAG"
+                           "ATGTTGTCTCGCGCCGGCGTGCGGTCTTTACCAGATCCTT"
+                           "GAGCGGCCTAGAAAGTTCGTACCAGTTCGACTGAAACAAG"
+                           "ACAACGGATCGCCCACGGTCATCACACGCCCACGCACGGG"
+                           "GTCGGGTTGGTATATTCAACCTCGAGTTAAACGT");
+const std::string* test_mers[4] = {
+  &short_mer, &mid_mer, &long_mer, &huge_mer
+};
+
+TEST(MerDNASimple, InitSize64) {
+  struct sinfo {
+    unsigned int k;
+    unsigned int nb_words;
+    unsigned int nb_msb;
+    uint64_t     msw;
+    unsigned int lshift;
+  };
+  sinfo ary[5] = {
+    { 5, 1, 10, (uint64_t)0x3ff, 8 }, { 32, 1, 64, (uint64_t)-1, 62 },
+    { 33, 2, 2, (uint64_t)0x3, 0 }, { 64, 2, 64, (uint64_t)-1, 62 },
+    { 65, 3, 2, (uint64_t)0x3, 0 }
+  };
+  typedef mer_dna_ns::mer_base_dynamic<uint64_t> mer64;
+  for(size_t i = 0; i < sizeof(ary) / sizeof(sinfo); ++i) {
+    mer64 m(ary[i].k);
+    EXPECT_EQ(ary[i].k, m.k());
+    EXPECT_EQ(ary[i].nb_words, m.nb_words());
+    EXPECT_EQ(ary[i].nb_msb, m.nb_msb());
+    EXPECT_EQ(ary[i].lshift, m.lshift());
+  }
+}
+
+#ifdef HAVE_INT128
+TEST(MerDNASimple, InitSize128) {
+  struct sinfo {
+    unsigned int      k;
+    unsigned int      nb_words;
+    unsigned int      nb_msb;
+    unsigned __int128 msw;
+    unsigned int      lshift;
+  };
+  sinfo ary[5] = {
+    { 5, 1, 10, (unsigned __int128)0x3ff, 8 },
+    { 32, 1, 64, (unsigned __int128)0xffffffffffffffffUL, 62 },
+    { 33, 1, 66, (unsigned __int128)0xffffffffffffffffUL | ((unsigned __int128)0x3 << 64), 64 },
+    { 64, 1, 128, (unsigned __int128)-1, 126 },
+    { 65, 2, 2, (unsigned __int128)0x3, 0 }
+  };
+  typedef mer_dna_ns::mer_base_dynamic<unsigned __int128> mer128;
+  for(size_t i = 0; i < sizeof(ary) / sizeof(sinfo); ++i) {
+    mer128 m(ary[i].k);
+    EXPECT_EQ(ary[i].k, m.k());
+    EXPECT_EQ(ary[i].nb_words, m.nb_words());
+    EXPECT_EQ(ary[i].nb_msb, m.nb_msb());
+    EXPECT_EQ(ary[i].lshift, m.lshift());
+  }
+}
+#endif
+
+TEST(MerDNASimple, Codes) {
+  EXPECT_EQ(mer_dna::CODE_A, mer_dna::code('A'));
+  EXPECT_EQ(mer_dna::CODE_A, mer_dna::code('a'));
+  EXPECT_EQ(mer_dna::CODE_C, mer_dna::code('C'));
+  EXPECT_EQ(mer_dna::CODE_C, mer_dna::code('c'));
+  EXPECT_EQ(mer_dna::CODE_G, mer_dna::code('G'));
+  EXPECT_EQ(mer_dna::CODE_G, mer_dna::code('g'));
+  EXPECT_EQ(mer_dna::CODE_T, mer_dna::code('T'));
+  EXPECT_EQ(mer_dna::CODE_T, mer_dna::code('t'));
+  EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_A));
+  EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_C));
+  EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_G));
+  EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_T));
+
+  for(int c = 0; c < 256; ++c) {
+    switch((char)c) {
+    case 'A': case 'a':
+    case 'C': case 'c':
+    case 'G': case 'g':
+    case 'T': case 't':
+      EXPECT_FALSE(mer_dna::not_dna(mer_dna::code(c)));
+      break;
+    default:
+      EXPECT_TRUE(mer_dna::not_dna(mer_dna::code(c)));
+      break;
+    }
+  }
+}
+
+TEST(MerDNASimple, SetBits) {
+  mer_dna::k(100);
+  static const int pattern_len = 10;
+  uint64_t pattern = ::random_bits(pattern_len); // Create a random pattern
+  mer_dna even_pattern, odd_pattern;             // And the corresponding mers
+  for(int i = pattern_len - 2; i >= 0; i -= 2) {
+    even_pattern.shift_left((int)((pattern >> i) & 0x3));
+    odd_pattern.shift_left((int)((pattern >> (i + 1)) & 0x3));
+  }
+  odd_pattern.shift_left((int)((pattern << 1) & 0x3));
+
+  mer_dna mer;
+  for(int i = 0; i <= (int)(mer_dna::k() - pattern_len / 2); ++i, even_pattern.shift_left('A'), odd_pattern.shift_left('A')) {
+    // Even
+    mer.polyA();
+    EXPECT_EQ(std::string(mer_dna::k(), 'A'), mer.to_str());
+    mer.set_bits(2 * i, pattern_len, pattern);
+    EXPECT_EQ(pattern, mer.get_bits(2 * i, pattern_len));
+    EXPECT_EQ(even_pattern, mer);
+    EXPECT_EQ(even_pattern.to_str(), mer.to_str());
+    // Odd
+    mer.polyA();
+    mer.set_bits(2 * i + 1, pattern_len, pattern);
+    if(i < (int)(mer_dna::k() - pattern_len / 2))
+      EXPECT_EQ(pattern, mer.get_bits(2 * i + 1, pattern_len));
+    else // On the largest value of i, one bit may have fallen off the end of the mer
+      EXPECT_EQ(pattern & (((uint64_t)1 << (pattern_len - 1)) - 1), mer.get_bits(2 * i + 1, pattern_len));
+    EXPECT_EQ(odd_pattern, mer);
+    EXPECT_EQ(odd_pattern.to_str(), mer.to_str());
+  }
+}
+
+TEST(MerDNASimple, Shifts) {
+  for(int i = 1; i < 100; ++i) {
+    mer_dna::k(i);
+    mer_dna m;
+
+    m.randomize();
+    const int c = ::random_bits(2);
+    mer_dna rm(m);
+    rm.shift_right(c);
+    mer_dna lm(m);
+    lm.shift_left(c);
+
+    EXPECT_EQ(c, rm.base(mer_dna::k() - 1).code());
+    EXPECT_EQ(c, lm.base(0).code());
+    for(unsigned int j = 0; j < mer_dna::k() - 1; ++j) {
+      EXPECT_EQ(m.base(j + 1).code(), rm.base(j).code());
+      EXPECT_EQ(m.base(j).code(), lm.base(j + 1).code());
+    }
+  }
+} // MerDNASimple.Shifts
+
+
+bool simple_homolymer_test(const mer_dna& m) {
+  mer_dna cm(m);
+  cm.shift_right(m.base(0).code());
+  return cm == m;
+}
+
+TEST(MerDNASimple, Homopolymer) {
+  for(int i = 1; i < 256; ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    mer_dna::k(i);
+    mer_dna m;
+
+    for(int j = 0; j < 10; ++j) {
+      m.randomize();
+      EXPECT_EQ(simple_homolymer_test(m), m.is_homopolymer());
+    }
+
+    m.polyA();
+    EXPECT_TRUE(simple_homolymer_test(m));
+    EXPECT_TRUE(m.is_homopolymer());
+    if(i > 1) { // i == 1 all mers are homopolymers by definition
+      m.base(::random_bits(5) % i) = 'T';
+      if(simple_homolymer_test(m) || m.is_homopolymer())
+        std::cerr << m << "\n";
+      EXPECT_FALSE(simple_homolymer_test(m));
+      EXPECT_FALSE(m.is_homopolymer());
+    }
+
+    m.polyC();
+    EXPECT_TRUE(simple_homolymer_test(m));
+    EXPECT_TRUE(m.is_homopolymer());
+    m.polyG();
+    EXPECT_TRUE(simple_homolymer_test(m));
+    EXPECT_TRUE(m.is_homopolymer());
+    m.polyT();
+    EXPECT_TRUE(simple_homolymer_test(m));
+    EXPECT_TRUE(m.is_homopolymer());
+  }
+} // MerDNASimple.Homopolymer
+
+TEST(MerDNASimple, Comparators) {
+  mer_dna::k(151);
+  mer_dna ma, mc, mg, mt;
+  ma.polyA();
+  mc.polyC();
+  mg.polyG();
+  mt.polyT();
+
+  mer_dna cma(ma), cmc(mc), cmg(mg), cmt(mt);
+
+  ASSERT_TRUE(ma < mc); ASSERT_FALSE(mc < ma);
+  ASSERT_TRUE(ma < mg); ASSERT_FALSE(mg < ma);
+  ASSERT_TRUE(ma < mt); ASSERT_FALSE(mt < ma);
+  ASSERT_TRUE(mc < mg); ASSERT_FALSE(mg < mc);
+  ASSERT_TRUE(mc < mt); ASSERT_FALSE(mt < mc);
+  ASSERT_TRUE(mg < mt); ASSERT_FALSE(mt < mg);
+
+  ASSERT_FALSE(ma < ma);
+  ASSERT_FALSE(mc < mc);
+  ASSERT_FALSE(mg < mg);
+  ASSERT_FALSE(mt < mt);
+
+  std::map<mer_dna, int> map;
+  EXPECT_EQ(1, ++map[ma]);
+  EXPECT_EQ(1, ++map[mc]);
+  EXPECT_EQ(1, ++map[mg]);
+  EXPECT_EQ(1, ++map[mt]);
+  EXPECT_EQ(2, ++map[cma]);
+  EXPECT_EQ(2, ++map[cmc]);
+  EXPECT_EQ(2, ++map[cmg]);
+  EXPECT_EQ(2, ++map[cmt]);
+
+  mer_dna m1, m2;
+  for(int i = 0; i < 1000; ++i) {
+    m1.randomize();
+    m2.randomize();
+    SCOPED_TRACE(::testing::Message() << "m1:" << m1 << " m2:" << m2);
+    ASSERT_FALSE(m1 == m2); // Very small probability to fail (k == 151)
+
+    EXPECT_TRUE(m1 == m1);
+    EXPECT_FALSE(m1 < m1);
+    EXPECT_FALSE(m1 > m1);
+    EXPECT_TRUE(m1 <= m1);
+    EXPECT_TRUE(m1 >= m1);
+
+    EXPECT_TRUE(m2 == m2);
+    EXPECT_FALSE(m2 < m2);
+    EXPECT_FALSE(m2 > m2);
+    EXPECT_TRUE(m2 <= m2);
+    EXPECT_TRUE(m2 >= m2);
+
+    EXPECT_EQ(m1.to_str().compare(m2.to_str()) < 0, m1 < m2); // Comparison is lexicographic
+
+    EXPECT_TRUE(m1 < m2 || m2 < m1);
+    EXPECT_TRUE(m1 <= m2 || m2 <= m1);
+    EXPECT_FALSE(m1 <= m2 && m2 <= m1);
+    EXPECT_TRUE(m1 > m2 || m2 > m1);
+    EXPECT_TRUE(m1 >= m2 || m2 >= m1);
+    EXPECT_FALSE(m1 >= m2 && m2 >= m1);
+
+    EXPECT_NE(m1 < m2, m1 >= m2);
+    EXPECT_NE(m1 < m2, m1 > m2);
+  }
+}
+
+TEST(MerDNASimple, IO) {
+  std::stringstream buffer;
+
+  for(int i = 0; i < 10000; ++i) {
+    buffer.clear();
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    mer_dna::k(::random_bits(9) + 1);
+    mer_dna m1, m2;
+    m1.randomize();
+    buffer << m1;
+    buffer >> m2;
+    EXPECT_EQ(m1, m2);
+  }
+}
+
+TEST(MerDNASimple, MultipleSize) {
+  typedef jellyfish::mer_dna_ns::mer_base_static<uint64_t, 1> mer_dna1;
+  typedef jellyfish::mer_dna_ns::mer_base_static<uint64_t, 2> mer_dna2;
+
+  mer_dna::k(10);
+  mer_dna1::k(50);
+  mer_dna2::k(100);
+  EXPECT_EQ(10, mer_dna::k());
+  EXPECT_EQ(0, mer_dna::class_index);
+  EXPECT_EQ(50, mer_dna1::k());
+  EXPECT_EQ(1, mer_dna1::class_index);
+  EXPECT_EQ(100, mer_dna2::k());
+  EXPECT_EQ(2, mer_dna2::class_index);
+}
+
+// Value Type Container class
+template <typename T, int N>
+class VTC {
+public:
+  typedef T Type;
+  static const int test_id = N;
+};
+template <typename T, int N>
+const int VTC<T, N>::test_id;
+
+template<typename VT>
+class MerDNA : public ::testing::Test {
+public:
+  typedef typename VT::Type Type;
+  void SetUp() {
+    Type::k(GetParam().size());
+  }
+  const std::string& GetParam() const {
+    return *test_mers[VT::test_id];
+  }
+};
+typedef ::testing::Types<VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 0>,
+                         VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 1>,
+                         VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 2>,
+                         VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 3>,
+#ifdef HAVE_INT128
+                         VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 0>,
+                         VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 1>,
+                         VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 2>,
+                         VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 3>,
+#endif
+                         VTC<mer_dna_ns::mer_base_static<uint32_t>, 3>,
+                         VTC<mer_dna_ns::mer_base_static<uint64_t>, 0>,
+                         VTC<mer_dna_ns::mer_base_static<uint64_t>, 1>,
+                         VTC<mer_dna_ns::mer_base_static<uint64_t>, 2>,
+                         VTC<mer_dna_ns::mer_base_static<uint64_t>, 3>,
+#ifdef HAVE_INT128
+                         VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 0>,
+                         VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 1>,
+                         VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 2>,
+                         VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 3>,
+#endif
+                         VTC<mer_dna_ns::mer_base_static<uint32_t>, 3>
+                         > MerDNATypes;
+TYPED_TEST_CASE(MerDNA, MerDNATypes);
+
+TYPED_TEST(MerDNA, InitFromStr) {
+  typename TypeParam::Type m(this->GetParam());
+  EXPECT_EQ(this->GetParam().size(), m.k());
+  EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, ShiftLeft) {
+  typename TypeParam::Type m(this->GetParam().size());
+  m.polyA();
+  int inserted = 0;
+  for(std::string::const_iterator it = this->GetParam().begin(); it != this->GetParam().end(); ++it, ++inserted) {
+    m.shift_left(*it);
+
+    int check = inserted;
+    for(std::string::const_iterator cit = this->GetParam().begin(); check >= 0; ++cit, --check)
+      EXPECT_EQ(*cit, (char)m.base(check));
+  }
+  EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, ShiftRight) {
+  typename TypeParam::Type m(this->GetParam().size());
+  m.polyA();
+  int inserted = 0;
+  for(std::string::const_reverse_iterator it = this->GetParam().rbegin(); it != this->GetParam().rend(); ++it, ++inserted) {
+    m.shift_right(*it);
+
+    int check = inserted;
+    for(std::string::const_reverse_iterator cit = this->GetParam().rbegin(); check >= 0; ++cit, --check)
+      EXPECT_EQ(*cit, (char)m.base(m.k() - 1 - check));
+  }
+  EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, Equality) {
+  typename TypeParam::Type m1(this->GetParam());
+  typename TypeParam::Type m2(this->GetParam().size());
+
+  char str[this->GetParam().size() + 1];
+  str[this->GetParam().size()] = '\0';
+  memset(str, 'A', this->GetParam().size());
+  m2.polyA();
+  EXPECT_STREQ(str, m2.to_str().c_str());
+  memset(str, 'C', this->GetParam().size());
+  m2.polyC();
+  EXPECT_STREQ(str, m2.to_str().c_str());
+  memset(str, 'G', this->GetParam().size());
+  m2.polyG();
+  EXPECT_STREQ(str, m2.to_str().c_str());
+  memset(str, 'T', this->GetParam().size());
+  m2.polyT();
+  EXPECT_STREQ(str, m2.to_str().c_str());
+
+
+  int i = 1;
+  for(std::string::const_iterator it = this->GetParam().begin(); it < this->GetParam().end(); ++it, ++i) {
+    sprintf(str + this->GetParam().size() - i, "%.*s", i, this->GetParam().c_str());
+    typename TypeParam::Type m(str);
+    EXPECT_STREQ(str, m.to_str().c_str());
+    m2.shift_left(*it);
+    EXPECT_EQ(m, m2);
+  }
+  EXPECT_TRUE(m1 == m2);
+  EXPECT_FALSE(m1 != m2);
+  EXPECT_EQ(m1.to_str(), m2.to_str());
+
+  // typename TypeParam::Type m3(this->GetParam());
+  // m3[0] = 0;
+  // EXPECT_FALSE(m1 == m3);
+
+  // typename TypeParam::Type m4(this->GetParam().size() + 1);
+  // EXPECT_FALSE(m1 == m4);
+  // typename TypeParam::Type m5(this->GetParam().size() - 1);
+  // EXPECT_FALSE(m1 == m5);
+
+}
+
+TYPED_TEST(MerDNA, Copy) {
+  typename TypeParam::Type m1(this->GetParam());
+  typename TypeParam::Type m2(m1);
+  typename TypeParam::Type m3(this->GetParam().size());
+  m3 = m1;
+
+  EXPECT_TRUE(m1 == m2);
+  EXPECT_TRUE(m2 == m3);
+  EXPECT_TRUE(m3 == m1);
+  m1.shift_left('A');
+  EXPECT_TRUE(!(m1 == m2));
+  EXPECT_TRUE(!(m1 == m3));
+}
+
+TYPED_TEST(MerDNA, OperatorShift) {
+  typename TypeParam::Type m(this->GetParam());
+  std::ostringstream os;
+  os << m;
+  EXPECT_EQ(this->GetParam(), os.str());
+}
+
+TYPED_TEST(MerDNA, GetBits) {
+  typename TypeParam::Type m(this->GetParam());
+  for(unsigned int i = 0; i < 20; ++i) {
+    long int start   = random() % (this->GetParam().size() - 1);
+    long int max_len =
+      std::min(this->GetParam().size() - start, 8 * sizeof(typename TypeParam::Type::base_type));
+    long int len     = (random() % (max_len - 1)) + 1;
+
+    // Get bits by right-shifting
+    typename TypeParam::Type cm(m);
+    for(unsigned int j = 1; j < start; j += 2)
+      cm.shift_right(0); // Shift by 2 bits
+    typename TypeParam::Type::base_type y = cm.word(0);
+    if(start & 0x1)
+      y >>= 1;
+    y &= ((typename TypeParam::Type::base_type)1 << len) - 1;
+
+    EXPECT_EQ(y, m.get_bits(start, len));
+  }
+}
+TYPED_TEST(MerDNA, GetBases) {
+  typename TypeParam::Type m(this->GetParam());
+
+  for(std::string::const_reverse_iterator it = this->GetParam().rbegin(); it != this->GetParam().rend(); ++it)
+    EXPECT_EQ(*it, (char)m.base(it - this->GetParam().rbegin()));
+
+  const char bases[4] = { 'A', 'C', 'G', 'T' };
+  for(const char* it = bases; it != bases + 4; ++it) {
+    typename TypeParam::Type n(m);
+    for(size_t j = 0; j < this->GetParam().size(); ++j)
+      n.base(j) = *it;
+    typename TypeParam::Type m_expected(std::string(this->GetParam().size(), *it));
+    EXPECT_EQ(m_expected, n);
+  }
+}
+
+char rc_base(char c) {
+  switch(c) {
+  case 'A': case 'a': return 'T';
+  case 'C': case 'c': return 'G';
+  case 'G': case 'g': return 'C';
+  case 'T': case 't': return 'A';
+  }
+  return 'A'; // Should never be reached
+}
+
+TYPED_TEST(MerDNA, ReverseComplement) {
+  typename TypeParam::Type m(this->GetParam());
+  std::string rc(this->GetParam().size(), 'A');
+  for(size_t i = 0; i < rc.size(); ++i)
+    rc[i] = rc_base(this->GetParam()[this->GetParam().size() - 1 - i]);
+  EXPECT_EQ(this->GetParam().size(), m.k());
+  m.reverse_complement();
+  EXPECT_EQ(rc, m.to_str());
+  typename TypeParam::Type rm(rc);
+  EXPECT_EQ(rm, m);
+  EXPECT_EQ(m, m.get_reverse_complement().get_reverse_complement());
+}
+
+TYPED_TEST(MerDNA, Canonical) {
+  typename TypeParam::Type m(this->GetParam());
+  typename TypeParam::Type canonical = m.get_canonical();
+
+  EXPECT_FALSE(m < canonical);
+  EXPECT_TRUE(canonical <= m);
+  EXPECT_TRUE(canonical == m || canonical == m.get_reverse_complement());
+  m.canonicalize();
+  EXPECT_EQ(canonical, m.get_canonical());
+}
+
+} // namespace {
diff --git a/unit_tests/test_mer_dna_bloom_counter.cc b/unit_tests/test_mer_dna_bloom_counter.cc
new file mode 100644
index 0000000..7e4ba18
--- /dev/null
+++ b/unit_tests/test_mer_dna_bloom_counter.cc
@@ -0,0 +1,150 @@
+/*  This file is part of Jellyfish.
+
+    Jellyfish is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Jellyfish is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Jellyfish.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include <stdlib.h>
+#include <algorithm>
+#include <utility>
+#include <set>
+#include <string>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+
+static const size_t nb_inserts = 10000;
+static const double error_rate = 0.001;
+
+template<typename T>
+class MerDnaBloomTest : public ::testing::Test { };
+
+struct TestBloomCounter {
+  typedef jellyfish::mer_dna_bloom_counter bloom_type;
+  typedef jellyfish::mer_dna_bloom_counter_file file_type;
+  static const unsigned int threshold_twice = 2; // Bloom counter counts up to 2.
+};
+struct TestBloomFilter {
+  typedef jellyfish::mer_dna_bloom_filter bloom_type;
+  typedef jellyfish::mer_dna_bloom_filter_file file_type;
+  static const unsigned int threshold_twice = 1; // Bloom filter counts up to 1.
+};
+
+typedef ::testing::Types<TestBloomCounter, TestBloomFilter> TestBloomCounterTypes;
+TYPED_TEST_CASE(MerDnaBloomTest, TestBloomCounterTypes);
+
+
+TYPED_TEST(MerDnaBloomTest, FalsePositive) {
+  mer_dna::k(50);
+  std::set<mer_dna> mer_set;
+  typename TypeParam::bloom_type bc(error_rate, nb_inserts);
+
+  size_t collisions2 = 0;
+  size_t collisions3 = 0;
+
+  // Insert once nb_inserts. Insert twice the first half
+  {
+    // First insertion
+    size_t nb_collisions   = 0;
+    mer_dna m;
+    for(size_t i = 0; i < nb_inserts; ++i) {
+      m.randomize();
+      mer_set.insert(m);
+      nb_collisions += bc.insert(m) > 0;
+    }
+    EXPECT_GT(error_rate * nb_inserts, nb_collisions);
+  }
+
+  // Second insertion
+  {
+    size_t nb_collisions = 0;
+    size_t nb_errors     = 0;
+    auto it = mer_set.cbegin();
+    for(size_t i =0; i < nb_inserts / 2; ++i, ++it) {
+      unsigned int oc = bc.insert(*it);
+      nb_collisions += oc > 1;
+      nb_errors += oc < 1;
+    }
+    EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+    EXPECT_EQ((size_t)0, nb_errors);
+  }
+
+  // Write to file and reload two different ways
+  file_unlink f("bloom_file");
+  {
+    std::ofstream out(f.path.c_str());
+    bc.write_bits(out);
+    EXPECT_TRUE(out.good());
+    EXPECT_EQ(bc.nb_bytes(), out.tellp());
+  }
+  std::ifstream in(f.path.c_str());
+  typename TypeParam::bloom_type bc_read(bc.m(), bc.k(), in, bc.hash_functions());
+  EXPECT_EQ(bc.nb_bytes(), in.tellg());
+  in.close();
+  typename TypeParam::file_type bc_map(bc.m(), bc.k(), f.path.c_str(), bc.hash_functions());
+  EXPECT_EQ(bc.m(), bc_read.m());
+  EXPECT_EQ(bc.k(), bc_read.k());
+  EXPECT_EQ(bc.m(), bc_map.m());
+  EXPECT_EQ(bc.k(), bc_map.k());
+
+  // Check known mers
+  {
+    size_t nb_collisions = 0;
+    size_t nb_errors     = 0;
+    auto it = mer_set.cbegin();
+    for(size_t i = 0; i < nb_inserts; ++i, ++it) {
+      unsigned int check = bc.check(*it);
+      EXPECT_EQ(check, bc_read.check(*it));
+      EXPECT_EQ(check, bc_map.check(*it));
+      if(i < nb_inserts / 2) {
+        nb_errors += check < TypeParam::threshold_twice;
+      } else {
+        nb_errors += check < 1;
+        nb_collisions += check > 1;
+      }
+    }
+    EXPECT_EQ((size_t)0, nb_errors);
+    EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+  }
+
+  // Check unknown mers
+  {
+    size_t nb_collisions = 0;
+    mer_dna m;
+    for(size_t i = 0; i < nb_inserts; ++i) {
+      m.randomize();
+      unsigned int check = bc.check(m);
+      EXPECT_EQ(check, bc_read.check(m));
+      EXPECT_EQ(check, bc_map.check(m));
+      nb_collisions += check > 0;
+    }
+    EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+  }
+}
+
+TYPED_TEST(MerDnaBloomTest, Move) {
+  mer_dna::k(100);
+  typename TypeParam::bloom_type bc(error_rate, nb_inserts);
+  const unsigned long            k = bc.k();
+  const size_t                   m = bc.m();
+  typename TypeParam::bloom_type bc2(std::move(bc));
+  EXPECT_EQ(k, bc2.k());
+  EXPECT_EQ(m, bc.m());
+}
+
+}
diff --git a/unit_tests/test_mer_heap.cc b/unit_tests/test_mer_heap.cc
new file mode 100644
index 0000000..44cf91a
--- /dev/null
+++ b/unit_tests/test_mer_heap.cc
@@ -0,0 +1,76 @@
+#include <gtest/gtest.h>
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/mer_heap.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+
+typedef jellyfish::large_hash::array<mer_dna>               large_array;
+typedef large_array::region_iterator                        region_iterator;
+typedef jellyfish::mer_heap::heap<mer_dna, region_iterator> mer_heap;
+
+static const size_t   ary_size = 10000;
+static const uint16_t mer_len  = 50;
+static const size_t   nb_mers  = ary_size / 2;
+
+class MerHeapTest : public ::testing::TestWithParam<size_t> {
+protected:
+  static void SetUpTestCase() {
+    mer_dna::k(mer_len);
+    shared_ary = new large_array(ary_size, mer_len * 2, 0, 63);
+    mer_dna m;
+
+    for(size_t i = 0; i < nb_mers; ++i) {
+      m.randomize();
+      bool   is_new;
+      size_t id;
+      shared_ary->set(m, &is_new, &id);
+      EXPECT_TRUE(is_new); // Very small probability to fail
+    }
+  }
+
+  static void TearDownTestCase() {
+    delete shared_ary;
+  }
+
+  static large_array* shared_ary;
+};
+large_array* MerHeapTest::shared_ary = 0;
+
+TEST_P(MerHeapTest, Order) {
+  uint64_t           hash  = 0;
+  int                count = 0;
+  const large_array& ary   = *shared_ary;
+  mer_dna            m;
+  m.polyA();
+
+  for(size_t slice = 0; slice < GetParam(); ++slice) {
+    region_iterator rit = ary.iterator_slice<region_iterator>(slice, GetParam());
+    mer_heap heap(ary.max_reprobe_offset());
+
+    heap.fill(rit);
+
+    while(!heap.is_empty()) {
+      uint64_t nhash = ary.matrix().times(heap.head()->key_);
+      EXPECT_LE(hash, nhash);
+      if(nhash == hash)
+        EXPECT_LT(m, heap.head()->key_);
+      hash = nhash;
+      m    = heap.head()->key_;
+
+      heap.pop();
+      ++count;
+
+      if(rit.next())
+        heap.push(rit);
+    }
+  }
+
+  EXPECT_EQ(nb_mers, count);
+}
+
+INSTANTIATE_TEST_CASE_P(MerHeap, MerHeapTest, ::testing::Range((size_t)1, (size_t)11));
+
+} // namespace {
diff --git a/unit_tests/test_mer_iterator.cc b/unit_tests/test_mer_iterator.cc
new file mode 100644
index 0000000..1e1cc52
--- /dev/null
+++ b/unit_tests/test_mer_iterator.cc
@@ -0,0 +1,181 @@
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_qual_iterator.hpp>
+
+namespace {
+using std::string;
+using jellyfish::mer_dna;
+typedef std::vector<string> string_vector;
+template<typename Iterator>
+struct opened_streams {
+  Iterator begin_, end_;
+
+  opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+  std::unique_ptr<std::istream> next() {
+    std::unique_ptr<std::istream> res;
+    if(begin_ != end_) {
+      res.reset(*begin_);
+      ++begin_;
+    }
+    return res;
+  }
+};
+typedef jellyfish::mer_overlap_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+typedef jellyfish::mer_iterator<parser_type, mer_dna> mer_iterator_type;
+
+typedef jellyfish::whole_sequence_parser<opened_streams<std::ifstream**> > parser_qual_type;
+typedef jellyfish::mer_qual_iterator<parser_qual_type, mer_dna> mer_qual_iterator_type;
+
+static string generate_sequence(int len) {
+  static const char bases[4] = { 'A', 'C', 'G', 'T' };
+  string res;
+  res.reserve(len);
+
+  for(int i = 0; i < len; ++i)
+    res += bases[random() & 0x3];
+
+  return res;
+}
+
+static string generate_quals(int len) {
+  string res;
+  res.reserve(len);
+
+  for(int i = 0; i < len; ++i)
+    res += static_cast<char>('!' + (random() % 94));
+
+  return res;
+}
+
+TEST(MerIterator, Sequence) {
+  static const int nb_sequences = 100;
+  const char* file_name = "Sequence.fa";
+  file_unlink fu(file_name);
+  string_vector sequences;
+  mer_dna::k(35);
+
+  {
+    std::ofstream input_fasta(file_name);
+    for(int i = 0; i < nb_sequences; ++i) {
+      sequences.push_back(generate_sequence(20 + random() % 200));
+      input_fasta << ">" << i << "\n" << sequences.back() << "\n";
+    }
+  }
+
+  // Check that every mer of the iterator matches the sequence
+  auto input_fasta = new std::ifstream(file_name);
+  {
+    opened_streams<std::ifstream**> streams(&input_fasta, &input_fasta + 1);
+    parser_type parser(mer_dna::k(), 1, 10, 100, streams);
+    mer_iterator_type mit(parser);
+    for(string_vector::const_iterator it = sequences.begin(); it != sequences.end(); ++it) {
+      if(it->size() >= mer_dna::k()) {
+        for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i, ++mit) {
+          ASSERT_NE(mer_iterator_type(), mit);
+          EXPECT_EQ(it->substr(i, mer_dna::k()), mit->to_str());
+        }
+      }
+    }
+    EXPECT_EQ(mer_iterator_type(), mit);
+  }
+}
+
+  // Same but with canonical mers
+TEST(MerIterator, SequenceCanonical) {
+  const char* file_name = "SequenceCanonical.fa";
+  file_unlink fu(file_name);
+  string_vector sequences;
+  static const int nb_sequences = 100;
+  mer_dna::k(35);
+
+  {
+    std::ofstream input_fasta(file_name);
+    for(int i = 0; i < nb_sequences; ++i) {
+      sequences.push_back(generate_sequence(20 + random() % 200));
+      input_fasta << ">" << i << "\n" << sequences.back() << "\n";
+    }
+  }
+
+  auto input_fasta = new std::ifstream(file_name);
+  {
+    opened_streams<std::ifstream**> streams(&input_fasta, &input_fasta + 1);
+    parser_type parser(mer_dna::k(), 1, 10, 100, streams);
+    mer_iterator_type mit(parser, true);
+    for(string_vector::const_iterator it = sequences.begin(); it != sequences.end(); ++it) {
+      if(it->size() >= mer_dna::k()) {
+        for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i, ++mit) {
+          ASSERT_NE(mer_iterator_type(), mit);
+          ASSERT_EQ(*mit, mit->get_canonical());
+          EXPECT_TRUE((it->substr(i, mer_dna::k()) == mit->to_str()) ||
+                      (it->substr(i, mer_dna::k()) == mit->get_reverse_complement().to_str()));
+        }
+      }
+    }
+    EXPECT_EQ(mer_iterator_type(), mit);
+  }
+}
+
+TEST(MerQualIterator, Sequence) {
+  const char* file_name = "Sequence.fq";
+  file_unlink fu(file_name);
+  string_vector sequences;
+  string_vector quals;
+  static const int nb_sequences = 100;
+  mer_dna::k(35);
+
+  for(int i = 0; i < nb_sequences; ++i) {
+    const int len = 20 + (random() % 200);
+    sequences.push_back(generate_sequence(len));
+    quals.push_back(generate_quals(len));
+  }
+
+  {
+    std::ofstream input_fasta(file_name);
+    for(size_t i = 0; i < sequences.size(); ++i)
+      input_fasta << "@" << i << "\n"
+                  << sequences[i] << "\n"
+                  << "+\n"
+                  << quals[i] << "\n";
+  }
+
+  auto input1_fastq = new std::ifstream(file_name);
+  auto input2_fastq = new std::ifstream(file_name);
+  {
+    opened_streams<std::ifstream**> streams1(&input1_fastq, &input1_fastq + 1);
+    parser_qual_type parser1(10, 10, 1, streams1);
+    mer_qual_iterator_type mit(parser1, '#', false);
+
+    opened_streams<std::ifstream**> streams2(&input2_fastq, &input2_fastq + 1);
+    parser_qual_type parser2(10, 10, 1, streams2);
+    mer_qual_iterator_type mit_canonical(parser2, '#', true);
+
+    for(string_vector::const_iterator it = sequences.begin(), qit = quals.begin(); it != sequences.end(); ++it, ++qit) {
+      if(it->size() >= mer_dna::k()) {
+        for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i) {
+          const size_t next_N = qit->find_first_of("!\"", i);
+          SCOPED_TRACE(::testing::Message() << "i:" << i << " next_N:" << next_N);
+          if(next_N != std::string::npos && next_N >= i && next_N < i + mer_dna::k())
+            continue;
+          ASSERT_NE(mer_iterator_type(), mit);
+          EXPECT_EQ(it->substr(i, mer_dna::k()), mit->to_str());
+
+          ASSERT_NE(mer_iterator_type(), mit_canonical);
+          ASSERT_EQ(*mit_canonical, mit_canonical->get_canonical());
+          EXPECT_TRUE((it->substr(i, mer_dna::k()) == mit_canonical->to_str()) ||
+                      (it->substr(i, mer_dna::k()) == mit_canonical->get_reverse_complement().to_str()));
+          ++mit;
+          ++mit_canonical;
+        }
+      }
+    }
+    EXPECT_EQ(mer_iterator_type(), mit);
+  }
+
+}
+} // namespace {
diff --git a/unit_tests/test_mer_overlap_sequence_parser.cc b/unit_tests/test_mer_overlap_sequence_parser.cc
new file mode 100644
index 0000000..26cfc32
--- /dev/null
+++ b/unit_tests/test_mer_overlap_sequence_parser.cc
@@ -0,0 +1,177 @@
+#include <string>
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+
+namespace {
+using std::string;
+using std::istringstream;
+template<typename Iterator>
+struct opened_streams {
+  Iterator begin_, end_;
+
+  opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+  std::unique_ptr<std::istream> next() {
+    std::unique_ptr<std::istream> res;
+    if(begin_ != end_) {
+      res.reset(*begin_);
+      ++begin_;
+    }
+    return res;
+  }
+};
+typedef jellyfish::mer_overlap_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+
+
+TEST(MerOverlapSequenceParser, OneSmallSequence) {
+  static const char* seq = "ATTACCTTGTACCTTCAGAGC";
+  const char* file_name = "OneSmallSequence.fa";
+  file_unlink fu(file_name);
+
+  {
+    std::ofstream sequence(file_name);
+    sequence << ">header\n" << seq;
+  }
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+
+  parser_type parser(10, 1, 10, 100, streams);
+
+  parser_type::job j(parser);
+  ASSERT_FALSE(j.is_empty());
+  EXPECT_EQ(strlen(seq), j->end - j->start);
+  EXPECT_STREQ(seq, j->start);
+  j.release();
+
+  parser_type::job j2(parser);
+  EXPECT_TRUE(j2.is_empty());
+}
+
+string generate_sequences(std::ostream& os, int a, int b, int nb, bool fastq = false) {
+  static const char bases[4] = {'A', 'C', 'G', 'T' };
+  string res;
+  for(int i = 0; i < nb; ++i) {
+    int len = a + random() % b;
+    os << (fastq ? "@" : ">") << "r" << i << " " << len << "\n";
+    for(int j = 0; j < len; ++j) {
+      char b = bases[random() & 0x3];
+      os << b;
+      res += b;
+      if(random() % 16 == 0)
+        os << "\n";
+    }
+    if(i != nb - 1)
+      res += 'N';
+    os << "\n";
+    if(fastq) {
+      os << "+\n";
+      for(int j = 0; j < len; ++j) {
+        if(random() % 16 == 0)
+          os << "\n";
+        os << "#";
+      }
+      os << "\n";
+    }
+  }
+  return res;
+}
+
+TEST(MerOverlapSequenceParser, ManySmallSequences) {
+  const char* file_name = "ManySmallSequences.fa";
+  file_unlink fu(file_name);
+  static const int nb_reads = 20;
+  static const int mer_len = 10;
+
+  std::ofstream o_sequence(file_name);
+  string res = generate_sequences(o_sequence, 20, 64, nb_reads);
+  o_sequence.close();
+
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+
+  parser_type parser(mer_len, 1, 10, 100, streams);
+  size_t offset = 0;
+  while(true) {
+    parser_type::job j(parser);
+    if(j.is_empty())
+      break;
+    SCOPED_TRACE(::testing::Message() << offset << ": " << res.substr(offset, j->end - j->start));
+    EXPECT_EQ(res.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+    offset += j->end - j->start - (mer_len - 1);
+  }
+  EXPECT_EQ(res.size(), offset + mer_len - 1);
+}
+
+TEST(MerOverlapSequenceParser, BigSequences) {
+  const char* file_name1 = "BigSequences1.fa";
+  const char* file_name2 = "BigSequences2.fa";
+  file_unlink fu1(file_name1);
+  file_unlink fu2(file_name2);
+
+  std::ofstream o_sequence(file_name1);
+  const string res0 = generate_sequences(o_sequence, 200, 100, 3);
+  o_sequence.close();
+  o_sequence.open(file_name2);
+  const string res1 = generate_sequences(o_sequence, 200, 100, 3);
+  o_sequence.close();
+
+  std::ifstream* tmps[2];
+  tmps[0] = new std::ifstream(file_name1);
+  tmps[1] = new std::ifstream(file_name2);
+  opened_streams<std::ifstream**> streams(tmps, tmps + 2);
+
+  static const int mer_len = 10;
+  parser_type parser(mer_len, 1, 10, 100, streams);
+
+  size_t offset = 0;
+  while(offset < res0.size() - mer_len + 1) {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    SCOPED_TRACE(::testing::Message() << offset << ": " << res0.substr(offset, j->end - j->start));
+    EXPECT_EQ(res0.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+    offset += j->end - j->start - (mer_len - 1);
+  }
+  EXPECT_EQ(res0.size(), offset + mer_len - 1);
+
+  offset = 0;
+  while(offset < res1.size() - mer_len + 1) {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    SCOPED_TRACE(::testing::Message() << offset << ": " << res1.substr(offset, j->end - j->start));
+    EXPECT_EQ(res1.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+    offset += j->end - j->start - (mer_len - 1);
+  }
+  EXPECT_EQ(res1.size(), offset + mer_len - 1);
+
+  parser_type::job j2(parser);
+  EXPECT_TRUE(j2.is_empty());
+}
+
+TEST(MerOverlapSequenceParser, Fastq) {
+  const char* file_name = "Fastq.fa";
+  file_unlink fu(file_name);
+  static const int nb_reads = 100;
+  static const int mer_len = 20;
+
+  std::ofstream o_sequence(file_name);
+  string res = generate_sequences(o_sequence, 10, 50, nb_reads, true);
+  o_sequence.close();
+
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+  parser_type parser(mer_len, 1, 10, 100, streams);
+
+  size_t offset = 0;
+  while(true) {
+    parser_type::job j(parser);
+    if(j.is_empty())
+      break;
+    //    SCOPED_TRACE(::testing::Message() << offset << ": " << res.substr(offset, j->end - j->start));
+    EXPECT_EQ(res.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+    offset += j->end - j->start - (mer_len - 1);
+  }
+  EXPECT_EQ(res.size(), offset + mer_len - 1);
+}
+} // namespace {
diff --git a/unit_tests/test_misc.cc b/unit_tests/test_misc.cc
new file mode 100644
index 0000000..d35b42c
--- /dev/null
+++ b/unit_tests/test_misc.cc
@@ -0,0 +1,110 @@
+#include <stdint.h>
+
+#include <algorithm>
+#include <functional>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/misc.hpp>
+
+namespace {
+using testing::Types;
+
+template <typename T>
+class FloorLog2Test : public ::testing::Test {
+public:
+  T x;
+
+  FloorLog2Test() : x(1) {}
+};
+
+typedef Types<uint32_t, uint64_t> Implementations;
+TYPED_TEST_CASE(FloorLog2Test, Implementations);
+
+TYPED_TEST(FloorLog2Test, FloorLog2) {
+  unsigned int i = 0;
+
+  for(i = 0; i < 8 * sizeof(this->x); i++) {
+    ASSERT_EQ(i, jellyfish::floorLog2(this->x << i));
+    ASSERT_EQ(i, jellyfish::floorLog2((this->x << i) | ((this->x << i) - 1)));
+  }
+}
+
+using jellyfish::bitsize;
+TEST(BitSize, Small) {
+  for(int i = 1; i < 4098; ++i) {
+    SCOPED_TRACE(::testing::Message() << "i:" << i);
+    EXPECT_GE((1 << bitsize(i)) - 1, i);
+    EXPECT_LE(1 << (bitsize(i) - 1), i);
+  }
+}
+
+template<typename T>
+int generic_popcount(T x) {
+  static int counts[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
+  int res = 0;
+  for( ; x; x >>= 4)
+    res += counts[x & 0xf];
+  return res;
+}
+
+TEST(Random, Bits) {
+  uint64_t m        = 0;
+  uint64_t m2       = 0;
+  int      not_zero = 0;
+  int      bits     = 0;
+  for(int i = 0; i < 1024; ++i) {
+    m        += jellyfish::random_bits(41);
+    m2       += random_bits(41);
+    not_zero += random_bits() > 0;
+    bits     += generic_popcount(m);
+  }
+  std::cout << bits << "\n";
+  EXPECT_LT((uint64_t)1 << 49, m); // Should be false with very low probability
+  EXPECT_LT((uint64_t)1 << 49, m2); // Should be false with very low probability
+  EXPECT_LT((int)(20.5 * 1024) / 2, bits);
+  EXPECT_LT(512, not_zero);
+}
+
+TEST(BinarySearchFirst, Int) {
+  static int size = 1024;
+
+  for(int i = 0; i < size; ++i)
+    EXPECT_EQ(i, *jellyfish::binary_search_first_false(jellyfish::pointer_integer<int>(0), jellyfish::pointer_integer<int>(size),
+                                                       std::bind2nd(std::less<int>(), i)));
+}
+
+TEST(Slices, NonOverlapAll) {
+  for(int iteration = 0; iteration < 100; ++iteration) {
+    unsigned int nb_slices = random_bits(4) + 1;
+    unsigned int size      = std::max(nb_slices, (unsigned int)random_bits(20));
+    SCOPED_TRACE(::testing::Message() << "iteration:" << iteration
+                 << " size:" << size << " nb_slices:" << nb_slices);
+
+    unsigned int total = 0;
+    unsigned int prev  = 0;
+    for(unsigned int i = 0; i < nb_slices; ++i) {
+      SCOPED_TRACE(::testing::Message() << "i:" << i);
+      std::pair<unsigned int, unsigned int> b = jellyfish::slice(i, nb_slices, size);
+      ASSERT_EQ(prev, b.first);
+      ASSERT_GT(b.second, b.first);
+      total += b.second - b.first;
+      prev   = b.second;
+    }
+    ASSERT_EQ(size, total);
+  }
+}
+
+TEST(QuoteArg, Nothing) {
+  const std::string arg = "hello_world.1234_coucou/voila-bouh";
+  EXPECT_EQ(arg, jellyfish::quote_arg(arg));
+}
+TEST(QuoteArg, Quote) {
+  const std::string arg = "coucou voila";
+  EXPECT_EQ("'" + arg + "'", jellyfish::quote_arg(arg));
+}
+TEST(QuoteArg, QuoteSlash) {
+  const std::string arg = "coucou_'voila";
+  EXPECT_EQ("'coucou_'\\''voila'", jellyfish::quote_arg(arg));
+}
+}
diff --git a/unit_tests/test_mutex.cc b/unit_tests/test_mutex.cc
new file mode 100644
index 0000000..d404950
--- /dev/null
+++ b/unit_tests/test_mutex.cc
@@ -0,0 +1,53 @@
+#include <gtest/gtest.h>
+#include <jellyfish/locks_pthread.hpp>
+
+using testing::Types;
+
+#define NB_THREADS 3
+#define COUNT	1000000
+
+template <class mutex>
+class MutexTest : public ::testing::Test
+{
+  int				volatile count;
+  mutex				count_mutex;
+  pthread_t			threads[NB_THREADS];
+  pthread_attr_t		attr;
+
+public:
+  MutexTest() : count(0), count_mutex() {
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+    for(int i = 0; i < NB_THREADS; i++)
+      pthread_create(&threads[i], &attr, thread_fun, (void *)this);
+    
+    for(int i = 0; i < NB_THREADS; i++)
+      pthread_join(threads[i], NULL);
+  }
+
+  static void *thread_fun(void *t) {
+    MutexTest<mutex> *self = (MutexTest<mutex> *)t;
+
+    self->inc();
+    return NULL;
+  }
+
+  void inc() {
+    for(int i = 0; i < COUNT; i++) {
+      count_mutex.lock();
+      count++;
+      count_mutex.unlock();
+    }
+  }
+
+
+  int get_count() { return count; }
+};
+
+typedef Types<locks::pthread::mutex> Implementations;
+
+TYPED_TEST_CASE(MutexTest, Implementations);
+
+TYPED_TEST(MutexTest, SuccessfullLocking) {
+  EXPECT_EQ(NB_THREADS * COUNT, this->get_count());
+}
diff --git a/unit_tests/test_offsets_key_value.cc b/unit_tests/test_offsets_key_value.cc
index 38b6d68..15d2918 100644
--- a/unit_tests/test_offsets_key_value.cc
+++ b/unit_tests/test_offsets_key_value.cc
@@ -12,162 +12,151 @@ namespace {
 #define UINT64_C(x) ((uint64_t)x)
 #endif
 
-  using namespace jellyfish;
-
-  typedef struct {
-    uint_t        key_len, val_len;
-  } offset_test_param;
-
-  class ComputeOffsetsTest : public ::testing::TestWithParam<offset_test_param>
-  {
-  public:
-    Offsets<uint64_t> offsets;
-
-    ComputeOffsetsTest() :
-      offsets(GetParam().key_len, GetParam().val_len, 15)
-    { }
-
-    ~ComputeOffsetsTest() { }
-  };
-
-  TEST_P(ComputeOffsetsTest, CheckCoherency) {
-    const Offsets<uint64_t>::offset_t *it     = NULL, *pit = NULL;
-    const Offsets<uint64_t>::offset_t *lit    = NULL, *lpit = NULL;
-    uint_t                             k_len  = GetParam().key_len;
-    uint_t                             v_len  = GetParam().val_len;
-    uint_t                             kv_len = k_len + v_len;
-    uint_t                             lk_len = 4;
-    uint_t                             lv_len = kv_len - lk_len;
-    uint_t                             i      = 0;
-    //  uint64_t                          *w, *pw;
-  
-    //   /* Still missing:
-    //    * - testing of value masks
-    //    */
-    EXPECT_EQ(lk_len, this->offsets.get_reprobe_len());
-    EXPECT_EQ(lv_len, this->offsets.get_lval_len());
-  
-    for(i = 0; true; i++) {
-      this->offsets.get_word_offset(i, &it, &lit, NULL);
-      if(i > 0) {
-        this->offsets.get_word_offset(i-1, &pit, &lpit, NULL);
-      
-        uint_t noff = pit->key.boff + kv_len;
-        if(noff > 64) {
-          EXPECT_EQ(pit->key.woff + 1, it->key.woff) <<
-            i << ": Word offset should go up";
-        } else {
-          EXPECT_EQ(pit->key.woff, it->key.woff) <<
-            i << ": Word offset should NOT go up";
-        }
-
-        if(pit->key.mask2) { // key between two words
-          EXPECT_LT((uint_t)64, pit->key.boff + k_len) <<
-            i << ": Key not between words, should not have mask2";
-        } else {
-          EXPECT_GE((uint_t)64, pit->key.boff - 1 + k_len + 1) <<
-            i << ": Key between words, should have mask2";
-        } 
-        EXPECT_EQ((pit->key.boff + kv_len + 1 + (pit->key.mask2 ? 2 : 0)) % 64,
-                  it->key.boff) <<
-          i << ": Invalid jump of bit offset";
-        EXPECT_EQ((pit->key.boff + kv_len + 1 + (pit->key.mask2 ? 2 : 0)) % 64,
-                  lit->key.boff) <<
-          i << ": Invalid jump of bit offset large field";
-      } // if(i > 0)
-    
-      EXPECT_EQ((it->key.boff + k_len + (it->key.mask2 ? 2 : 0)) % 64, it->val.boff) <<
-        i << ": Invalid value offset";
-      EXPECT_EQ((lit->key.boff + lk_len + (lit->key.mask2 ? 2 : 0)) % 64, lit->val.boff) <<
-        i << ": Invalid value offset large field";
-      EXPECT_EQ(UINT64_C(1) << (it->key.boff - 1), it->key.lb_mask) <<
-        i << ": Invalid lb_mask";
-      EXPECT_EQ(UINT64_C(1) << (lit->key.boff - 1), lit->key.lb_mask) <<
-        i << ": Invalid lb_mask";
-      if(it->key.mask2) {
-        EXPECT_EQ(64 - it->key.boff - 1, it->key.shift) <<
-          i << ": invalid key shift";
-        EXPECT_EQ(UINT64_C(1) << (64 - it->key.boff + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
-          i << ": invalid key mask";
-        EXPECT_EQ(UINT64_C(1) << (it->key.boff + k_len - 64 + 2), 1 + it->key.mask2) <<
-          i << ": invalid key mask2";
-        EXPECT_EQ(k_len, it->key.shift + it->key.cshift);
-        EXPECT_EQ(UINT64_C(1) << 63, it->key.sb_mask1) <<
-          i << ": invalid key key sb_mask1";
-        EXPECT_EQ(UINT64_C(1) << it->key.cshift, it->key.sb_mask2) <<
-          i << ": invalid key sb_mask2";
-      } else {
-        EXPECT_EQ(0u, it->key.shift) <<
-          i << ": key shift should be zero, no mask";
-        EXPECT_EQ(UINT64_C(1) << (k_len + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
-          i << ": invalid key mask " << it->key.boff;
-        EXPECT_EQ(0u, it->key.cshift);
-        EXPECT_EQ(0u, it->key.sb_mask1 | it->key.sb_mask2) <<
-          i << ": set bit masks should be 0";
-      }
-      if(lit->key.mask2) {
-        EXPECT_EQ(64 - lit->key.boff - 1, lit->key.shift) <<
-          i << ": invalid key shift large field";
-        EXPECT_EQ(UINT64_C(1) << (64 - lit->key.boff + 1), 1 + (lit->key.mask1 >> (lit->key.boff - 1))) <<
-          i << ": invalid key mask large field";
-        EXPECT_EQ(UINT64_C(1) << (lit->key.boff + lk_len - 64 + 2), 1 + lit->key.mask2) <<
-          i << ": invalid key mask2 large field";
-        EXPECT_EQ(lk_len, lit->key.shift + lit->key.cshift);
-        EXPECT_EQ(UINT64_C(1) << 63, lit->key.sb_mask1) <<
-          i << ": invalid key key sb_mask1";
-        EXPECT_EQ(UINT64_C(1) << lit->key.cshift, lit->key.sb_mask2) <<
-          i << ": invalid key sb_mask2";
-      } else {
-        EXPECT_EQ(0u, lit->key.shift) <<
-          i << ": key shift should be zero, no mask, large field";
-        EXPECT_EQ(0u, lit->key.cshift);
-        EXPECT_EQ(UINT64_C(1) << (lk_len + 1), 1 + (lit->key.mask1 >> (lit->key.boff - 1))) <<
-          i << ": invalid key mask large field " << lit->key.boff;
-      }
-
-      if(it->val.mask2) {
-        EXPECT_LT((uint_t)64, it->val.boff + v_len) <<
-          i << ": val not between words, should not have mask2";
-        EXPECT_EQ(64 - it->val.boff, it->val.shift) <<
-          i << ": invalid val shift";
-        EXPECT_EQ(UINT64_C(1) << (64 - it->val.boff), 1 + (it->val.mask1 >> it->val.boff)) <<
-          i << ": invalid val mask1";
-        EXPECT_EQ(UINT64_C(1) << (it->val.boff + v_len - 64), 1 + it->val.mask2) <<
-          i << ": invalid val mask2";
-      } else {
-        EXPECT_GE((uint_t)64, it->val.boff + v_len) <<
-          i << ": val between words, should have mask2";
-        EXPECT_EQ(v_len, it->val.shift) <<
-          i << ": invalid val shift";
-        EXPECT_EQ(UINT64_C(1) << v_len, 1 + (it->val.mask1 >> it->val.boff)) <<
-          i << ": invalid val mask1";
-      }
-      EXPECT_EQ(v_len, it->val.shift + it->val.cshift);
-      if(lit->val.mask2) {
-        EXPECT_LT((uint_t)64, lit->val.boff + lv_len) <<
-          i << ": val not between words, should not have mask2 large field";
-        EXPECT_EQ(64 - lit->val.boff, lit->val.shift) <<
-          i << ": invalid val shift large field";
-        EXPECT_EQ(UINT64_C(1) << (64 - lit->val.boff), 1 + (lit->val.mask1 >> lit->val.boff)) <<
-          i << ": invalid val mask1 large field";
-        EXPECT_EQ(UINT64_C(1) << (lit->val.boff + lv_len - 64), 1 + lit->val.mask2) <<
-          i << ": invalid val mask2 large field";
-      } else {
-        EXPECT_GE((uint_t)64, lit->val.boff + lv_len) <<
-          i << ": val between words, should have mask2 large field " << lit->val.boff << " " << lv_len;
-        EXPECT_EQ(lv_len, lit->val.shift) <<
-          i << ": invalid val shift large field";
-        EXPECT_EQ(UINT64_C(1) << lv_len, 1 + (lit->val.mask1 >> lit->val.boff)) <<
-          i << ": invalid val mask1 large field";
-      }
-      EXPECT_EQ(lv_len, lit->val.shift + lit->val.cshift);
-      
-      uint_t noff = it->key.boff + kv_len;
-      if(noff == 62 || noff == 63 || noff == 64)
-        break;
+using namespace jellyfish;
+
+// Tuple is {key_len, val_len, reprobe_len}. Actual reprobe value is computed from the reprobe_len.
+class ComputeOffsetsTest : public ::testing::TestWithParam< ::std::tr1::tuple<int,int, int> >
+{
+public:
+  Offsets<uint64_t> offsets;
+
+  ComputeOffsetsTest() :
+    offsets(::std::tr1::get<0>(GetParam()), ::std::tr1::get<1>(GetParam()), (1 << ::std::tr1::get<2>(GetParam())) - 2)
+  { }
+
+  ~ComputeOffsetsTest() { }
+};
+
+void test_key_offsets(const Offsets<uint64_t>::offset_t* it, unsigned int k_len, const char* message) {
+  SCOPED_TRACE(message);
+
+  unsigned int val_boff = (it->key.boff + k_len + 1 + (k_len - (bsizeof(uint64_t) - it->key.boff - 1)) / (bsizeof(uint64_t) - 1)) % bsizeof(uint64_t);
+  if(it->key.sb_mask1) { // key between two words
+    EXPECT_LT(sizeof(uint64_t), it->key.boff + k_len) <<
+      ": Key not between words, should not have mask2";
+    EXPECT_EQ(val_boff + (val_boff > 0), it->val.boff) <<
+      ": Invalid value offset";
+    if(it->val.boff == 0)
+      EXPECT_EQ((uint64_t)0, it->key.sb_mask2);
+  } else {
+    if(bsizeof(uint64_t) >= it->key.boff + k_len) {
+      EXPECT_EQ((it->key.boff + k_len) % bsizeof(uint64_t), it->val.boff) <<
+        ": Invalid value offset";
+    } else {
+      EXPECT_TRUE(val_boff % bsizeof(uint64_t) == 0) <<
+        ": Key between words, should have mask2";
     }
   }
+  EXPECT_EQ((uint64_t)1 << (it->key.boff - 1), it->key.lb_mask) <<
+    ": Invalid lb_mask";
+  if(it->key.sb_mask1) {
+    EXPECT_EQ(bsizeof(uint64_t) - it->key.boff - 1, it->key.shift) <<
+      ": invalid key shift";
+    EXPECT_EQ(it->key.boff == 1 ? 0 : (uint64_t)1 << (bsizeof(uint64_t) - it->key.boff + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
+      ": invalid key mask";
+    EXPECT_EQ((uint64_t)1 << it->val.boff, 1 + it->key.mask2) <<
+      ": invalid key mask2";
+    EXPECT_EQ(bsizeof(uint64_t) - it->key.boff - 1, it->key.shift) <<
+      ": invalid key shift";
+    EXPECT_EQ((unsigned int)0, (k_len - (it->key.shift + it->key.cshift)) % (bsizeof(uint64_t) - 1)) <<
+      ": invalid sum of shift and cshift";
+    if(it->key.sb_mask2)
+      EXPECT_EQ(1 + it->key.mask2, (uint64_t)1 << (it->key.cshift + 1)) <<
+        ": invalid key cshift";
+    else
+      EXPECT_EQ((unsigned int)0, it->key.cshift);
+    EXPECT_EQ((uint64_t)1 << 63, it->key.sb_mask1) <<
+      ": invalid key key sb_mask1";
+    EXPECT_EQ(k_len - (bsizeof(uint64_t) - 1 - it->key.boff) >= bsizeof(uint64_t) - 1, it->key.full_words);
+  } else {
+    EXPECT_EQ(0u, it->key.shift) <<
+      ": key shift should be zero, no sb_mask";
+    EXPECT_EQ((uint64_t)1 << (k_len + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
+      ": invalid key mask, no sb_mask";
+    EXPECT_EQ(0u, it->key.cshift) <<
+      ": key cshift should be zero, no sb_mask";
+    EXPECT_EQ(0u, it->key.sb_mask1 | it->key.sb_mask2) <<
+      ": set bit masks should be 0";
+  }
+}
+
+void test_val_offsets(const Offsets<uint64_t>::offset_t* it, unsigned int v_len, const char* message) {
+  SCOPED_TRACE(message);
+
+  if(it->val.mask2) {
+    EXPECT_TRUE(bsizeof(uint64_t) <= it->val.boff + v_len && (it->val.boff + v_len) % bsizeof(uint64_t) != 0) <<
+      ": val not between words, should not have mask2";
+    EXPECT_EQ(bsizeof(uint64_t) - it->val.boff, it->val.shift) <<
+      ": invalid val shift";
+    EXPECT_EQ((uint64_t)1 << (bsizeof(uint64_t) - it->val.boff), 1 + (it->val.mask1 >> it->val.boff)) <<
+      ": invalid val mask1";
+    EXPECT_EQ((uint64_t)1 << (it->val.boff + v_len - bsizeof(uint64_t)), 1 + it->val.mask2) <<
+      ": invalid val mask2";
+  } else {
+    EXPECT_TRUE(bsizeof(uint64_t) > it->val.boff + v_len ||
+                (bsizeof(uint64_t) <= it->val.boff + v_len && (it->val.boff + v_len) % bsizeof(uint64_t) == 0)) <<
+      ": val between words, should have mask2";
+    EXPECT_EQ(v_len, it->val.shift) <<
+      ": invalid val shift";
+    EXPECT_EQ(v_len == bsizeof(uint64_t) ? (uint64_t)0 : (uint64_t)1 << v_len, 1 + (it->val.mask1 >> it->val.boff)) <<
+      ": invalid val mask1";
+  }
+  EXPECT_EQ(v_len, it->val.shift + it->val.cshift);
+}
+
+TEST_P(ComputeOffsetsTest, CheckCoherency) {
+  const Offsets<uint64_t>::offset_t *it     = NULL, *pit = NULL;
+  const Offsets<uint64_t>::offset_t *lit    = NULL, *lpit = NULL;
+  unsigned int                             k_len  = ::std::tr1::get<0>(GetParam());
+  unsigned int                             v_len  = ::std::tr1::get<1>(GetParam());
+  unsigned int                             kv_len = k_len + v_len;
+  unsigned int                             lk_len = ::std::tr1::get<2>(GetParam());
+  unsigned int                             lv_len = std::min(kv_len - lk_len, (unsigned int)bsizeof(uint64_t));
+  unsigned int                             i      = 0;
+
+  EXPECT_EQ(lk_len, this->offsets.reprobe_len());
+  EXPECT_EQ((uint64_t)1 << lk_len, this->offsets.reprobe_mask() + 1);
+  EXPECT_EQ(lv_len, this->offsets.lval_len());
+
+
+  for(i = 0; i < bsizeof(uint64_t); i++) {
+    SCOPED_TRACE(::testing::Message() << "key:" << k_len << " val:" << v_len << " i:" << i 
+                 << " lkey:" << lk_len << " lval:" << lv_len);
+    this->offsets.word_offset(i, &it, &lit, NULL);
+    if(i > 0) {
+      this->offsets.word_offset(i-1, &pit, &lpit, NULL);
+
+      EXPECT_GE(it->key.woff, pit->key.woff) << "Current key offset larger than previous";
+      EXPECT_GE(it->key.woff, pit->val.woff) << "Current key offset larger than previous val offset";
+      EXPECT_TRUE(it->key.woff != pit->key.woff || it->key.boff > pit->key.boff)
+        << "Key bit offset did not increase within a word";
+      EXPECT_EQ((pit->val.boff + v_len) % 64 + 1, it->key.boff) <<
+        ": Invalid jump of bit offset";
+    } // if(i > 0)
+    EXPECT_GE(it->val.woff, it->key.woff) << "Val offset larger than key offset";
+    EXPECT_TRUE(it->key.woff != it->val.woff || it->val.boff > it->key.boff)
+      << "Val bit offset did not increase within a word";
+
+    EXPECT_EQ(it->key.woff, lit->key.woff);
+    EXPECT_EQ(it->key.boff, lit->key.boff);
+    EXPECT_EQ(it->key.lb_mask, lit->key.lb_mask);
+
+    test_key_offsets(it, k_len, "Key offsets");
+    test_key_offsets(lit, lk_len, "Large key offsets");
+
+    test_val_offsets(it, v_len, "Val offsets");
+    test_val_offsets(lit, lv_len, "Large val offsets");
+
+    size_t next_bit = (it->val.boff + v_len) % bsizeof(uint64_t);
+    if(next_bit >= 62 || next_bit == 0)
+      break;
+  }
 
-  offset_test_param params[] = { {10, 10}, { 22, 5 }, {20, 5} };
-  INSTANTIATE_TEST_CASE_P(OffsetsTest, ComputeOffsetsTest, ::testing::ValuesIn(params));
+  EXPECT_EQ(i + 1, this->offsets.block_len());
 }
+
+INSTANTIATE_TEST_CASE_P(OffsetsTest, ComputeOffsetsTest, ::testing::Combine(::testing::Range(8, 192, 2), // Key lengths
+                                                                            ::testing::Range(0, 64),    // Val lengths
+                                                                            ::testing::Range(4, 9)      // Reprobe lengths
+                                                                            ));
+} // namespace {
diff --git a/unit_tests/test_packed_key_value_array.cc b/unit_tests/test_packed_key_value_array.cc
new file mode 100644
index 0000000..6205ac3
--- /dev/null
+++ b/unit_tests/test_packed_key_value_array.cc
@@ -0,0 +1,213 @@
+#include <gtest/gtest.h>
+#include <stdlib.h>
+#include <string.h>
+#include <map>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+#include <storage.hpp>
+#include <packed_key_value_array.hpp>
+#include <hash.hpp>
+
+#include <atomic_gcc.hpp>
+#include <allocators_malloc.hpp>
+#include <math.h>
+
+using namespace jellyfish;
+
+typedef struct {
+  size_t size, entries, iterations;
+  uint_t key_len, val_len, reprobe_limit;
+} packed_counting_param;
+
+class PackedCountingTest : public ::testing::TestWithParam<packed_counting_param>
+{
+public:
+  typedef packed_key_value::array<uint64_t,atomic::gcc<uint64_t>,allocators::malloc> pary_t;
+  typedef hash< uint64_t,uint64_t,pary_t,atomic::gcc<uint64_t> > pch_t;
+  typedef std::pair<uint64_t,uint64_t> kv_t;
+  pary_t			 ary;
+  pch_t				 pch;
+  kv_t			*kv_pairs;
+  std::map<uint64_t,size_t>	 key_entry_map;
+  
+
+  PackedCountingTest() : 
+    ary(GetParam().size, GetParam().key_len, GetParam().val_len,
+	GetParam().reprobe_limit, quadratic_reprobes),
+    pch(&ary)
+  { }
+
+  void random_keys_fill() {
+    uint64_t nkey;
+    uint64_t key_mask = (1 << GetParam().key_len) - 1;
+    kv_pairs = new kv_t[GetParam().entries];
+
+    for(size_t i = 0; i < GetParam().entries; i++) {
+      do {
+        nkey = rand() & key_mask;
+      } while(nkey == 0 || key_entry_map.find(nkey) != key_entry_map.end());
+      kv_pairs[i] = kv_t(nkey, 0);
+      key_entry_map[kv_pairs[i].first] = i;
+    }
+    
+    for(size_t i = 0; i < GetParam().iterations; i++) {
+      size_t k = exp_rand(0.5, GetParam().entries);
+      if(ary.add_rec(kv_pairs[k].first % GetParam().size,
+                     kv_pairs[k].first, (uint64_t)1, false)) {
+        kv_pairs[k].second++;
+      }
+    }
+  }
+
+  void large_fields_fill() {
+    std::vector<uint64_t> keys;
+    uint64_t key_mask = (1 << GetParam().key_len) - 1;
+    uint64_t fval = (((uint64_t)1) << GetParam().val_len) - 1;
+    uint64_t nkey, nval;
+    kv_pairs = new kv_t[GetParam().entries];
+
+    keys.reserve(GetParam().entries);
+
+    for(size_t i = 0; i < GetParam().entries; i++) {
+      do {
+        nkey = rand() & key_mask;
+      } while(nkey == 0 || key_entry_map.find(nkey) != key_entry_map.end());
+      keys.push_back(nkey);
+      key_entry_map[nkey] = i;
+    }
+
+    std::vector<uint64_t> shuff_keys = keys;
+    random_shuffle(shuff_keys.begin(), shuff_keys.end());
+    for(std::vector<uint64_t>::const_iterator it = shuff_keys.begin();
+	it != shuff_keys.end();
+	it++) {
+      ary.add_rec(*it % GetParam().size, *it, fval, false);
+      ASSERT_TRUE(ary.get_val(*it % GetParam().size,
+			      *it, nval)) << std::hex <<
+	"Key not set " << (it - shuff_keys.begin()) << " key " << *it;
+      ASSERT_EQ(fval, nval) <<
+	"Val not set properly " << (it - shuff_keys.begin()) << " key " << *it;
+		  
+    }
+
+    for(std::vector<uint64_t>::const_iterator it = keys.begin();
+	it != keys.end();
+	it++) {
+      uint64_t aval = rand() & 7;
+      bool res = ary.add_rec(*it % GetParam().size, *it, aval, false);
+      kv_pairs[it - keys.begin()] = 
+	kv_t(*it, fval + (res ? aval : 0));
+      ASSERT_TRUE(ary.get_val(*it % GetParam().size,
+			      *it, nval, true)) << std::hex <<
+	"Key not set " << (it - keys.begin()) << " key " << *it;
+      ASSERT_EQ(fval + (res ? aval : 0), nval) << std::hex <<
+	"Val not set properly " << (it - keys.begin()) << " key " << *it;
+    }    
+  }
+
+  ~PackedCountingTest() {}
+
+  // Exponantial distribution with parameter p, truncated into [0, max-1]
+  size_t exp_rand(double p, size_t max) {
+    size_t k;
+    do {
+      k = (size_t)ceil(log(1 - (((double)rand()) / RAND_MAX)) / log(p)) - 1;
+    } while(k >= max);
+    return k;
+  }
+};
+
+TEST_P(PackedCountingTest, RandomIncrementsIterator) {
+  this->random_keys_fill();
+  ASSERT_EQ(GetParam().size, this->ary.get_size());
+  pch_t::iterator                      it = this->pch.iterator_all();
+  std::map<uint64_t, size_t>::iterator  key_id;
+  kv_t                           kv_pair;
+
+  while(it.next()) {
+    key_id = this->key_entry_map.find(it.key);
+    ASSERT_FALSE(key_entry_map.end() == key_id) <<
+      "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+    kv_pair = kv_pairs[key_id->second];
+    ASSERT_EQ(kv_pair.first, it.key) <<
+      "Bad initialization";
+    ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+      "Error in count for key: " << it.key;
+  }
+
+//   for(size_t i = 0; i < GetParam().entries; i++) {
+//     ASSERT_EQ((uint64_t)0, kv_pairs[i].second) <<
+//       "Error in count for key: " << i << " " << std::hex << kv_pairs[i].first;
+//   }
+}
+
+// Not neede anymore. Only one type of iterator already tested in previous TEST_P
+// TEST_P(PackedCountingTest, RandomIncrementsFullIterator) {
+//   this->random_keys_fill();
+//   ASSERT_EQ(GetParam().size, this->pch.size());
+//   pch_t::full_iterator                  it = this->pch.full_all();
+//   std::map<uint64_t, size_t>::iterator  key_id;
+//   kv_t                           kv_pair;
+
+//   while(it.next()) {
+//     key_id = this->key_entry_map.find(it.key);
+//     ASSERT_FALSE(key_entry_map.end() == key_id) <<
+//       "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+//     kv_pair = kv_pairs[key_id->second];
+//     ASSERT_EQ(kv_pair.first, it.key) <<
+//       "Bad initialization";
+//     ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+//       "Error in count for key: " << std::hex << it.key;
+//   }
+// }
+
+TEST_P(PackedCountingTest, FullKeyIncrements) {
+  uint64_t fkey = (((uint64_t)1) << GetParam().key_len) - 1;
+  uint64_t key, val;
+  //  uint_t   overflows;
+
+  for(size_t i = 0; i < GetParam().size; i++) {
+    this->ary.add_rec(i, fkey, (uint64_t)1, false);
+    ASSERT_TRUE(this->ary.get_key_val(i, key, val));
+    ASSERT_EQ(fkey, key);
+    //    ASSERT_EQ(0u, overflows);
+    ASSERT_EQ(1u, val);
+  }
+
+  for(size_t i = 0; i < GetParam().size; i++) {
+    this->ary.add_rec(i, fkey, (uint64_t)1, false);
+    ASSERT_TRUE(this->ary.get_key_val(i, key, val));
+    ASSERT_EQ(fkey, key);
+    //    ASSERT_EQ(0u, overflows);
+    ASSERT_EQ(2u, val);
+  }
+}
+
+TEST_P(PackedCountingTest, LargeFields) {
+  this->large_fields_fill();
+  ASSERT_EQ(GetParam().size, this->pch.get_size());
+
+  pch_t::iterator it = this->pch.iterator_all();
+  std::map<uint64_t, size_t>::iterator  key_id;
+  kv_t                           kv_pair;  
+
+  while(it.next()) {
+    key_id = this->key_entry_map.find(it.key);
+    ASSERT_FALSE(key_entry_map.end() == key_id) <<
+      "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+    kv_pair = kv_pairs[key_id->second];
+    ASSERT_EQ(kv_pair.first, it.key) <<
+      "Bad initialization";
+    ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+      "Error in count for key: " << std::hex << it.key;
+  }
+}
+
+packed_counting_param pc_params[] = {
+  { 32, 16, 32, 20, 3, 15}, // size, entries, iterations, key_len, val_len, reprobe-limit
+  { 32, 16, 1024, 20, 3, 15},
+  { 64, 40, 2048, 22, 3, 7}
+};
+INSTANTIATE_TEST_CASE_P(SingleThreadTest, PackedCountingTest,
+                        ::testing::ValuesIn(pc_params));
diff --git a/unit_tests/test_rectangular_binary_matrix.cc b/unit_tests/test_rectangular_binary_matrix.cc
new file mode 100644
index 0000000..c0aaad2
--- /dev/null
+++ b/unit_tests/test_rectangular_binary_matrix.cc
@@ -0,0 +1,332 @@
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <stdexcept>
+#include <stdlib.h>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/mer_dna.hpp>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+#endif
+
+namespace {
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+
+static bool allocate_matrix(unsigned int r, unsigned c) {
+  RectangularBinaryMatrix m(r, c);
+  return m.is_zero();
+}
+
+TEST(RectangularBinaryMatrix, InitSizes) {
+  RectangularBinaryMatrix m(5, 60);
+
+  EXPECT_EQ(5u, m.r());
+  EXPECT_EQ(60u, m.c());
+  EXPECT_TRUE(m.is_zero());
+
+  EXPECT_THROW(allocate_matrix(100, 100), std::out_of_range);
+  EXPECT_THROW(allocate_matrix(0, 100), std::out_of_range);
+  EXPECT_THROW(allocate_matrix(10, 0), std::out_of_range);
+}
+
+TEST(RectangularBinaryMatrix, Copy) {
+  RectangularBinaryMatrix m1(5, 55);
+  m1.randomize(random_bits);
+
+  RectangularBinaryMatrix m2(m1);
+  RectangularBinaryMatrix m3(6, 66);
+  RectangularBinaryMatrix m4(5, 55);
+
+  EXPECT_TRUE(!m1.is_zero());
+  EXPECT_TRUE(m1 == m2);
+  EXPECT_TRUE(!(m1 == m3));
+  EXPECT_TRUE(!(m1 == m4));
+  m4 = m1;
+  EXPECT_TRUE(m1 == m4);
+}
+
+TEST(RectangularBinaryMatrix, InitRaw) {
+  const unsigned int nb_col = 80;
+  uint64_t raw[nb_col];
+  for(unsigned int i = 0; i < nb_col; ++i)
+    raw[i] = random_bits();
+  const RectangularBinaryMatrix m(raw, 19, nb_col);
+  EXPECT_EQ(19u, m.r());
+  EXPECT_EQ(80u, m.c());
+  const uint64_t mask = ((uint64_t)1 << 19) - 1;
+  for(unsigned int i = 0; i < nb_col; ++i)
+    EXPECT_EQ(raw[i] & mask, m[i]);
+}
+
+TEST(RectangularBinaryMatrix, LowIdentity) {
+  for(int r = 2; r < 64; r += 2) {
+    for(int c = 2; c < 100; c += 2) {
+      SCOPED_TRACE(::testing::Message() << "matrix " << r << "x" << c);
+      RectangularBinaryMatrix m(r, c); // Matrix should be zeroed out
+      mer_dna::k(c);
+      mer_dna v;
+      v.randomize();
+
+      EXPECT_FALSE(m.is_low_identity());
+      m.init_low_identity();
+      EXPECT_TRUE(m.is_low_identity());
+
+      uint64_t res = m.times(v);
+      EXPECT_EQ(v.get_bits(0, std::min(r, c)), res);
+    }
+  }
+}
+
+/******************************
+ * Matrix Vector product
+ ******************************/
+class MatrixVectorProd : public ::testing::TestWithParam< ::std::tr1::tuple<int, int> > {
+public:
+  unsigned int row, col;
+  RectangularBinaryMatrix m;
+  MatrixVectorProd() :
+    row(::std::tr1::get<0>(GetParam())),
+    col(::std::tr1::get<1>(GetParam())),
+    m(row, col)
+  {
+    m.randomize(random_bits);
+  }
+};
+
+TEST_P(MatrixVectorProd, Checks) {
+  EXPECT_EQ(row, m.r());
+  EXPECT_EQ(col, m.c());
+}
+
+TEST_P(MatrixVectorProd, AllOnes) {
+  uint64_t v[2], res = 0;
+  v[0] = v[1] = (uint64_t)-1;
+  for(unsigned int i = 0; i < m.c(); ++i)
+    res ^= m[i];
+  EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+  EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+  EXPECT_EQ(res, m.times_sse(v));
+#endif
+}
+
+TEST_P(MatrixVectorProd, EveryOtherOnes) {
+  uint64_t v[2], res = 0;
+  v[0] = 0xaaaaaaaaaaaaaaaaUL;
+  v[1] = 0xaaaaaaaaaaaaaaaaUL;
+  for(unsigned int i = 0; i < m.c(); i += 2)
+    res ^= m[i];
+  EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+  EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+  EXPECT_EQ(res, m.times_sse(v));
+#endif
+
+  v[0] >>= 1;
+  v[1] >>= 1;
+  res    = 0;
+  for(unsigned int i = 1; i < m.c(); i += 2)
+    res ^= m[i];
+  EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+  EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+  EXPECT_EQ(res, m.times_sse(v));
+#endif
+}
+
+#if HAVE_SSE || HAVE_INT128
+TEST_P(MatrixVectorProd, Optimizations) {
+  static const int nb_tests = 100;
+  const unsigned int nb_words = col / 64 + (col % 64 != 0);
+  uint64_t v[nb_words];
+
+  for(int i = 0; i < nb_tests; ++i) {
+    // unsigned int r = 2 * (random() % 31 + 1);
+    // unsigned int c = 2 * (random() % 100) + r;
+
+    // RectangularBinaryMatrix m(r, c);
+    // m.randomize(random_bits);
+
+    for(unsigned int j = 0; j < nb_words; ++j)
+      v[j] = random_bits();
+
+    uint64_t res = m.times_loop((uint64_t*)v);
+#ifdef HAVE_SSE
+    EXPECT_EQ(res, m.times_sse((uint64_t*)v));
+#endif
+#ifdef HAVE_INT128
+    EXPECT_EQ(res, m.times_128((uint64_t*)v));
+#endif
+  }
+}
+#endif // HAVE_SSE || HAVE_INT128
+
+INSTANTIATE_TEST_CASE_P(MatrixVectorProdTest, MatrixVectorProd, ::testing::Combine(::testing::Range(1, 65, 1), // rows
+                                                                                   ::testing::Range(2, 100, 2))); // cols
+
+/******************************
+ * Matrix product and inverse
+ ******************************/
+TEST(PseudoProduct, Dimensions) {
+  RectangularBinaryMatrix m(30, 100), m1(32, 100), m2(30, 98);
+
+  EXPECT_THROW(m.pseudo_multiplication(m1), std::domain_error);
+  EXPECT_THROW(m.pseudo_multiplication(m2), std::domain_error);
+}
+
+TEST(PseudoProduct, Identity) {
+  RectangularBinaryMatrix m(30, 100), i(30, 100);
+  i.init_low_identity();
+  m.randomize(random_bits);
+
+  EXPECT_TRUE(i.pseudo_multiplication(m) == m);
+}
+
+TEST(PseudoProduct, Parity) {
+  const unsigned int col_sizes[6] = { 50, 70, 126, 130, 64, 128 };
+  const unsigned int nb_rows = 30;
+
+  for(unsigned int k = 0; k < sizeof(col_sizes) / sizeof(unsigned int); ++k) {
+    const unsigned int nb_cols = col_sizes[k];
+    uint64_t *cols = new uint64_t[nb_cols];
+    RectangularBinaryMatrix p(nb_rows, nb_cols);
+
+    for(unsigned int j = 18; j < 19; ++j) {
+      const uint64_t bits = ((uint64_t)1 << j) - 1;
+      unsigned int i;
+      for(i = 0; i < nb_cols; ++i)
+        cols[i] = bits;
+      RectangularBinaryMatrix m(cols, nb_rows, nb_cols);
+
+      p = m.pseudo_multiplication(m);
+      for(i = 0; i < nb_cols - nb_rows; ++i)
+        EXPECT_EQ(__builtin_parity(bits) ? (uint64_t)0 : bits, p[i]);
+      for( ; i < nb_cols; ++i)
+        EXPECT_EQ(__builtin_parity(bits) ? bits : (uint64_t)0, p[i]);
+    }
+    delete [] cols;
+  }
+}
+
+TEST(PseudoProduct, Inverse) {
+  int full_rank = 0, singular = 0;
+  for(unsigned int i = 0; i < 500; ++i) {
+    unsigned int r = random() % 63 + 1;
+    unsigned int c = 2 * ((random() % 100) + 1);
+    SCOPED_TRACE(::testing::Message() << "Dimension " << r << "x" << c);
+    RectangularBinaryMatrix m(r, c);
+    m.randomize(random_bits);
+    RectangularBinaryMatrix s(m);
+    unsigned int rank = m.pseudo_rank();
+    if(rank != c) {
+      ++singular;
+      EXPECT_THROW(m.pseudo_inverse(), std::domain_error);
+    } else {
+      ++full_rank;
+      RectangularBinaryMatrix inv(m);
+      EXPECT_NO_THROW(inv = m.pseudo_inverse());
+      RectangularBinaryMatrix i = inv.pseudo_multiplication(m);
+      EXPECT_TRUE(i.is_low_identity());
+    }
+    EXPECT_TRUE(s == m);
+  }
+  EXPECT_EQ(500, full_rank + singular);
+  EXPECT_NE(0, full_rank);
+}
+
+TEST(PseudoProduct, Rank) {
+  RectangularBinaryMatrix m(50, 100);
+  for(unsigned int i = 0; i < 10; ++i) {
+    m.randomize(random_bits);
+    RectangularBinaryMatrix s(m);
+    unsigned int rank = m.pseudo_rank();
+    EXPECT_TRUE(rank <= m.c());
+    EXPECT_TRUE(s == m);
+  }
+}
+
+TEST(PseudoProduct, InitRandom) {
+  RectangularBinaryMatrix m(50, 100);
+  for(unsigned int i = 0; i < 10; ++i) {
+    RectangularBinaryMatrix im(m.randomize_pseudo_inverse(random_bits));
+    EXPECT_EQ((unsigned int)m.c(), m.pseudo_rank());
+    EXPECT_EQ((unsigned int)m.c(), im.pseudo_rank());
+    EXPECT_TRUE((m.pseudo_multiplication(im)).is_low_identity());
+  }
+}
+
+TEST(PseudoProduct, VectorInverseMultiplication) {
+  RectangularBinaryMatrix m(50, 132);
+  RectangularBinaryMatrix im(m.randomize_pseudo_inverse());
+  RectangularBinaryMatrix cim(im);
+  EXPECT_TRUE(cim.pseudo_multiplication(m).is_low_identity());
+
+  mer_dna::k(66);
+  mer_dna v, iv, iv2;
+  EXPECT_EQ(m.nb_words(), v.nb_words());
+
+  for(int i = 0; i < 100; ++i) {
+    SCOPED_TRACE(::testing::Message() << "i=" << i);
+    v.randomize();
+    uint64_t hash = m.times(v);
+    iv = v; iv.set_bits(0, 50, hash);
+
+    uint64_t lower = im.times(iv);
+    EXPECT_EQ(v.get_bits(0, 50), lower);
+  }
+}
+
+
+static const int speed_loop = 100000000;
+TEST(MatrixProductSpeed, Loop) {
+  RectangularBinaryMatrix m(50, 100);
+  const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+  uint64_t v[nb_words];
+  for(unsigned int j = 0; j < nb_words; ++j)
+    v[j] = random_bits();
+
+  volatile uint64_t res = 0;
+  for(int i = 0; i < speed_loop; ++i)
+    res ^= m.times_loop((uint64_t*)v);
+}
+
+#ifdef HAVE_SSE
+TEST(MatrixProductSpeed, SSE) {
+  RectangularBinaryMatrix m(50, 100);
+  const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+  uint64_t v[nb_words];
+  for(unsigned int j = 0; j < nb_words; ++j)
+    v[j] = random_bits();
+
+  volatile uint64_t res = 0;
+  for(int i = 0; i < speed_loop; ++i)
+    res ^= m.times_sse((uint64_t*)v);
+}
+#endif
+
+#ifdef HAVE_INT128
+TEST(MatrixProductSpeed, U128) {
+  RectangularBinaryMatrix m(50, 100);
+  const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+  uint64_t v[nb_words];
+  for(unsigned int j = 0; j < nb_words; ++j)
+    v[j] = random_bits();
+
+  volatile uint64_t res = 0;
+  for(int i = 0; i < speed_loop; ++i)
+    res ^= m.times_128((uint64_t*)v);
+}
+#endif
+
+}
diff --git a/unit_tests/test_simple_circular_buffer.cc b/unit_tests/test_simple_circular_buffer.cc
index a66e137..50805f6 100644
--- a/unit_tests/test_simple_circular_buffer.cc
+++ b/unit_tests/test_simple_circular_buffer.cc
@@ -2,70 +2,55 @@
 #include <jellyfish/simple_circular_buffer.hpp>
 
 namespace {
-  // template<typename T>
-  // class CircularBufferTest : public ::testing::Test { };
 
-  // typedef ::testing::Types<circular_buffer::fixed<int, 16>,
-  //                          circular_buffer::dyn<int> > CircularBufferTypes;
-  // TYPED_TEST_CASE(CircularBufferTest, CircularBufferTypes);
-  static const int capa = 16;
-
-  class test_simple_circular_buffer : 
-    public jellyfish::simple_circular_buffer::pre_alloc<int, capa> {
-  public:
-    typedef jellyfish::simple_circular_buffer::pre_alloc<int, capa> super;
-    explicit test_simple_circular_buffer(int* data) : super(data) { }
-
-    // int next_index(int i) const { return super::next_index(i); }
-    // int prev_index(int i) const { return super::prev_index(i); }
-    // int front_ptr() const { return front_; }
-    // int back_ptr() const { return back_; }
-  };
-
-  TEST(SimpleCircularBufferTest, FillEmpty) {
-    int ary[capa];
-    test_simple_circular_buffer buffer(ary);
-    EXPECT_EQ(capa, buffer.capacity());
-
-    EXPECT_TRUE(buffer.empty());
-    for(int i = 0; i < buffer.capacity(); ++i) {
-      SCOPED_TRACE(::testing::Message() << "i=" << i);
-      EXPECT_FALSE(buffer.full());
-      EXPECT_EQ(i, buffer.size());
-      buffer.push_back(i);
-      EXPECT_EQ(i, buffer.back());
-      EXPECT_FALSE(buffer.empty());
-    }
-    EXPECT_TRUE(buffer.full());
-
-    for(int i = 0; i < buffer.capacity(); ++i) {
-      SCOPED_TRACE(::testing::Message() << "i=" << i);
-      EXPECT_FALSE(buffer.empty());
-      EXPECT_EQ(i, buffer.front());
-      EXPECT_EQ(buffer.capacity() - i, buffer.size());
-      buffer.pop_front();
-      EXPECT_FALSE(buffer.full());
-    }
-    EXPECT_TRUE(buffer.empty());
-    EXPECT_EQ(0, buffer.size());
+static const int capa = 16;
+typedef jellyfish::simple_circular_buffer::pre_alloc<int, capa> test_simple_circular_buffer;
+
+TEST(SimpleCircularBufferTest, FillEmpty) {
+  int ary[capa];
+  test_simple_circular_buffer buffer(ary);
+  EXPECT_EQ(capa, buffer.capacity());
+
+  EXPECT_TRUE(buffer.empty());
+  for(int i = 0; i < buffer.capacity(); ++i) {
+    SCOPED_TRACE(::testing::Message() << "i=" << i);
+    EXPECT_FALSE(buffer.full());
+    EXPECT_EQ(i, buffer.size());
+    buffer.push_back(i);
+    EXPECT_EQ(i, buffer.back());
+    EXPECT_FALSE(buffer.empty());
   }
+  EXPECT_TRUE(buffer.full());
+
+  for(int i = 0; i < buffer.capacity(); ++i) {
+    SCOPED_TRACE(::testing::Message() << "i=" << i);
+    EXPECT_FALSE(buffer.empty());
+    EXPECT_EQ(i, buffer.front());
+    EXPECT_EQ(buffer.capacity() - i, buffer.size());
+    buffer.pop_front();
+    EXPECT_FALSE(buffer.full());
+  }
+  EXPECT_TRUE(buffer.empty());
+  EXPECT_EQ(0, buffer.size());
+}
 
-  TEST(SimpleCircularBufferTest, Usefull) {
-    int ary[capa];
-    test_simple_circular_buffer buffer(ary);
-    EXPECT_EQ(capa, buffer.capacity());
+TEST(SimpleCircularBufferTest, Usefull) {
+  int ary[capa];
+  test_simple_circular_buffer buffer(ary);
+  EXPECT_EQ(capa, buffer.capacity());
 
-    int i = 0;
-    for( ; i < buffer.capacity(); ++i) {
-      EXPECT_TRUE(buffer.push_back());
-      buffer.back() = i;
-    }
+  int i = 0;
+  for( ; i < buffer.capacity(); ++i) {
+    EXPECT_TRUE(buffer.push_back());
+    buffer.back() = i;
+  }
 
-    for( ; i < 10 * buffer.capacity(); ++i) {
-      EXPECT_EQ(i - capa, buffer.front());
-      buffer.pop_front();
-      EXPECT_TRUE(buffer.push_back());
-      buffer.back() = i;
-    }
+  for( ; i < 10 * buffer.capacity(); ++i) {
+    EXPECT_EQ(i - capa, buffer.front());
+    buffer.pop_front();
+    EXPECT_TRUE(buffer.push_back());
+    buffer.back() = i;
   }
 }
+
+} // namespace {
diff --git a/unit_tests/test_square_binary_matrix.cc b/unit_tests/test_square_binary_matrix.cc
index 58008ad..7022ab7 100644
--- a/unit_tests/test_square_binary_matrix.cc
+++ b/unit_tests/test_square_binary_matrix.cc
@@ -1,5 +1,6 @@
 #include <fstream>
 #include <gtest/gtest.h>
+#include <unit_test/test_main.hpp>
 #include <jellyfish/square_binary_matrix.hpp>
 #include <jellyfish/time.hpp>
 
@@ -16,15 +17,6 @@ class RandomEnvironment : public ::testing::Environment {
 };
 //::testing::Environment* const foo_env = ::testing::AddGlobalTestEnvironment(new RandomEnvironment);
 
-uint64_t random_vector(int length) {
-  uint64_t _mask = (((uint64_t)1) << length) - 1;
-  uint64_t res = 0;
-  int lrm = floorLog2((unsigned long)RAND_MAX);
-  int i;
-  for(i = 0; i < length; i += lrm) 
-    res ^= (uint64_t)random() << i;
-  return res & _mask;
-}
 
 
 #define VECLEN 44
diff --git a/unit_tests/test_stdio_filebuf.cc b/unit_tests/test_stdio_filebuf.cc
new file mode 100644
index 0000000..078003a
--- /dev/null
+++ b/unit_tests/test_stdio_filebuf.cc
@@ -0,0 +1,55 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <cstdio>
+#include <fstream>
+#include <istream>
+#include <memory>
+
+#include <gtest/gtest.h>
+
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/stdio_filebuf.hpp>
+
+namespace {
+typedef jellyfish::stdio_filebuf<char> stdio_filebuf;
+TEST(StdioFileBuf, Read) {
+  const char* file_name = "test_stdio_file_buf_read";
+  file_unlink fu(file_name);
+  std::vector<char> buffer(8192);
+  for(size_t i = 0; i < buffer.size(); ++i)
+    buffer[i] = '@' + (i % 64);
+  {
+    std::ofstream out(file_name);
+    out.write(buffer.data(), buffer.size());
+  }
+
+  int fd = open(file_name, O_RDONLY);
+  EXPECT_GT(fd, -1);
+  FILE* file = fopen(file_name, "r");
+  EXPECT_NE((FILE*)0, file);
+
+  std::unique_ptr<stdio_filebuf> fd_buf(new stdio_filebuf(fd, std::ios::in));
+  std::istream fd_stream(fd_buf.get());
+  std::unique_ptr<stdio_filebuf> file_buf(new stdio_filebuf(file, std::ios::in));
+  std::istream file_stream(file_buf.get());
+
+  size_t have_read = 0;
+  char read_buffer[256];
+  while(have_read < buffer.size()) {
+    const size_t to_read     = random_bits(8);
+    const size_t expect_read = std::min(buffer.size() - have_read, to_read);
+
+    fd_stream.read(read_buffer, to_read);
+    EXPECT_EQ(expect_read, fd_stream.gcount());
+    EXPECT_EQ(0, std::strncmp(&buffer[have_read], read_buffer, expect_read));
+
+    file_stream.read(read_buffer, to_read);
+    EXPECT_EQ(expect_read, fd_stream.gcount());
+    EXPECT_EQ(0, std::strncmp(&buffer[have_read], read_buffer, expect_read));
+
+    have_read += expect_read;
+  }
+  EXPECT_TRUE(fd_stream.eof());
+}
+}
diff --git a/unit_tests/test_stream_iterator.cc b/unit_tests/test_stream_iterator.cc
new file mode 100644
index 0000000..cc6f2bf
--- /dev/null
+++ b/unit_tests/test_stream_iterator.cc
@@ -0,0 +1,94 @@
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <gtest/gtest.h>
+
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/stream_iterator.hpp>
+
+namespace {
+namespace err = jellyfish::err;
+
+typedef std::vector<const char*>                  path_vector;
+typedef path_vector::const_iterator               path_iterator;
+typedef jellyfish::stream_iterator<path_iterator> stream_iterator;
+
+class StreamIterator : public ::testing::Test {
+protected:
+  static path_vector paths;
+  static int         total_lines;
+  static char*       tmpdir;
+
+  static void SetUpTestCase() {
+    tmpdir = strdup("/tmp/stream_iterator_XXXXXX");
+    if(!mkdtemp(tmpdir))
+      throw std::runtime_error(err::msg() << "Failed to create tmp directory: " << err::no);
+
+    int nb_files = jellyfish::random_bits(5);
+    for(int i = 0; i < nb_files; ++i) {
+      std::ostringstream path;
+      path << tmpdir << "/" << i;
+      paths.push_back(strdup(path.str().c_str()));
+      std::ofstream tmp_file(path.str().c_str());
+      if(tmp_file.fail())
+        throw std::runtime_error(err::msg() << "Failed to open file '" << path.str() << "' for writing");
+      int nb_lines = jellyfish::random_bits(6);
+      total_lines += nb_lines;
+      for(int j = 0; j < nb_lines; ++j)
+        tmp_file << "line " << j << "\n";
+    }
+  }
+
+  static void TearDownTestCase() {
+    for(path_iterator it = paths.begin(); it != paths.end(); ++it) {
+      if(unlink(*it) == -1)
+        throw std::runtime_error(err::msg() << "Failed to unlink file '" << *it << ": " << err::no);
+      free((void*)*it);
+    }
+    if(rmdir(tmpdir) == -1)
+      throw std::runtime_error(err::msg() << "Failed to rmdir '" << tmpdir << ": " << err::no);
+    free(tmpdir);
+  }
+};
+path_vector StreamIterator::paths;
+int         StreamIterator::total_lines = 0;
+char*       StreamIterator::tmpdir;
+
+TEST_F(StreamIterator, Empty) {
+  stream_iterator sit(paths.begin(), paths.begin());
+  stream_iterator send;
+
+  int nb_files = 0;
+  int nb_lines = 0;
+  for( ; sit != send; ++sit, ++nb_files)
+    for(std::string line; std::getline(*sit, line); ++nb_lines) ;
+
+  EXPECT_EQ(0, nb_files);
+  EXPECT_EQ(0, nb_lines);
+}
+
+
+TEST_F(StreamIterator, RandomFiles) {
+  SCOPED_TRACE(::testing::Message() << "nb_files:" << paths.size() << " nb_lines:" << total_lines);
+
+  stream_iterator sit(paths.begin(), paths.end());
+  stream_iterator send;
+
+  int nb_files = 0;
+  int nb_lines = 0;
+  for( ; sit != send; ++sit, ++nb_files) {
+    for(std::string line; std::getline(*sit, line); ++nb_lines) ;
+    EXPECT_TRUE(sit->eof());
+  }
+
+  EXPECT_EQ(paths.size(), (size_t)nb_files);
+  EXPECT_EQ(total_lines, nb_lines);
+}
+}
diff --git a/unit_tests/test_text_dumper.cc b/unit_tests/test_text_dumper.cc
new file mode 100644
index 0000000..47f819b
--- /dev/null
+++ b/unit_tests/test_text_dumper.cc
@@ -0,0 +1,115 @@
+#include <map>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/mer_dna.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::lazy_iterator lazy_iterator;
+typedef hash_counter::array::eager_iterator eager_iterator;
+typedef hash_counter::array::region_iterator region_iterator;
+typedef jellyfish::text_dumper<hash_counter::array> dumper;
+
+class hash_adder : public jellyfish::thread_exec {
+  typedef std::map<mer_dna, uint64_t> map;
+  typedef std::vector<map>            maps;
+
+  hash_counter& hash_;
+  int           nb_;
+  maps          check_;
+
+public:
+  hash_adder(hash_counter& hash, int nb, int nb_threads) :
+    hash_(hash),
+    nb_(nb),
+    check_(nb_threads)
+  { }
+  void start(int id) {
+    mer_dna m;
+    map&    my_map = check_[id];
+
+    for(int i = 0; i < nb_; ++i) {
+      m.randomize();
+      hash_.add(m, 1);
+      ++my_map[m];
+    }
+
+    hash_.done();
+  }
+
+  void maps_consolidate() {
+    maps::iterator first = check_.begin();
+    maps::const_iterator it = first;
+    for(++it; it < check_.end(); ++it)
+      for(map::const_iterator vit = it->begin(); vit != it->end(); ++vit)
+        (*first)[vit->first] += vit->second;
+  }
+
+  void hash_check() {
+    map& m = check_.front();
+    size_t id;
+    for(map::const_iterator vit = m.begin(); vit != m.end(); ++vit)
+      EXPECT_TRUE(hash_.ary()->get_key_id(vit->first, &id));
+  }
+
+  uint64_t operator[](const mer_dna& m) const {
+    map::const_iterator it = check_.front().find(m);
+    if(it == check_.front().end())
+      return 0;
+    else
+      return it->second;
+  }
+
+  size_t size() const { return check_.front().size(); }
+ };
+
+template<typename T>
+struct inc_on_destructor {
+  T* const x;
+  inc_on_destructor(T* nb) : x(nb) { }
+  ~inc_on_destructor() { ++*x; }
+  operator T() const { return *x; }
+};
+
+TEST(TextDumper, Random) {
+  static int iteration_count_ = 0;
+  ++iteration_count_;
+
+  static const int    mer_len    = 35;
+  static const int    nb_threads = 5;
+  static const int    nb         = 5000;
+  static const size_t init_size  = 5000;
+  static const char*  file       = "./text_dumper";
+  file_unlink f(file);
+
+  mer_dna::k(mer_len);
+  hash_counter hash(init_size, mer_len * 2, 5, nb_threads, 15);
+  hash_adder adder(hash, nb, nb_threads);
+  adder.exec_join(nb_threads);
+  adder.maps_consolidate();
+  adder.hash_check();
+
+  {
+    dumper d(nb_threads, file);
+    d.one_file(true);
+    d.dump(hash.ary());
+  }
+
+  std::ifstream fd(file);
+  std::string line;
+  mer_dna m;
+  uint64_t count = 0;
+  while(std::getline(fd, line)) {
+    m = line.substr(0, mer_dna::k());
+    EXPECT_EQ(adder[m], (uint64_t)atol(line.substr(mer_dna::k() + 1).c_str()));
+    ++count;
+  }
+  EXPECT_EQ(adder.size(), count);
+
+  //  unlink(file);
+}
+} // namespace {
diff --git a/unit_tests/test_token_ring.cc b/unit_tests/test_token_ring.cc
new file mode 100644
index 0000000..d77b4ea
--- /dev/null
+++ b/unit_tests/test_token_ring.cc
@@ -0,0 +1,44 @@
+#include <iostream>
+#include <sstream>
+#include <gtest/gtest.h>
+#include <jellyfish/token_ring.hpp>
+#include <jellyfish/thread_exec.hpp>
+
+namespace {
+using jellyfish::thread_exec;
+struct write_number : public thread_exec {
+  typedef jellyfish::token_ring<jellyfish::locks::pthread::cond> token_ring;
+
+  std::ostream *os_;
+  int           nb_threads_;
+  token_ring    ring;
+
+public:
+  write_number(std::ostream* os, int nb_threads) :
+    os_(os), nb_threads_(nb_threads), ring(nb_threads)
+  { }
+
+  virtual void start(int i) {
+    token_ring::token& token = ring[i];
+    for(int j = 0; j < 10; ++j) {
+      token.wait();
+      *os_ << (nb_threads_ * j + i) << "\n";
+      token.pass();
+    }
+  }
+};
+
+TEST(TokenRing, Count) {
+  static const int nb_threads = 5;
+  std::ostringstream out;
+
+  write_number write(&out, nb_threads);
+  write.exec_join(nb_threads);
+
+  std::ostringstream res;
+  for(int i = 0; i < nb_threads * 10; ++i)
+    res << i << "\n";
+
+  EXPECT_EQ(res.str(), out.str());
+}
+} // namespace {
diff --git a/unit_tests/test_whole_sequence_parser.cc b/unit_tests/test_whole_sequence_parser.cc
new file mode 100644
index 0000000..587f422
--- /dev/null
+++ b/unit_tests/test_whole_sequence_parser.cc
@@ -0,0 +1,161 @@
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <unit_tests/test_main.hpp>
+
+namespace {
+using std::string;
+using std::istringstream;
+template<typename Iterator>
+struct opened_streams {
+  Iterator begin_, end_;
+
+  opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+  std::unique_ptr<std::istream> next() {
+    std::unique_ptr<std::istream> res;
+    if(begin_ != end_) {
+      res.reset(*begin_);
+      ++begin_;
+    }
+    return res;
+  }
+};
+typedef jellyfish::whole_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+
+TEST(SequenceParser, Fasta) {
+  static const char* seq1 = "ATTACCTTGTACCTTCAGAGC";
+  static const char* seq2 = "TTCGATCCCTTGATAATTAGTCACGTTAGCT";
+  const char* file_name = "Fasta.fa";
+  file_unlink fu(file_name);
+
+  {
+    std::ofstream sequence(file_name);
+    sequence << ">header1\n"
+             << seq1 << "\n\n"
+             << ">header2\n"
+             << seq2 << "\n\n\n"
+             << seq1;
+  }
+
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+  parser_type parser(10, 1, 1, streams);
+
+  {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    ASSERT_EQ((size_t)1, j->nb_filled);
+    EXPECT_STREQ("header1", j->data[0].header.c_str());
+    EXPECT_STREQ(seq1, j->data[0].seq.c_str());
+  }
+
+  {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    ASSERT_EQ((size_t)1, j->nb_filled);
+    EXPECT_STREQ("header2", j->data[0].header.c_str());
+    EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].seq.size());
+    EXPECT_STREQ(seq2, j->data[0].seq.substr(0, strlen(seq2)).c_str());
+    EXPECT_STREQ(seq1, j->data[0].seq.substr(strlen(seq2)).c_str());
+  }
+
+  {
+    parser_type::job j(parser);
+    EXPECT_TRUE(j.is_empty());
+  }
+}
+
+TEST(SequenceParser, Fastq) {
+  static const char* seq1 = "ATTACCTTGTACCTTCAGAGC";
+  static const char* seq2 = "TTCGATCCCTTGATAATTAGTCACGTTAGCT";
+  const char* file_name = "Fasta.fq";
+  file_unlink fu(file_name);
+
+  {
+    std::ofstream sequence(file_name);
+    sequence << "@header1\n"
+             << seq1 << "\n\n"
+             << "+and some stuff\n"
+             << seq1 << "\n"
+             << "@header2\n"
+             << seq2 << "\n\n\n"
+             << seq1 << "\n"
+             << "+\n"
+             << seq1 << "\n"
+             << seq2 << "\n";
+  }
+
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+  parser_type parser(10, 1, 1, streams);
+
+  {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    ASSERT_EQ((size_t)1, j->nb_filled);
+    EXPECT_STREQ("header1", j->data[0].header.c_str());
+    EXPECT_STREQ(seq1, j->data[0].seq.c_str());
+    EXPECT_STREQ(seq1, j->data[0].qual.c_str());
+  }
+
+  {
+    parser_type::job j(parser);
+    ASSERT_FALSE(j.is_empty());
+    ASSERT_EQ((size_t)1, j->nb_filled);
+    EXPECT_STREQ("header2", j->data[0].header.c_str());
+    EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].seq.size());
+    EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].qual.size());
+    EXPECT_STREQ(seq2, j->data[0].seq.substr(0, strlen(seq2)).c_str());
+    EXPECT_STREQ(seq1, j->data[0].seq.substr(strlen(seq2)).c_str());
+    EXPECT_STREQ(seq1, j->data[0].qual.substr(0, strlen(seq1)).c_str());
+    EXPECT_STREQ(seq2, j->data[0].qual.substr(strlen(seq1)).c_str());
+  }
+
+  {
+    parser_type::job j(parser);
+    EXPECT_TRUE(j.is_empty());
+  }
+}
+
+TEST(SequenceParser, FastaMany) {
+  const char* file_name = "FastaMany.fa";
+  file_unlink fu(file_name);
+  static const int nb_sequences = 1000;
+
+  {
+    std::ofstream sequence(file_name);
+    ASSERT_TRUE(sequence.good());
+    for(int i = 0; i < nb_sequences; ++i) {
+      const int seq_len = random_bits(8) + 10;
+      sequence << ">" << i << " " << seq_len << "\n";
+      for(int j = 0; j < seq_len; ++j) {
+        sequence << (char)('A' + j % 26);
+        if(random_bits(6) == 0)
+          sequence << '\n';
+      }
+      sequence << '\n';
+    }
+  }
+
+  auto sequence = new std::ifstream(file_name);
+  opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+  parser_type parser(10, 13, 1, streams);
+  int got_sequences = 0;
+  while(true) {
+    parser_type::job job(parser);
+    if(job.is_empty())
+      break;
+    for(size_t i = 0; i < job->nb_filled; ++i) {
+      ++got_sequences;
+      const size_t len_pos = job->data[i].header.find_first_of(" ");
+      const int seq_len = atoi(job->data[i].header.c_str() + len_pos + 1);
+      ASSERT_LE(10, seq_len);
+      for(int j = 0; j < seq_len; ++j)
+        EXPECT_EQ('A' + (j % 26), job->data[i].seq[j]);
+    }
+  }
+  EXPECT_EQ(nb_sequences, got_sequences);
+}
+
+}
diff --git a/unit_tests/unit_tests.sh b/unit_tests/unit_tests.sh
index e173586..57e457b 100644
--- a/unit_tests/unit_tests.sh
+++ b/unit_tests/unit_tests.sh
@@ -3,4 +3,8 @@
 cd tests
 . ./compat.sh
 
-${DIR}/test_all
+if [ -n "$VALGRIND" ]; then
+    exec valgrind ${DIR}/test_all
+else
+    exec ${DIR}/test_all
+fi

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



More information about the debian-med-commit mailing list